web-dev-qa-db-ja.com

C#でnull許容型を使用する必要があるのはいつですか?

多くのインタビューで次のような質問を繰り返し受けてきましたが、それでも簡単な例では説明できません。

  1. C#のnull許容型とは何ですか?
  2. C#でnull許容型を使用する必要があるのはいつですか?
  3. 簡単な例を挙げていただけますか?

助言がありますか?

35
ACP

From NullableTypesの使用(C#プログラミングガイド) (リンクが更新されました 2018年頃

Null許容型を使用する場合の例として、通常のブール変数がtrueとfalseの2つの値を持つ方法を検討してください。 「未定義」を意味する値はありません。多くのプログラミングアプリケーション、特にデータベースの相互作用では、変数は未定義の状態で存在する可能性があります。たとえば、データベースのフィールドにはtrueまたはfalseの値が含まれている場合がありますが、値がまったく含まれていない場合もあります。同様に、参照型をnullに設定して、初期化されていないことを示すことができます。

34
Adriaan Stander

Nullは、「値なし」または「データなし」を意味します。 「値なし」が、設計/使用しているシステムのコンテキストで有効な値である場合は、null許容型を使用します。

int? weightOfCargo = TryGetTruckCargoWeight()

この場合、null許容型は、TryGetTruckCargoWeight()がnullを返す可能性があることを示します。これの意味は、一般的に、データが利用できないことです(トラックがない、計量されていないなど)。

20
Sander

次の例を検討してください。

ツールには、UIを介して指定された設定があります。ただし、ツールはコマンドラインから実行することもでき、UIで指定された設定はコマンドラインから上書きできます。したがって、コードは次のとおりです。

bool? setting1;

...コマンドラインを処理します。設定が指定されている場合は、次のようにします。

setting1.Value = setting;

...後で

if(setting1.HasValue)
  ui.setting1 = setting1.Value
9
logicnp

指定された値を使用してNULL値を表す場合は常に、次のようになります。
*何の値も表さないDateTimeの最小値
*-1は整数の未設定値を表します
次に、null許容型の方が適しています。

4
Kb.

ご存知のとおり、C#には2つの異なるタイプがあります

•参照タイプ
•値型
参照型は存在しない値(NULL)として表すことができますが、Vaue型はNULL値を表すことはできません。
例:

文字列は参照型なので、nullとして宣言できます

 String s=null;  //ok

ただし、Int32などの値型をnullに宣言しようとすると、コンパイラエラーが発生します

Int32 i=null;    // compiler error

値型でnullを表すには、null許容型と呼ばれる特別な構造を使用する必要があります。 ?を使用して表されますシンボル。

Int32? I=null; //now its ok

Null許容型が同時に使用されるシナリオは、calssがnull許容列を持つテーブルにマップされるデータベースプログラミングです。
•列が(メールアドレスや顧客の住所)などの文字列である参照型の場合、C#でnullとして定義できるため、問題はありません。
•ただし、列が(顧客アカウントの残高)のように2倍の値型である場合、null許容型を使用せずにC#にマップすることはできません。
例:
//データベースのCustomerテーブルにマップします


public class Customer
{
  ...
  public decimal? AccountBalance;
}
4
vijay shiyani

もう1つの例:

想像してみてください。BLLにGetArticlesメソッドを作成する必要があります。このメソッドは、日付期間(fromおよびto引数)、検索文字列(search引数)、ドキュメントカテゴリ(categoryId引数)などの引数を取る必要があります。これらの引数はすべてオプションです。したがって、ある場合にはfromsearch引数のみを定義し、他の場合にはcategoryId引数のみを定義します。

これを行うには、必要な引数の組み合わせを使用して、GetArticlesメソッドに多くのオーバーロードを作成できます。もう1つの方法は、このための唯一のメソッドGetArticles(DateTime? from, DateTime? to, string search, int? categoryId)を定義することです。この場合、引数がnullの場合、スキップされます。

当然のことながら、.NET 4.0の新機能 オプションのパラメーターと名前付き引数 について知っていますが、これ以前は、それは私にとって素晴らしい回避策でした。

3
Alex

C#には2種類のデータ型があります。値型と参照型。文字列は参照型で、intは値型です。参照型には、string s = null;のようなnull値を割り当てることができます。ただし、null値を整数に直接割り当てることはできません。 int a = null //のように、値型がnull値を受け入れるようにするには、null許容型が使用されます。 null許容にするために、?がに追加されています

? a = null;//ok.
2
Shetty

データベーステーブルにnull可能な列が含まれていて、DbエンティティマッピングとしてDTO(データ転送オブジェクト)を作成する必要がある場合の実際のシナリオについて説明すると思います。このようなシナリオでは、エンティティクラスでまったく同じデータ型マッピングを取得する必要があります。このような要件を達成するには、null許容型を使用して、まったく同じマッピングを作成し、ユーザーがこのシナリオで簡単に作業できるようにすることが非常に役立ちます。

よろしく。

1
Shoaib Shaikh
// to replace   
// if(foo.Id > 0)
if(foo.Id.HasValue)
{
    Update(foo);
}
else
{
    Insert(foo);
}
1
Mike Koder