C#最佳实践-转换int时的最佳实践是什么?整型

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 =

我有一个可以为null的int,它来自一个存储过程,我知道这个存储过程不会有null值。我已经做了以下工作:

    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。在这里接受例外情况——当你处于意想不到的领域时,如果一切正常,继续下去是危险的。