web-dev-qa-db-ja.com

変数がC#で初期化されているかどうかを確認するにはどうすればよいですか?

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

これが私の問題の概要を説明するサンプルコード(もちろんコンパイルされません)です:

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#コンパイラが受け入れるものではありません。誰かが問題を解決する方法を教えてもらえますか?

21
niklasfi

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

while (result == null)

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

24
Colin Mackay
  • TL; DR:

    _if (Object.Equals(_myVariable_, default(_MyVariableType_)))_

    • myVariableMyVariableTypeを置き換えます。


    他の解決策があります。


if (myVariable == null) willnot work[1]withvaluetypes。値型は主にstructs(例:DateTime)であり、[2]単純なタイプintenumerationsなど。値型は(本質的に)null値をサポートしていません。

例外とこれに対する修正は nullable タイプです:本質的にこれらは構造体タイプの可能な値にnullを追加します。それらは他の言語から知っているかもしれない_Maybe<T>_と構造的に同じです[3]。 _ValueType?_のシンタックスシュガーである_int?_(例:_Nullable<ValueType>_)を使用して作成します。


または、null許容型を使用する代わりに、変数をその型のデフォルト値と比較することもできます。

_if (Object.Equals(myVariable, default(MyVariableType)))
_

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

_if (Object.Equals(myVariable, default(myVariable.GetType())))
_

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


構造体一言で言えば

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

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

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



脚注:

[1]エラーもスローしません。 _myVariable == null_は常にfalseを生成します。これは、myVariableが非nullデフォルト 値(ゼロ(- 同等 )またはゼロとnullsの構造体)。このデフォルト値は、default(Type)で使用できます。

[2]技術的には単純型(すべて 組み込み型stringobjectを除く) are 構造体。補足:組み込み型は、 System 名前空間の型の場合は aliases です。

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

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

37
Aaron Thoma
while (result == null)
4
Robert Harvey
while (result ==null )

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

3
satyajit

あなたは満足している答えを持っていますが、この背後にあなたが興味深くまたは役立つと思うかもしれない何かがあります。

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

Dim b as Boolean

そしてC#では次のように書くことができます:

bool b;

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

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

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

2
while(result == null)

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

1
Supertux
while (result == null)
0
djangofan