質問

.NET の null 値と変数について少し混乱しています。(VB を推奨)

オブジェクトであるか値型であるかに関係なく、指定された変数の "null" をチェックする方法はありますか?それとも、私の null チェックは、値の型をチェックしているかどうかを常に予測する必要がありますか (例:System.Integer) またはオブジェクト?

私が探しているのは、考えられるすべての種類の null 性をチェックする関数だと思います。つまり、次のような任意のタイプの変数です。

a) 宣言されてから一度も値が割り当てられていない

b) (データベースから取得した) データ オブジェクトから null 値が割り当てられている

c) null だった別の変数値と等しく設定されている

d) 一度も設定されていないか期限切れになっていない ASP.NET セッション/アプリケーション変数に設定されている。

.NET で null シナリオを処理する場合の一般的なベスト プラクティスはありますか?

アップデート: 値の型が "null" であることについて話すとき、私が実際に意味するのは、一度も設定されなかった値の型、またはある時点で null オブジェクトと等しく設定されたか、null オブジェクトからキャストされた値の型のことです。

役に立ちましたか?

解決

通常の値の型 (boolean、int、long、float、double、enum、および struct) は null 値を許容できません。

すべての値タイプのデフォルト値は 0 です。

CLR では、変数が設定されていない限り、変数にアクセスできません。これは常に当てはまるわけではないと思われるかもしれませんが、CLR が介入して初期化してくれる場合もあります。メソッド レベルでは、すべての変数を使用する前に明示的に初期化する必要があります。

さらに、他の人が指摘しているように、.net 2.0 以降、と呼ばれる新しいジェネリック型があります。 Nullable<T>. 。C# には int? のようなコンパイラの省略表現がいくつかあります。手段 Nullable<int>, 、ダブル?手段 Nullable<double>

ラッピングのみ可能です Nullable<T> null を許容できない値型ではなく、参照には既に null を設定できる機能があるため、これは問題ありません。

int? x = null;

int? の場合、null に対してテストすることもできますが、呼び出したほうが良い場合があります。 x.HasValue().

C# には次もあります。 null 許容合体演算子 ??null 許容値を null 許容値以外の値型に割り当てる場合。ただし、演​​算子がない場合は、GetValueOrDefault() を呼び出すことができます。

int y = x ?? 2; // y becomes 2 if x is null.
int z = x.GetValueOrDefault(2); // same as y

他のヒント

値の型はnullにできません。値型であることの意味に違反します。 Value TypeをNullable(Of T)としてラップすることができます。これにより、優れた一連のメソッドが提供され、何も機能しないことが確認されます。しかし、そのラッパーには多くのオーバーヘッドがあります。おそらく、あなたがやろうとしていることを明確にすることができますか?

完全を期すため、NullableラッパーのVB構文は次のとおりです。

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0'
Dim j as Integer? = Nothing '.NET 3.5'

編集:値タイプは常にデフォルト値、数値の場合は0、ブール値の場合はfalseなどに事前に初期化されます。

これはあなたが望んでいることですか?

if IsNothing(foo) OrElse IsDbNull(foo) Then
    ' Do Something Because foo Is Either Nothing or DBNull.Value
End If

実のところ、なぜこの構造を望むのかは定かではありません。 DBNULL.Valueをチェックするのは、データベースから取得した値を使用するとき、およびその値をDATA Namespaceクラスから他のクラスに割り当てる前だけです(つまり、 dim b as string = dataReader(0)]。

通常、オブジェクトがインスタンス化されていないか、インスタンスを再インスタンス化する必要がある場合は、IsNothingチェックで十分です。

.Netでは、私が知っている2種類のnull、null(VBには何もない)とDbNullのみです。 System.Nullableを使用している場合、オブジェクトの場合と同じnullチェック構文を使用できます。 null可能オブジェクトがボックス化されている場合、.Net 2.0 CLRは、これを処理する正しい方法を見つけるのに十分スマートです。

両方のタイプに遭遇した唯一のケースは、データベースデータに直接アクセスする可能性のあるアプリケーションのデータ層です。たとえば、DataTableでDbNullに遭遇しました。この状況でこれらの両方のnull型をチェックするには、(申し訳ありませんが、C#のような)拡張メソッドを記述できます。

static public bool IsNull(this object obj)
{
    return obj != null && obj != DbNull.Value;
}

...

if(dataTable[0]["MyColumn"].IsNull())
{
  //do something
}

値型変数にnullを含めることはできません。これは、nullの意味、nullは参照がどこにも指し示していないためです。 VB.netではわかりませんが、c#では<!> quot;?<!> quot;を使用して値型をnull可能にラップできます:

int? a = null;

Option Strict Onで開発している限り、(a)は問題になりません。コンパイラはあなたに怒鳴ります。パラメータのチェックが心配な場合は、使用してください

Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer)
    if param1 is nothing then
         Throw New ArgumentException("param1 cannot be null!")
    end if
    'param2 cannot be null
End Sub

(b)では、データベースインタラクションレイヤーがこれを処理する必要があります。 LINQを使用している場合、これを処理する方法があります。型付きデータセットを使用している場合は、自動生成される行に.IsMyVariableNullプロパティがあります。

(c)の場合、値の型について心配する必要はありませんが、参照型は単純なIs Nothing(またはIsNot Nothing)で確認できます。

(d)については、読み取り後に同じロジックを適用できます。受信変数をNothingに対してテストします。

ほとんどの場合、Is Nothingの簡単なチェックで十分です。データベースインタラクションレイヤーは、データ内のNULL値のスティッキーなケースを処理するのに役立ちますが、適切に処理するかどうかはユーザー次第です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top