delegateを勉強している間、isは実際には-の抽象クラスです Delegate.cs
、理解できない次のメソッドを見ました
?
を使用する理由は、既に参照(クラス)型であるにもかかわらずです。?[]?
パラメータの意味説明してもらえますか?
public static Delegate? Combine(params Delegate?[]? delegates)
{
if (delegates == null || delegates.Length == 0)
return null;
Delegate? d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
params Delegate?[] delegates
-これはnull許容の配列Delegate
です
params Delegate?[]? delegates
-配列全体をnullにすることができます
各パラメータはDelegate?
型であり、Delegate?[]?
配列のインデックスを返すため、戻り値の型はDelegate?
であることが理にかなっています。そうでない場合、コンパイラは次のようにエラーを返します。文字列を返すメソッドからの再起動とint
でした。
たとえば、次のようにDelegate
型を返すようにコードを変更できます。
public static Delegate Combine(params Delegate?[]? delegates)
{
Delegate defaulDelegate = // someDelegate here
if (delegates == null || delegates.Length == 0)
return defaulDelegate;
Delegate d = delegates[0] ?? defaulDelegate;
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
Nullable Reference Types はC#8.0の新機能で、以前は存在しませんでした。
それはドキュメントの問題であり、コンパイル時の警告がどのように生成されるかです。
「オブジェクトがオブジェクトのインスタンスに設定されていない」という例外は、ごく一般的なものです。しかし、これはランタイム例外であり、コンパイル時にすでに部分的に検出されている可能性があります。
規制のためにDelegate d
いつでも電話できます
d.Invoke();
つまり、コードを記述できます。コンパイル時には何も起こりません。実行時に例外が発生する場合があります。
新しいDelegate? p
このコード
p.Invoke();
コンパイラ警告を生成します。 CS8602: Dereference of a possibly null reference
あなたが書いていない限り:
p?.Invoke();
つまり、nullでない場合にのみ呼び出します。
したがって、変数にnullが含まれる場合と含まれない場合があります。以前に警告を発し、nullの複数のテストを回避できます。 intとintの場合と同じです。確かに、1つはnullではなく、1つをもう1つに変換する方法を知っています。
C#8では、参照型をnull可能として明示的にマークする必要があります。
デフォルトでは、これらの型にはnullを含めることができません。これは、値型に似ています。これによって内部の動作が変わることはありませんが、型チェッカーでは手動で行う必要があります。
与えられたコードはC#8で動作するようにリファクタリングされていますが、この新機能のメリットはありません。
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;
}
この機能を利用した更新されたコード(機能せず、単なるアイデア)の例を次に示します。ヌルチェックから私たちを救い、この方法を少し簡略化しました。
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;
}