24

私はこれがばかげた質問であることを知っており、以前に尋ねられたに違いないと思います. しかし、私は私の質問に対する答えを見つけることができません。

私の問題を概説するためのサンプルコード(もちろんコンパイルされません)を次に示します。

class test
{
     int[] val1;
     string val2;

     static bool somefunction(test x, test y)
     {
         dosomestuff()

         test result;

         while(result is nothing)
         {
              if(somecondition){result=new test(something);}
         }
     }
}

私が抱えている問題は次の行にあります。

while(result is nothing)

これは VB の構文であり、もちろん C# コンパイラが受け入れるものではありません。誰かが問題を解決する方法を教えてもらえますか?

4

7 に答える 7

39
  • TL;DR:

    if (Object.Equals(myVariable, default(MyVariableType)))

    • myVariableと を置き換えMyVariableTypeます。

    他の解決策があります。

if (myVariable == null)[1]は機能しませ(参照型値型   の 簡単な紹介については、以下を参照してください  。)
struct

値の型は主にstructs (例: DateTime) であり、[2]やerationsなどの単純な型が含まれます。値型は(本質的に) 値をサポートしません。intenumnull

これに対する例外と修正は、null 許容null型です。基本的に、これらは構造体型の可能な値に追加されます。Maybe<T>これらは、他の言語で知っているものと構造的に同じです[3]。のシンタックスシュガーであるValueType?(eg ) を使用してそれらを作成します。int?Nullable<ValueType>


または、null 許容型を使用する代わりに、変数をその型のデフォルト値と比較できます。
if (Object.Equals(myVariable, default(MyVariableType)))

(これは、参照型 (オブジェクト) と値型の両方で機能します。)手動で
置換する必要があることに注意してください。MyVariableType残念ながら、置換することはできません。

if (Object.Equals(myVariable, default(myVariable.GetType())))

default()型名のみを直接受け入れるためです。(コンパイル時に評価されると思います。)


一言で言えば構造体

簡単に言えば、構造体はカットダウン クラスです。継承やファイナライザーをサポートしないクラスを想像してみてください。そして、削減されたバージョンである構造体があります。構造体はクラスと同じ方法で定義され (structキーワードを使用する場合を除く)、前述の制限を除けば、構造体はフィールド、メソッド、プロパティ、演算子など、同じ豊富なメンバーを持つことができます。
[引用: http://www.albahari.com/valuevsreftypes.aspx ]

クラスは参照型です。クラス変数 (より具体的には、そのメモリ領域) には、実際のオブジェクト インスタンス データが格納されている他のメモリ領域へのポインタのみが含まれます。

値型変数にはデータが直接含まれます。これにより、キャッシュの局所性とルックアップの保存により、速度が向上する場合があります。しかし、より複雑な構造体の場合、パフォーマンスに悪影響を与える可能性もあります。



脚注:

[1] エラーすら出ません。デフォルト以外の値 (ゼロ (等価) またはゼロとs の構造体)で初期化されるため、myVariable == null常に yieldになります。このデフォルト値は で使用できます。falsemyVariablenull nulldefault(Type)

[2] 技術的には、単純型 (とを除くすべての組み込み型)構造体です。補足: 組み込みの型は、System名前空間の型のエイリアスです。stringobject

[3] 例えばHaskell で。C#Maybe<T>では組み込みではありませんが、実装できます。クラスと構造体の両方に対してNothing、より明示的/自己文書化されたバージョンとして提供されます。null

[4] [ 4] はありません。いいえ、実際に行って確認できます。

于 2012-03-15T18:47:12.303 に答える
25

探している構文は次のとおりです。

while (result == null)

result = null;また、最初から設定する必要があります

于 2009-07-28T17:45:35.440 に答える
4
while (result == null)
于 2009-07-28T17:44:22.617 に答える
3
while (result ==null )

それがあなたの言いたいことなら

于 2009-07-28T17:44:45.143 に答える
2

満足のいく答えが得られたとしても、その背後には、興味深い、または役立つと思われる何かがあります。

C# と VB.NET には違いがあります。VB.NET では、次のように記述できます。

Dim b as Boolean

C# では、次のように記述できます。

bool b;

それらは微妙に異なります。VB.NET ではb、値 false が指定されています (つまり、既に初期化されています)。C# では、b値はありません (初期化されていません)。C# は、初期化されていない変数の値を調べられないようにするために多大な努力を払っています。

したがって、変数が初期化されているかどうかをテストしていません。VB.NET には、初期化されていない変数などはありません。C# では、何かと比較するために初期化されていない変数の値を取得することはできません。

変数がnullorに初期化されているかどうかをテストしていますNothing

于 2009-07-28T18:39:53.537 に答える
1
while(result == null)

C# で何もないことに相当するのは null です。

于 2009-07-28T17:45:23.927 に答える
0
while (result == null)
于 2009-07-28T17:48:07.603 に答える