我有一个自定义Vector
类,可以通过多种方式进行初始化。它具有以下构造函数来创建具有全零的给定长度的向量。
public Vector(int length) { ... }
或者它可以通过实现IEnumerable
和Add(..)
这样的方法来填充给定的向量来使用对象初始值设定项
var v1 = new Vector{ 1, 2, 5 };
问题在于您可以编写以下代码
var v1 = new Vector(3){ 1, 2, 5 };
这看起来很无辜,但它最终会创建一个长度为6的向量,其中前三个值为0,然后接下来的三个为1,2,5。理想情况下,这将返回长度为3且值为1,2,5的向量。我已经完成并逐步完成了对象的初始化,并且似乎没有任何迹象表明该对象正在被创建。似乎构造函数运行,然后调用了3个Add()
方法。如何判断它是一个调用Add()
方法的对象初始值设定项并保护该方法不创建其他值?
P.S。正如评论部分所显示的那样,这个类的API并不是很好,因为它就在问题中。仍然是一项正在进行的工作,但我很欣赏评论,因为它帮助我进一步阐明了我的想法。我将这个问题保留原样,以便评论有意义。
答案 0 :(得分:2)
这看起来像设计问题。我没有绕过并尝试告诉编译器将调用您的Add
方法,而是将Vector
构造函数更改为接收实际值的重载,或者它们的数组:
public Vector(double x, double y, double z)
或者
public Vector(params double[] values)
默认构造函数将保留元素的默认值,而不实际向底层数组添加任何内容。
答案 1 :(得分:1)
如何判断它是一个对象初始化程序,调用Add()方法并保护该方法不创建其他值?
你没有。该代码在功能上与:
相同var v1 = new Vector(3);
v1.Add(1);
v1.Add(2);
v1.Add(3);
就你的班级而言,这两种用法是难以区分的。
您可以确保编写 的任何人都认为它应该运行,并且集合初始化代码将执行相同的操作。