3

我有一个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 的向量。我已经完成并逐步完成了对象初始化,似乎没有任何迹象表明正在创建对象。看起来好像构造函数运行了,然后Add()调用了 3 个方法。如何判断它是调用该Add()方法的对象初始化程序并保护该方法不创建附加值?

ps 从评论部分可以看出,这个类的 API 在问题中并不好。仍在进行中的工作,但我很欣赏评论,因为它帮助我进一步提出了我的想法。我将问题保留原样,以便评论有意义。

4

2 回答 2

2

这看起来像一个设计问题。我不会四处走动并试图告诉编译器将调用您的Add方法,而是将Vector构造函数更改为具有接收实际值或它们的数组的重载:

public Vector(double x, double y, double z)

或者

public Vector(params double[] values)

默认构造函数将保存元素的默认值,而不实际向底层数组添加任何内容。

于 2015-10-28T14:02:32.743 回答
1

如何判断它是调用 Add() 方法的对象初始化程序并保护该方法不创建附加值?

You don't. The code is functionally identical to:

var v1 = new Vector(3);
v1.Add(1);
v1.Add(2);
v1.Add(3);

As far as your class is concerned, the two usages are indistinguishable.

You can ensure that anyone who writes that has it function however you think it should, and the collection initializer code will do the same thing.

于 2015-10-28T14:04:37.343 回答