私はこれがばかげた質問であることを知っています、そして私はそれが以前に尋ねられたにちがいないと思います。しかし、私の質問に対する答えを見つけることができません。
これが私の問題の概要を説明するサンプルコード(もちろんコンパイルされません)です:
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)
willnot work[1]withvaluetypes。値型は主にstruct
s(例:DateTime
)であり、[2]単純なタイプint
、enum
erationsなど。値型は(本質的に)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
デフォルト 値(ゼロ(- 同等 )またはゼロとnull
sの構造体)。このデフォルト値は、default(Type)
で使用できます。
[2]技術的には単純型(すべて 組み込み型string
とobject
を除く) are 構造体。補足:組み込み型は、 System 名前空間の型の場合は aliases です。
[3]例: Haskellで 。 C#では_Maybe<T>
_は組み込まれていませんが、実装できます。クラスと構造体の両方に対して、Nothing
のより明示的/自己文書化バージョンとしてnull
を提供します。
[4]ありません [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)