C# 可空值类型
如果一个值类型被声明为可为null,我应该如何对此采取预防措施?即,如果在构造函数中,我有:C# 可空值类型,c#,.net,nullable,value-type,C#,.net,Nullable,Value Type,如果一个值类型被声明为可为null,我应该如何对此采取预防措施?即,如果在构造函数中,我有: public Point3 ( Point3 source ) { this.X = source.X; this.Y = source.Y; this.Z = source.Z; } 如果源为空,它会失败吗?如果是值类型,我看不出点3为空的可能性。你没有漏掉一个问号吗?如果您的真正意思是Point3?,那么您应该像以下那样访问它: public Point3 ( Point3
public Point3 ( Point3 source )
{
this.X = source.X;
this.Y = source.Y;
this.Z = source.Z;
}
如果源为空,它会失败吗?如果是值类型,我看不出
点3
为空的可能性。你没有漏掉一个问号吗?如果您的真正意思是Point3?
,那么您应该像以下那样访问它:
public Point3 ( Point3? source )
{
this.X = source.Value.X;
this.Y = source.Value.Y;
this.Z = source.Value.Z;
}
在这种情况下,Value
属性将抛出一个异常,如果它是null
是,如果source
为null,该异常将失败
如果source
为空,您必须决定正确的行为应该是什么。您可以抛出一个异常
public Point3 ( Point3? source )
{
if (source == null)
{
throw new ArgumentNullException("source");
}
this.X = source.Value.X;
this.Y = source.Value.Y;
this.Z = source.Value.Z;
}
或者,如果您不想接受源
的null
值,只需保留示例中的方法即可。该方法不接受可为空的null
,因此在这种情况下,您不必担心它是null
。此方法的调用方将无法传入可为空的点,因为该方法采用的是常规点,而不是可为空的点。因此,您不必担心构造函数代码中的点为空。如果源代码是点3?
它就不是点3
。据我所知,它在编译时会失败。要发送点3?
您必须使用.Value
,如果它为null,我相信它会引发异常。Nullable没有属性X、Y、Z。。。您应该使用cast或Value属性…很抱歉,我不知道该类型必须写入为null。我认为任何值类型都可以这样声明。不,值类型不能为null。可空类型是.NET2.0中添加的一项功能,用于填补值类型的这一空白。您必须显式使用可为null的变量才能将其设置为null。谢谢。所以我必须有一个像上面一样的构造函数,让用户能够将Point3声明为可空的,对吗?我可以同时包含值类型的可空构造函数和常规构造函数吗?不,它与值类型无关。任何值类型都可以通过添加问号声明为可空。事实上,可为null的类型实际上是可为null的,而不是T。我想我得读一下。我认为,如果开发人员提供可为null的支持以及不可为null的支持,就可以了。
public Point3(Point3? source) {
this.X = source.GetValueOrDefault().X;
this.Y = source.GetValueOrDefault().Y;
this.Z = source.GetValueOrDefault().Z;
}