6

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

オブジェクトか値型かに関係なく、特定の変数の「nullness」をチェックする方法はありますか? または、null チェックは、値の型 (System.Integer など) をチェックしているのか、オブジェクトをチェックしているのかを常に予測する必要がありますか?

私が探しているのは、考えられるすべての種類のヌル性をチェックする関数だと思います。つまり、

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

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

c) null である別の変数値に等しく設定された

d) 設定されていない、または有効期限が切れていない ASP.NET セッション/アプリケーション変数に設定された。

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

更新:値の型が「null」であることについて話すとき、私が実際に意味するのは、値の型が設定されていないか、ある時点で null オブジェクトに等しいかキャストされた値の型です。

4

6 に答える 6

4

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

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

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

編集: 値の型は、常に既定値、数値の場合は 0、ブール値の場合は false などに事前に初期化されます。

于 2008-10-02T21:34:05.967 に答える
2

これはあなたが求めているものですか?

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

実際のところ、なぜこの構造が必要なのかはよくわかりません。DBNULL.Value をチェックするのは、データベースから取得した値を使用しているときだけで、その値を DATA 名前空間クラスから他のクラスに割り当てる前です [つまり、dim b as string = dataReader(0) ]。

通常、オブジェクトがインスタンス化されていない、または再インスタンス化する必要があることに懸念がある場合は、IsNothing チェックだけで十分です。

于 2008-10-02T21:40:02.677 に答える
2

通常の値の型 (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
于 2008-10-03T00:12:38.580 に答える
1

.Net では、私が認識している 2 種類の null、null (VB では何もない) と DbNull のみです。System.Nullable を使用している場合は、オブジェクトの場合と同じ null チェック構文を使用できます。nullableオブジェクトがボックス化されている場合、.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
}
于 2008-10-02T21:47:24.017 に答える
0

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 値のスティッキーなケースを処理するのに役立ちますが、それらを適切に処理するのはユーザー次第です。

于 2008-10-02T21:49:15.367 に答える
0

値型の変数に null を含めることはできません。これは、null が意味するものは null であり、参照がどこも指していないことを意味するためです。VB.net ではわかりませんが、C# では、次のように、"?" を使用して値の型を nullable にラップできます。

int? a = null;
于 2008-10-02T21:35:20.177 に答える