如何确定对象初始值设定项是否是调用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方法的对象

这看起来像是一个设计问题。与其四处打听编译器将调用您的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);

就你的类而言,这两种用法是无法区分的。

您可以确保任何编写的人都可以按照您认为的方式使用它,并且集合初始值设定项代码也会执行同样的操作。