当前位置: 首页 > 编程语言 > C#

将null转换为某物?分享

时间:2023-04-11 00:17:57 C#

将null转换成什么?我今天和一位同事进行了这个有趣的讨论。我们讨论了C#中的两段代码。代码片段1:if(!reader.IsDBNull(2)){long?variable1=reader.GetInt64(2)}代码片段2:longvariable1=reader.IsDBNull(2)?(long?)null:reader.GetInt64(2)问题是:将null转换为可空长度是一种好习惯吗?或者您可能更愿意使用传统的if语句来避免将null强制转换为可为null的long。表达式(type?)null、default(type?)和newNullable()最终编译为相同的操作码:long?x=(长?)空;长的?y=默认值(长?);长的?z=新的Nullable();变为:IL_0001:ldloca.sxIL_0003:initobjvaluetype[mscorlib]System.Nullable`1IL_0009:ldloca.syIL_000b:initobjvaluetype[mscorlib]System.Nullable`1IL_0011:ldloca.szIL_0013:initobjvaluetype[mscorlib]System。Nullable`1换句话说,如果您使用的是可空类型,则可以自由使用您喜欢的版本。但是请注意,您应该尽量避免使用可空类型进行算术运算。如果要从条件表达式返回可为null的值,则两个可能的结果都必须可为null,前提是其中一个可以为null。在这种情况下,任何其他方式都可能导致异常。而不是(long?)null使用default(long?)我会重构上面的代码long?变量1=reader.IsDBNull(2)?默认(长?):reader.GetInt64(2)我不想抛出空值(是的,我觉得很奇怪):长?变量1=reader.IsDBNull(2)?null:(long?)reader.GetInt64(2);另一种选择:长?变量1=reader.IsDBNull(2)?默认值:reader.GetInt64(2);//需要C#7.1吗?变量1=reader.IsDBNull(2)?默认(长?):reader.GetInt64(2);长的?变量1=reader.IsDBNull(2)?(long?)null:reader.GetInt64(2);长的?变量1=reader.IsDBNull(2)?新的Nullable():reader.GetInt64(2);长的?变量1=reader.IsDBNull(2)?新长?():reader.GetInt64(2);长的?变量1=reader.IsDBNull(2)?null:newlong?(reader.GetInt64(2));这只是一个品味问题。我认为第一个选项比其他选项更具可读性。更新:考虑编写一些扩展方法以使您的代码更清晰:publicstaticclassDataReaderExtensions{publicstaticlong?GetNullableInt64(thisIDataReaderreader,intindex){if(reader.IsDBNull(index))返回空值;返回reader.GetInt64(索引);在这种情况下,您不使用三元运算符(不转换为可空)并且从读取器读取值看起来更漂亮:长?variable1=reader.GetNullableInt64(2);片段2在我的例子中是值得的,因为在null的情况下你会得到0,这是一个完全有效的值在C#7.1中,你可以使用更简洁的默认文字:教程:将null转换为某物?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——varvariable1=reader.IsDBNull(2)?默认值:reader.GetInt64(2);本文收集自网络。不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: