0

カスタム クラスを使用する場合、int を受け取るスイッチがあります。次に、switch は、num を持つケースと持たないケースがあるクラスを埋めます。int は、アプリケーション内の事実上どこにでも配置できますが、場合によっては int を持たないことがあります。newClass が表示されるとき、ユーザーは番号がないものを確認する必要があります。以下のコードは正常に動作しますが、次の警告を削除する必要があります: 「値の型newClass.numを null と比較した結果はtrue" であり、ステートメントの偽の部分については "到達不能なコードが検出されました"。

クラスの nullReferenced 部分をテストするために使用できる方法またはベスト プラクティスはありますか? このタイプの状況は何と呼ばれますか (つまり、null を許容しない参照、nullReference テスト) (...何を検索すればよいかわからないため)?

using system.generic;
using system.generic.collections;

public Class newClass{
    string name;
    int num;
    public newClass(int index){
        switch(index){
            case 1:
                num = 20;
                name = "returns true";
                break;
            case 2:
                // no num here
                name = "returns false";
            default :
                break;
        }
    }
}
public otherClass{
    newClass foo = new newClass(1);
    newClass bar = new newClass(2);

    List<newClass> newClassList = new List<newClass>();
    newClassList.add(foo);
    newClassList.add(bar);

    foreach(newClass nc in newClassList){
        if(nc.num != null){
            print("True");
        } else {
            print("False");
        }
    }
}
4

2 に答える 2

2

値は、C# の値型である として定義されるため、intnull 許容ではありません。int?、つまり null 許容整数にすることで、警告を削除できます。または、シナリオで0可能な値でない場合はnum、条件を次のように変更します。

// default(int) will be 0, the default value for a C# int
if(nc.num != default(int)){
    print("True");
} else {
    print("False");
}
于 2016-07-14T20:18:59.417 に答える
0

null 可能であることを除いて、null で変数をチェックすることはできません (文字列のように)

そう: 1) 変更: int num; 次のようになります: int? 番号;

2) 他を削除

foreach (newClass nc in newClassList)
    {
        if (nc.num != null) //warning will disappear because   num is nullable
        {
            print("True");
        }
        print("False");

    }

コンパイル エラーを回避するためにコードを修正しました

using System.Collections.Generic;
public class newClass
{
public string name;
public int? num;
public newClass(int index)
{
    switch (index)
    {
        case 1:
            num = 20;
            name = "returns true";
            break;
        case 2:
            // no num here
            name = "returns false";
            break;
        default:
            break;
    }
}
}
public class otherClass
{
newClass foo = new newClass(1);
newClass bar = new newClass(2);

List<newClass> newClassList = new List<newClass>();
public otherClass()
{
    newClassList.Add(foo);
    newClassList.Add(bar);

    foreach (newClass nc in newClassList)
    {
        if (nc.num != null)
        {
            print("True");
        }
        print("False");

    }
}

private void print(string msg)
{
    throw new System.NotImplementedException();
}
}
于 2016-07-14T22:21:01.977 に答える