假设我有一节课Point:
class Point
{
public double? x, y;
}
Run Code Online (Sandbox Code Playgroud)
为了表明其中任何一个x或者y是未知的,我已经将它们的类型设为可空.
现在,当在数学表达式中使用这些值时,每次必须将它们的值转换为双倍是不方便的.即Math.Sin(p.x)产生编译时错误; 你必须投它:Math.Sin((double)p.x).
我解决转换问题的方法是使用包装器只读属性来执行转换:
class Point
{
public double? x, y;
public double X { get { if (x != null) return (double)x; else throw new Exception(); } }
public double Y { get { if (y != null) return (double)y; else throw new Exception(); } }
}
Run Code Online (Sandbox Code Playgroud)
这是一个好方法吗?
您可以使用以下Value属性Nullable:
Math.Sin(p.x.Value)
Run Code Online (Sandbox Code Playgroud)
要么
public double X { get { return x.Value; } }
Run Code Online (Sandbox Code Playgroud)
如果未设置该值,则会抛出异常,因此等同于您的代码.
关于方法的相对优点:
IMO基于属性的方法使消费者免受x内部存储的实现细节的影响,Nullable以表示未知.如果只希望消费者处理"已知"价值,这将是我的偏好.然而,如果消费者被期望满足x仍然"未知" 的情况,那么暴露Nullable房产将是要走的路(并且任何消费者都可以使用该HasValue房产进行检查Nullable).