5

今日、私は同僚とこの興味深い議論をしました。C#で2つのコードについて議論していました。

コードスニペット1:

if(!reader.IsDBNull(2))
{
  long? variable1 = reader.GetInt64(2)
}

コードスニペット2:

long variable1 = reader.IsDBNull(2) ? (long?) null : reader.GetInt64(2)

質問は次のとおりです。nullをnull許容のlongにキャストするのは良い習慣ですか?nullまたは、null許容長へのキャストを回避するために、従来のifステートメントを使用します。

4

5 に答える 5

15

(type?)nulldefault(type?)およびnew Nullable<type>()は同じオペコードにコンパイルされることになります。

        long? x = (long?)null;
        long? y = default(long?);
        long? z = new Nullable<long>();

に変わります:

    IL_0001: ldloca.s x
    IL_0003: initobj valuetype [mscorlib]System.Nullable`1<int64>
    IL_0009: ldloca.s y
    IL_000b: initobj valuetype [mscorlib]System.Nullable`1<int64>
    IL_0011: ldloca.s z
    IL_0013: initobj valuetype [mscorlib]System.Nullable`1<int64>

つまり、null許容型を使用している場合は、好きなバージョンを自由に使用できます。ただし、null許容型を使用した算術演算は避けてください。条件式からnull許容値を返したい場合、どちらか一方がnullになる可能性がある場合は、両方の可能な結果がnull可能である必要があります。その場合、他の方法で例外が発生する可能性があります。

于 2012-05-17T10:41:32.583 に答える
3

それ以外の

(long?) null

使用する

default(long?) 

上記のコードを次のようにリファクタリングします

long? variable1 = reader.IsDBNull(2) ? default(long?) : reader.GetInt64(2)
于 2012-05-17T10:30:54.123 に答える
1

私は価値をキャストしたくないnull(私には奇妙に見える):

long? variable1 = reader.IsDBNull(2) ? null : (long?)reader.GetInt64(2);

別のオプション:

long? variable1 = reader.IsDBNull(2) ? default : reader.GetInt64(2); // requires C# 7.1
long? variable1 = reader.IsDBNull(2) ? default(long?) : reader.GetInt64(2);
long? variable1 = reader.IsDBNull(2) ? (long?)null : reader.GetInt64(2);
long? variable1 = reader.IsDBNull(2) ? new Nullable<long>() : reader.GetInt64(2);
long? variable1 = reader.IsDBNull(2) ? new long?() : reader.GetInt64(2);
long? variable1 = reader.IsDBNull(2) ? null : new long?(reader.GetInt64(2));

それは好みの問題です。最初のオプションは他のオプションよりも読みやすいと思います。

更新:コードをより明確にするために、いくつかの拡張メソッドを作成することも検討してください。

public static class DataReaderExtensions
{
    public static long? GetNullableInt64(this IDataReader reader, int index)
    {
        if (reader.IsDBNull(index))
            return null;

        return reader.GetInt64(index);
    }
}

この場合、三項演算子(nu​​ll許容型へのキャストなし)を使用せず、リーダーからの値の読み取りはよりきれいに見えます。

long? variable1 = reader.GetNullableInt64(2);
于 2012-05-17T10:29:18.450 に答える
0

私の場合、Snippet 2は価値がありnullます。0これは、次の場合に完全に有効な値です。long

于 2012-05-17T10:30:27.680 に答える
0

C#7.1では、より簡潔なdefaultリテラルを使用できます。

var variable1 = reader.IsDBNull(2) ? default : reader.GetInt64(2);
于 2018-09-20T13:00:06.830 に答える