如何确定对象初始值设定项是否是调用Add方法的对象初始值设定项?

时间:2015-10-28 13:57:36

标签: c# object-initializers collection-initializer

我有一个自定义Vector类,可以通过多种方式进行初始化。它具有以下构造函数来创建具有全零的给定长度的向量。

public Vector(int length) { ... }

或者它可以通过实现IEnumerableAdd(..)这样的方法来填充给定的向量来使用对象初始值设定项

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并不是很好,因为它就在问题中。仍然是一项正在进行的工作,但我很欣赏评论,因为它帮助我进一步阐明了我的想法。我将这个问题保留原样,以便评论有意义。

2 个答案:

答案 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);

就你的班级而言,这两种用法是难以区分的。

您可以确保编写 的任何人都认为它应该运行,并且集合初始化代码将执行相同的操作。