如何确定对象初始值设定项是否是调用 Add 方法的初始值设定项?
How can you determine if the object initializer is the one calling the Add method?
我有一个自定义 Vector
class 可以通过多种方式初始化。它有以下构造函数来创建一个给定长度的全零向量。
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。理想情况下,这 return 只是一个长度为 3、值为 1、2、5 的向量。我已经完成并逐步完成了 this 的对象初始化,但似乎没有任何迹象表明正在创建该对象。看起来好像构造函数在运行,然后调用了 3 个 Add()
方法。我怎么知道它是一个调用 Add()
方法的对象初始值设定项并保护该方法不创建额外的值?
p.s。从评论部分可以明显看出,class 的 API 并不像问题中那样好。工作仍在进行中,但我很欣赏评论,因为它帮助我进一步理清了我的想法。我将按原样离开问题,以便评论有意义。
这看起来像是一个设计问题。我不会四处走动并试图告诉编译器将调用您的 Add
方法,而是将 Vector
构造函数更改为具有接收实际值或它们的数组的重载:
public Vector(double x, double y, double z)
或者
public Vector(params double[] values)
默认构造函数将保存元素的默认值,而不实际向基础数组添加任何内容。
How can I tell that it is an object intializer calling the Add() method and protect the method from creating additional values?
你不知道。该代码在功能上等同于:
var v1 = new Vector(3);
v1.Add(1);
v1.Add(2);
v1.Add(3);
就你的class而言,这两种用法是没有区别的。
您可以确保编写 that 的任何人都能按照您认为的方式运行,并且集合初始化程序代码将执行相同的操作。
我有一个自定义 Vector
class 可以通过多种方式初始化。它有以下构造函数来创建一个给定长度的全零向量。
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。理想情况下,这 return 只是一个长度为 3、值为 1、2、5 的向量。我已经完成并逐步完成了 this 的对象初始化,但似乎没有任何迹象表明正在创建该对象。看起来好像构造函数在运行,然后调用了 3 个 Add()
方法。我怎么知道它是一个调用 Add()
方法的对象初始值设定项并保护该方法不创建额外的值?
p.s。从评论部分可以明显看出,class 的 API 并不像问题中那样好。工作仍在进行中,但我很欣赏评论,因为它帮助我进一步理清了我的想法。我将按原样离开问题,以便评论有意义。
这看起来像是一个设计问题。我不会四处走动并试图告诉编译器将调用您的 Add
方法,而是将 Vector
构造函数更改为具有接收实际值或它们的数组的重载:
public Vector(double x, double y, double z)
或者
public Vector(params double[] values)
默认构造函数将保存元素的默认值,而不实际向基础数组添加任何内容。
How can I tell that it is an object intializer calling the Add() method and protect the method from creating additional values?
你不知道。该代码在功能上等同于:
var v1 = new Vector(3);
v1.Add(1);
v1.Add(2);
v1.Add(3);
就你的class而言,这两种用法是没有区别的。
您可以确保编写 that 的任何人都能按照您认为的方式运行,并且集合初始化程序代码将执行相同的操作。