人の意見が気になるだけです。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;
私はこれを使用します:
long? i = 1;
...some code...
long j = i ?? 0;
つまり、iがnullの場合、0 が割り当てられます。
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;
私は常に (i==null) 形式を使用します。やっていることを表現しています。
WRT 2 番目の質問ですが、どちらの形式でも問題ないと思います。ただし、最初に null に対して常にチェックし、適切なアクションを実行します。おそらく、そのチェックとアクションをヘルパー メソッドでラップします (多くの場合、デフォルト値を設定するだけです)。
Nullable 型を実際に使用したことはありませんが、2 つ目として、実際には j.GetValueOrDefault() を使用することをお勧めします。ドキュメントは、後者が null 値の場合に InvalidOperationException を実際にスローすることを示唆しています。long? の明示的なキャスト演算子の内部実装によっては、前者もそうなる可能性があります。私は GetValueOrDefault に固執し、null/default ケースを適切に扱います。
私は両方で最初のものを使用する傾向があります。これは、ライフサイクルの後半でサポートする必要があるため、元の作成者の意図が理解しやすいように思われるためです。
リフレクターを開けました。HasValue は、値が変更されたときに設定されるブール フラグのルックアップです。したがって、サイクルに関しては、ルックアップは比較よりも高速になります。
public Nullable(T value)
{
this.value = value;
this.hasValue = true;
}
private bool hasValue;
internal T value;
public bool HasValue
{
get
{
return this.hasValue;
}
}
どちらも同じですが、言語ではより一般的であるため、両方で以前のバージョンを使用します。null との比較と型へのキャストです。
私は通常、両方のシナリオで最初のオプションに傾倒する傾向があります。これは、オブジェクト指向とは対照的に、より「プリミティブ」な指向であるためです (これは実際に私たちが目指していたものでした) が、実際にはそれほど重要ではありません。