哪个更好?使用Value属性转换为nullable类型还是检索值?

Dav*_*d W 26 .net c# nullable

一种方式比另一种方式有性能优势吗?

还有其他理由选择其中一个吗?

Joe*_*ite 39

一种方式比另一种方式有性能优势吗?

不,他们都编译成完全相同的IL.演员阵容是Value属性的语法糖.这段代码:

int? x = null;
Console.WriteLine(x.Value);
Console.WriteLine((int)x);
Run Code Online (Sandbox Code Playgroud)

编译这些IL指令,忽略nops :(你可以使用ildasm,ILSpy,DotPeek等自己测试)

// int? x = null;
ldloca.s 0
initobj valuetype [mscorlib]System.Nullable`1<int32>

// Console.WriteLine(x.Value);
ldloca.s 0
call instance !!0 [mscorlib]System.Nullable`1<int32>::get_Value()
call void [mscorlib]System.Console::WriteLine(int32)

// Console.WriteLine((int)x);
ldloca.s 0
call instance !!0 [mscorlib]System.Nullable`1<int32>::get_Value()
call void [mscorlib]System.Console::WriteLine(int32)
Run Code Online (Sandbox Code Playgroud)

还有其他理由选择其中一个吗?

我希望尽可能避免使用强制转换,因为它们总是有可能与实际类型不同步.如果我将变量更改int?byte?,那么我的所有演员都是错的 - 但如果我使用.Value,我可以根据需要随意更改变量.对我而言,硬性演员在可读性方面没有增加任何内容,但在可维护性方面确实有所成本.

  • 如果类型不再可以为空,则值也将不同步.我更喜欢铸造,因为如果事情发生变化,我会确切地知道哪里可能存在问题. (5认同)
  • @Telavian 如果类型不再可为空,那么 `.Value` 是否也无法编译?因此,无论哪种方式,无论是否强制转换,您都必须解决一些语义问题。 (2认同)

hun*_*ter 9

一种方式比另一种方式有性能优势吗?

表现可以忽略不计

还有其他理由选择其中一个吗?

可读性?


// most readable
public int GetValue(int? value)
{
    return value.GetValueOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
// less readable
public int GetValue(int? value)
{
    return value ?? default(int);
}
Run Code Online (Sandbox Code Playgroud)
// least readable
public int GetValue(int? value)
{
    return value.HasValue ? value.Value : default(int);
}
Run Code Online (Sandbox Code Playgroud)
//least readable reversed return type/param type
public int? GetValue(int value)
{
    return value == 0 ? null : (int?)value;
}
Run Code Online (Sandbox Code Playgroud)

  • 我将GetValueOrDefault()放在readabililty列表的顶部 (4认同)