変数が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#コンパイラが受け入れるものではありません。誰かが問題を解決する方法を教えてもらえますか?
解決
あなたが探している構文は次のとおりです。
while (result == null)
また、設定する必要があります result = null;
最初に
他のヒント
tl; dr:
if (Object.Equals(
myVariable
, default(
MyVariableType
)))
- 交換
myVariable
とMyVariableType
.
他の解決策があります。- 交換
if (myVariable == null)
意思 うまくいかない[1] と 価値 種類. 。値タイプは主にです struct
s(例 DateTime
)、 含む[2] シンプルなタイプ お気に入り int
, 、 と enum
エラー。値タイプはサポートしません null
値(本質的に)。
例外とこれへの修正はです nullable タイプ:本質的にこれらが追加されます null
structタイプの可能な値に。それらは構造的に同じです Maybe<T>
あなたは他の言語から知っているかもしれません[3]. 。それらを作成します ValueType?
(例えば int?
)これは構文砂糖です Nullable<ValueType>
.
または、Nullableタイプを使用する代わりに、変数をそのタイプのデフォルト値と比較できます。
if (Object.Equals(myVariable, default(MyVariableType)))
(これは、参照タイプ(オブジェクト)と値タイプの両方で機能します。)
交換する必要があることに注意してください MyVariableType
手動で - 残念ながらできます いいえ 行う
if (Object.Equals(myVariable, default(myVariable.GetType())))
なぜなら default()
タイプ名のみを直接受け入れます。 (コンパイル時に評価すると思います。)
構造体 手短に
簡単に言えば、構造体はカットダウンクラスです。継承やファイナライザーをサポートしないクラスを想像してください。カットダウンバージョン:structがあります。構造体はクラスと同じ方法で定義されます(
struct
キーワード)、および説明された制限とは別に、構造体は、フィールド、メソッド、プロパティ、オペレーターを含む同じリッチメンバーを持つことができます。
引用: http://www.albahari.com/valuevsreftypes.aspx ]
クラスはそうです 参照タイプ: :クラス変数(より具体的には、そのメモリ領域)には、実際のオブジェクトインスタンスデータが保存されている他のメモリ領域へのポインターのみが含まれています。
値タイプ 変数にはデータが直接含まれます。これにより、速度が生じる可能性があります ローカリティをキャッシュします ルックアップを保存します。しかし、それはまた、より複雑な構造体の場合のパフォーマンスに有害な場合があります。
脚注:
1]エラーさえ投げません。 myVariable == null
常に降伏します false
, 、あなたのからです myVariable
非非で初期化されますnull
デフォルト 値(ゼロ(同等)またはゼロの構造体と null
s)。このデフォルト値はで利用可能です default(Type)
.
2]技術的には単純なタイプ(すべて 組み込みタイプ を除外する string
と object
) それは 構造体。サイドノート:組み込みタイプは次のとおりです エイリアス からのタイプの場合 システム 名前空間。
3]例 Haskellで. 。 C#で Maybe<T>
組み込まれていませんが、実装できます。それは提供します Nothing
より明示的/自己文書化されたバージョンとして null
クラスと構造体の両方。
4] noはありません [4]. 。いいえ、実際には、チェックすることができます。
while (result == null)
while (result ==null )
それがあなたの意味であるなら
あなたはあなたが満足している答えを持っていますが、この背後に何かがありますあなたは興味深いまたは役立つと思うかもしれません。
C#とVB.NETには違いがあります。 VB.NETでは、次のことを書くことができます。
Dim b as Boolean
そしてC#で書くことができます:
bool b;
それらは微妙に異なります。 vb.netで、 b
値にfalseが与えられています(言い換えれば、すでに初期化されています)。 C#で、 b
価値はありません(それは無知です)。 C#は、初期化されたことのない変数の値を調べることができないことを確認するために多くの努力を払っています。
したがって、変数が初期化されているかどうかをテストしていません。 VB.NETには、非初期化された変数のようなものはありません。 C#では、それを何かと比較するために、非初期化された変数の値を取得することは不可能です。
変数が初期化されているかどうかをテストしています null
また Nothing
.
while(result == null)
C#の何もないのはnullです。
while (result == null)