我的某些班级字段是必需的。我怎么知道它已初始化?

时间:2018-12-08 21:03:44

标签: c# design-patterns

好的。我在写代码,有一个问题。语言是C#,但没关系。例如: 我上课要点

Class Point
{
 private _x;
 private _y;

 //getter and setters
}

因此,如果我想使用此类的对象,我需要完全知道所有字段,例如_x和_y都已初始化。默认值无法解决。我的解决方案:

  • 通过构造函数传递所有必需的参数并进行初始化
  • 始终检查我的字段是否不为空(我认为这是不好的方法)

但是如果我有7个必填字段。

Class Point
{
 private _x; //required it must not be null
 private _y; //required it must not be null
 private _z; //required it must not be null
 private _b; //required it must not be null
 private _a; //required it must not be null
 private _f; //required it must not be null
 private _h; //required it must not be null

 //getter and setters
}

我如何确定所有这些都已初始化?在构造函数中传递这些参数实在是很困难和丑陋。如果我将使用构建器模式,则实际上并不能确定。 对不起,英语不好。

2 个答案:

答案 0 :(得分:0)

正如人们评论的那样,您可以通过将字段设置为始终具有默认值来确保对字段进行初始化

void initState

或让您的构造函数始终为每个字段定义默认值

Class Point
{
    private int j = 42;
}

这将确保无论何时创建该类的新实例,都将始终初始化字段。

如果您有需要指向对象的引用,则可以以相同的方式进行操作,只是将值(例如上例中的42)更改为与C#的Class Point { private int j; public Point (int jVal) { j = -1; } } 等效的语言。

答案 1 :(得分:0)

知道,如果字段已初始化,则必须使用标志。
使其显式g.V('unique-value'). ... 或如果bool _xIsSet;_x,则将类型设为int并检查该值为空。
前者不会引发任何异常,但是如果您不小心,将使用未初始化的值。
后一种方法会引发错误;可能会更好,但仍在运行时。

您可以改为选择属性,并使用null进行检查来包装字段,但结果将相同。任何错误都会影响运行时间。 (或完全没有)

方法从20开始就更喜欢?年是要有一个接受所有参数的构造函数,甚至要确保没有默认的构造函数。

int?

在更高版本的C#版本中,可以命名参数,因此代码变得非常易于阅读。

var myPoint = new Point( valueX, valueY, valueK );


除了使用您所声明的方法外,我对使用此方法的解释是:“您很少希望var myPoint = new Point( X = valueX, Y = valueY, L = valueK // <-- see here! it is quite easy to spot a possible error );的设置不完全。”然后...如果有几种方法可以完全设置Customer,则可以创建更多的构造函数。

我已经做得更进一步了,并尽可能避免使用null,因此在我的代码中,从不一个Customer仅设置了一半,很少使用{{1} }为空。

最近我开始尝试使用静态构造函数。则呼叫为Customer。它具有DDD的味道,因为Customer可以表达意图,可以表达为什么创建类。 var customer = Customer.Create(...)Create