Trong C # 8, người ta nên đánh dấu rõ ràng các loại tham chiếu là nullable.
Theo mặc định, các loại đó không thể chứa null, tương tự như các loại giá trị. Mặc dù điều này không thay đổi cách mọi thứ hoạt động dưới mui xe, trình kiểm tra loại sẽ yêu cầu bạn thực hiện việc này một cách thủ công.
Mã đã cho được tái cấu trúc để hoạt động với C # 8, nhưng nó không được hưởng lợi từ tính năng mới này.
public static Delegate? Combine(params Delegate?[]? delegates)
{
// ...[]? delegates - is not null-safe, so check for null and emptiness
if (delegates == null || delegates.Length == 0)
return null;
// Delegate? d - is not null-safe too
Delegate? d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
Dưới đây là một ví dụ về mã được cập nhật (không hoạt động, chỉ là một ý tưởng) tận dụng tính năng này. Nó đã cứu chúng tôi khỏi kiểm tra null và đơn giản hóa phương pháp này một chút.
public static Delegate? Combine(params Delegate[] delegates)
{
// `...[] delegates` - is null-safe, so just check if array is empty
if (delegates.Length == 0) return null;
// `d` - is null-safe too, since we know for sure `delegates` is both not null and not empty
Delegate d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
// then here is a problem if `Combine` returns nullable
// probably, we can add some null-checks here OR mark `d` as nullable
d = Combine(d, delegates[i]);
return d;
}