将null转换为某些东西?
今天我和一位同事进行了这次有趣的讨论。 我们在C#中讨论两段代码。
代码片段1:
if(!reader.IsDBNull(2)) { long? variable1 = reader.GetInt64(2) }
代码片段2:
long variable1 = reader.IsDBNull(2) ? (long?) null : reader.GetInt64(2)
问题是:将null转换为可空的长度是一个好习惯吗? 或者你宁愿使用传统的if语句来避免将null
为可空的long。
表达式(type?)null
, default(type?)
和new Nullable
最终被编译成相同的操作码:
long? x = (long?)null; long? y = default(long?); long? z = new Nullable();
变成了:
IL_0001: ldloca.sx IL_0003: initobj valuetype [mscorlib]System.Nullable`1 IL_0009: ldloca.sy IL_000b: initobj valuetype [mscorlib]System.Nullable`1 IL_0011: ldloca.sz IL_0013: initobj valuetype [mscorlib]System.Nullable`1
换句话说,如果您正在使用可空类型,您可以自由使用您最喜欢的版本。 但请注意,您应该尽量避免使用可空类型的算术。 如果要从条件表达式返回可为空的值,则如果其中一个可以为null,则两个可能的结果必须是可为空的。 在这种情况下,任何其他方式都可能导致exception。
代替
(long?) null
使用
default(long?)
我会重构上面的代码
long? variable1 = reader.IsDBNull(2) ? default(long?) : reader.GetInt64(2)
我不想抛出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() : 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); } }
在这种情况下,您不使用三元运算符(没有强制转换为可空),并且从阅读器读取值看起来更漂亮:
long? variable1 = reader.GetNullableInt64(2);
在我的情况下,代码片段2是值得的,因为在null
情况下你将获得0
,这是一个完全有效的值
在C#7.1中,您可以使用更简洁的default
文字 :
上述就是C#学习教程:将null转换为某些东西?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
var variable1 = reader.IsDBNull(2) ? default : reader.GetInt64(2);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1030626.html