9

人の意見が気になるだけです。C# で null 許容型を使用する場合、null をテストするベスト プラクティスの方法は次のとおりです。

bool isNull = (i == null);

また

bool isNull = !i.HasValue;

また、null 以外の型に代入する場合は次のようになります。

long? i = 1;
long j = (long)i;

より良い:

long? i = 1;
long j = i.Value;
4

8 に答える 8

15

私はこれを使用します:

long? i = 1;
...some code...
long j = i ?? 0;

つまり、inullの場合、0 が割り当てられます。

于 2008-11-03T18:23:49.403 に答える
12

C#チームによって特別に実装されたフォームを使用してください。反対する人がいたら、アンダースが大丈夫だと言ったと伝えてください。

さりげなく言っているのは、優れたプログラミングエクスペリエンスを提供するために、null許容型をc#に統合するために多くの作業が行われたということです。

パフォーマンスの観点から、両方のフォームが同じILにコンパイルされることに注意してください。

int? i = 1;
bool isINull = i == null;
int j = (int)i;

C#コンパイラがそれに到達した後、次のようになります。

int? i = 1;
bool isINull = !i.HasValue;
int j = i.Value;
于 2008-11-03T19:09:58.093 に答える
8

私は常に (i==null) 形式を使用します。やっていることを表現しています。

WRT 2 番目の質問ですが、どちらの形式でも問題ないと思います。ただし、最初に null に対して常にチェックし、適切なアクションを実行します。おそらく、そのチェックとアクションをヘルパー メソッドでラップします (多くの場合、デフォルト値を設定するだけです)。

于 2008-11-03T18:22:07.410 に答える
4

Nullable 型を実際に使用したことはありませんが、2 つ目として、実際には j.GetValueOrDefault() を使用することをお勧めします。ドキュメントは、後者が null 値の場合に InvalidOperationException を実際にスローすることを示唆しています。long? の明示的なキャスト演算子の内部実装によっては、前者もそうなる可能性があります。私は GetValueOrDefault に固執し、null/default ケースを適切に扱います。

于 2008-11-03T18:25:35.077 に答える
1

私は両方で最初のものを使用する傾向があります。これは、ライフサイクルの後半でサポートする必要があるため、元の作成者の意図が理解しやすいように思われるためです。

于 2008-11-03T19:46:41.123 に答える
1

リフレクターを開けました。HasValue は、値が変更されたときに設定されるブール フラグのルックアップです。したがって、サイクルに関しては、ルックアップは比較よりも高速になります。

public Nullable(T value)
{
    this.value = value;
    this.hasValue = true;
}

private bool hasValue;

internal T value;

public bool HasValue
{
    get
    {
        return this.hasValue;
    }
}
于 2008-11-03T20:08:51.390 に答える
0

どちらも同じですが、言語ではより一般的であるため、両方で以前のバージョンを使用します。null との比較と型へのキャストです。

于 2008-11-03T18:22:47.893 に答える
0

私は通常、両方のシナリオで最初のオプションに傾倒する傾向があります。これは、オブジェクト指向とは対照的に、より「プリミティブ」な指向であるためです (これは実際に私たちが目指していたものでした) が、実際にはそれほど重要ではありません。

于 2008-11-03T18:23:15.690 に答える