web-dev-qa-db-ja.com

?[]とは何ですか? C#の構文?

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;
}
85
snr

ステップバイステップの説明:

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;
}
66

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つに変換する方法を知っています。

25
Holger

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;
}
5
amankkg