6

同僚と会話をしていると、ヌルの話題が出てきました。彼は、舞台裏の.NETではそれは本当に少数であると私に言っていました。オブジェクトにはヒープ上のメモリへのポインタがないだけだといつも思っていましたが、どちらの方法でもわかりませんでした。

だから私はコミュニティが私たちのためにそれを片付けることができることを望んでいます;P

4

4 に答える 4

16

0です。

ECMA-335仕様のldnullからの切り取り:

ldnullは冗長であると思われるかもしれません。代わりにldc.i4.0またはldc.i8.0を使用してみませんか?答えは、ldnullはサイズに依存しないnullを提供するということです。これは、存在しないldc.i命令に類似しています。ただし、CILにldc.i命令が含まれている場合でも、型の追跡が容易になるため、検証アルゴリズムがldnull命令を保持することにはメリットがあります。

于 2008-12-29T22:51:53.883 に答える
7

null 許容型のインスタンスが null に設定されている場合、その基になる値はゼロです。

より具体的には、null 許容型は、基になる型の値をブール型の null インジケーターと組み合わせた構造です。null 許容型のインスタンスには、 bool 型のHasValueと、null 許容型の基になる型のValueという 2 つのパブリックな読み取り専用プロパティがあります。

HasValueは、null 以外のインスタンスの場合は true、null インスタンスの場合は false です。

したがって、HasValueが true の場合、Valueプロパティは含まれている値を返します。HasValueが false の場合、Value プロパティにアクセスしようとすると例外がスローされます。しかし、アクセスできれば、ゼロが含まれていることがわかります。

于 2008-12-30T00:01:11.700 に答える
0

私の経験から、私Nothingはうまくいくと信じています、そしてそうなるでしょうDBNull.Value

于 2008-12-29T22:49:38.693 に答える
-2

MSDNから:

null キーワードは、オブジェクトを参照しない null 参照を表すリテラルです。

古いバージョンの c# でもう少し明確にするために、値の型を null にすることはできませんでした。つまり、値を持たなければなりませんでした。値を割り当てなかった場合、ランダムな値になる可能性があるため、次のようになります。 :

int i;
i++;
console.writeline(i);

C# の古いバージョンでは、オブジェクトを初期化する必要がありました。それ以外の場合は null でした。つまり、オブジェクトへの参照がありませんでした。

C# 2.0+ の null 許容値型を使用すると、null 許容 int を持つことができます。これは、次のコードがある場合を意味します。

int? i;
i++;
console.writeline(i);

i は null 以外に初期化されたことがないため、実際には i++ で例外が発生します。null が 0 の場合、このコードは 0+1 と評価されるだけなので正常に実行されますが、これは正しくない動作です。

null が常に 0 で、null 許容 int があり、次のようなコードを記述した場合:

int? i;
if (int == 0)
{
//do something
}

int が null であることと int が明示的に 0 に設定されていることをコンパイラが区別する方法がないため、null が 0 と同じ場合に予期しない動作が発生する可能性が非常に高いです。

私の頭の中で物事を明確にする別の例:

public int? AddNumbers(int? x, int? y)
{
    if (x == null || y == null)
        return null;
    if (x == 0)
        return y;
    if (y == 0)
        return x;

    return x + y;
}

この例では、null と 0 が大きく異なることは明らかです。なぜなら、x または y に 0 を渡し、null が 0 に等しい場合、上記のコードは x == 0 または y のチェックに到達しないからです。 == 0 ですが、コードを実行して x または y に 0 を渡すと、チェックが実行されます。

于 2008-12-29T23:15:53.773 に答える