可空类成员表示数学未知数

dha*_*ech 2 c# nullable

假设我有一节课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)

这是一个好方法吗?

Ric*_*lly 5

您可以使用以下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).