C#最佳实践-转换int时的最佳实践是什么?整型
我有一个可以为null的int,它来自一个存储过程,我知道这个存储过程不会有null值。我已经做了以下工作:C#最佳实践-转换int时的最佳实践是什么?整型,c#,stored-procedures,repository,nullable,C#,Stored Procedures,Repository,Nullable,我有一个可以为null的int,它来自一个存储过程,我知道这个存储过程不会有null值。我已经做了以下工作: public List<EngineerDetails> GetCarouselEngineerDetailsList(int customerID) { using (var db = new MainEntities80()) { var foo0= db.procedure().Select(s =
public List<EngineerDetails> GetCarouselEngineerDetailsList(int customerID)
{
using (var db = new MainEntities80())
{
var foo0= db.procedure().Select(s => new fooo()
{
foo= s.foo,
foo2 = s.foo2,
foo3 = s.foo3 ,
foo4 = s.foo4 ,
x = s.CurrentJobId.Value
}).ToList();
return foo0;
}
}
public List GetCarouselEngineerDetailsList(int customerID)
{
使用(var db=new maintenties80())
{
var foo0=db.procedure()。选择(s=>new fooo()
{
foo=s.foo,
foo2=s.foo2,
foo3=s.foo3,
foo4=s.foo4,
x=s.CurrentJobId.Value
}).ToList();
返回foo0;
}
}
但我想知道,尽管我知道价值永远存在。在获取值之前进行检查是否是一种良好的做法。也许带着一种变化无常的表情。
或者,因为我们知道如果忘记检查,它将不会为null?如果
s.CurrentJobId
实际上为null,则将抛出InvalidOperationException
。对于“世界不是我所期望的样子”的情况,这几乎总是最好的结果,因此完全按照原样使用代码是有意义的。如果s.CurrentJobId
实际上为空,则会抛出无效操作异常。对于“世界不是我所期望的样子”的情况,这几乎总是最好的结果,因此完全按照原样使用代码是有意义的。您可以使用CurrentJobID=s.CurrentJobID.GetValueOrDefault()
如果遇到NULL,则将为基础类型生成默认值,对于数字,默认值始终为0
或者,如果您希望使用诸如-1之类的“异常”值,则可以使用CurrentJobID=s.CurrentJobID.GetValueOrDefault(-1)
您可以使用CurrentJobID=s.CurrentJobID.GetValueOrDefault()
如果遇到NULL,则将为基础类型生成默认值,对于数字,默认值始终为0
或者,如果您希望使用诸如-1之类的“异常”值,则可以使用CurrentJobID=s.CurrentJobID.GetValueOrDefault(-1)
这样做:
int result = s.CurrentJobId?? Int32.MinValue;
这将确保将x的值分配给result,但如果s.CurrentJobId为null,则会将Int32.MinValue分配给它
它将防止抛出异常,之后您可以通过检查Int32.MinValue来验证它是否为null
但是,如果该值确实不应为null,则抛出异常并快速失败是更好的选择。您可以这样做:
int result = s.CurrentJobId?? Int32.MinValue;
这将确保将x的值分配给result,但如果s.CurrentJobId为null,则会将Int32.MinValue分配给它
它将防止抛出异常,之后您可以通过检查Int32.MinValue来验证它是否为null
但是,如果值确实不应该为null,那么抛出异常并快速失败是一个更好的选择。如果它永远不能为null,那么为什么它是一个可为null的int
?@TimSchmelter:我可以想出一些理由来解释它的意义——例如,它可能不是所有行都为null,但是如果s
是查询的结果,那么非空检查可能已经在那里执行了。@Oliver:你的代码没有意义。为什么仍然使用int?
而不是将值赋给int
变量。否则,所有的代码都必须知道它是一个可空的,实际上永远不能为空。@TimSchmelter我更新了它,为您提供了更多的上下文。很抱歉没有让它更清楚。如果它永远不能为空,为什么它是一个可空的int
,并非所有行都是非空的,但如果查询的结果是s
,则可能已经在那里执行了非空检查。@Oliver:您的代码没有意义。为什么仍然使用int?
而不是将值赋给int
变量。否则,所有的代码都必须知道它是一个可空的,实际上永远不能为空。@TimSchmelter我更新了它,为您提供了更多的上下文。很抱歉,没有让它更清楚。当世界与OP期望的不一样时,它将以0的值悄悄结束。代码将继续,很可能会用无效数据覆盖有效数据。这就像在编写了剩余的代码并期望转换有效时,使用as
而不是cast。在这里拥抱例外——当你处于意外的领域时,如果一切正常,那么继续下去是很危险的。当世界不象OP预期的那样时,这将以0的值悄悄结束。代码将继续,很可能会用无效数据覆盖有效数据。这就像在编写了剩余的代码并期望转换有效时,使用as
而不是cast。在这里接受例外情况——当你处于意想不到的领域时,如果一切正常,继续下去是危险的。