یک نکتهی تکمیلی: متدهای الحاقی خود را به ویژگیهای Nullable مزین کنید!
فرض کنید قصد دارید یک متد الحاقی را برای متد معروف string.IsNullOrWhiteSpace تهیه کنید. روش متداول آن به صورت زیر است:
public static bool IsNullOrWhiteSpace(this string str) => string.IsNullOrWhiteSpace(str);
این روش تعریف، دو نقصیهی ریز را بههمراه دارد:
الف) اگر در پروژهای حالت nullable reference types فعال باشد (که در تمام پروژههای جدید، به صورت پیشفرض فعال است) و بخواهیم به این متد الحاقی، یک مقدار نال را ارسال کنیم، با یک اخطار کامپایلر مواجه میشویم که ... این متد، نال را نمیپذیرد که پیشتر با فعال نبودن گزینه nullable reference types، بدون دریافت اخطاری، میشد نال را هم به این متد ارسال کرد. بنابراین بهتر است پارامتر ورودی آنرا به صورت string? str تعریف کنیم.
ب) اگر از متد اصلی string.IsNullOrWhiteSpace در شرطی استفاده کنیم، پس از استفادهی از آن، در سطرهای بعدی کامپایلر تشخیص میدهد که رشتهی بررسی شده، نال بوده یا خیر. اما ... متد الحاقی فوق چنین قابلیتی را به همراه ندارد. برای رفع آن باید به صورت زیر عمل کرد:
public static bool IsNullOrWhiteSpace([NotNullWhen(returnValue: false)] this string? str) => string.IsNullOrWhiteSpace(str);
با استفاده از ویژگی NotNullWhen به کامپایلر اعلام میکنیم که اگر خروجی این متد false بود، مقدار str نال نخواهد بود. اکنون این متد الحاقی جدید، با نمونهی اصلی، رفتار هماهنگی را داشته و قادر است کامپایلر را در سطرهای بعدی، در مورد نال نبودن رشتهی دریافتی، راهنمایی کند.