如何确定对象初始值设定项是否是调用Add方法的对象
本文关键字:对象 调用 是否是 Add 方法 何确定 | 更新日期: 2023-09-27 18:19:34
我有一个自定义的Vector
类,可以通过多种方式进行初始化。它有以下构造函数来创建一个给定长度的全零向量。
public Vector(int length) { ... }
或者它可以通过实现IEnumerable
和类似的Add(..)
方法来使用对象初始化器来填充给定的向量
var v1 = new Vector{ 1, 2, 5 };
问题在于您可以编写以下代码
var v1 = new Vector(3){ 1, 2, 5 };
这看起来很无辜,但它最终创建了一个长度为6的向量,其中前三个值为0,然后接下来的3个值为1,2,5。理想情况下,这将只返回长度为3、值为1,2,5的向量。我已经经历并逐步经历了这个对象的初始化,似乎没有任何迹象表明这个对象正在被创建。看起来好像构造函数在运行,然后调用了3个Add()
方法。我如何判断它是一个调用Add()
方法的对象初始值设定项,并保护该方法不创建附加值?
在评论部分可以明显看出,这个类的API在问题中并不好。这项工作仍在进行中,但我很欣赏这篇评论,因为它帮助我进一步阐述了我的想法。我不提这个问题,这样评论才有意义。
这看起来像是一个设计问题。与其四处打听编译器将调用您的Add
方法,我不如更改Vector
构造函数,使其具有一个接收实际值或它们的数组的重载:
public Vector(double x, double y, double z)
或
public Vector(params double[] values)
其中,默认构造函数将保存元素的默认值,而不实际向底层数组添加任何内容。
我如何判断它是一个调用Add()方法的对象初始化器,并保护该方法不创建附加值?
你没有。该代码在功能上与相同
var v1 = new Vector(3);
v1.Add(1);
v1.Add(2);
v1.Add(3);
就你的类而言,这两种用法是无法区分的。
您可以确保任何编写的人都可以按照您认为的方式使用它,并且集合初始值设定项代码也会执行同样的操作。