什么反对这样做?:
public struct T
{
private float[] Elements { get; set; }
public T(params float[] elements)
{
Elements = elements;
}
}
这可能导致未定义的行为吗?或者垃圾收集器会在数组被使用后保持数组存活吗?
什么反对这样做?:
public struct T
{
private float[] Elements { get; set; }
public T(params float[] elements)
{
Elements = elements;
}
}
这可能导致未定义的行为吗?或者垃圾收集器会在数组被使用后保持数组存活吗?
只是为了提供答案并添加一些细节。
这是完全合法的。编译器实际上将转换
new T(1, 2, 3)
至
new T(new float[]{1, 2, 3})
由于数组是引用类型,构造函数只会分配一个引用。并且由于引用由垃圾收集器跟踪,因此不存在内存泄漏或其他可能影响 c++ 的问题的风险。
来自语言规范(重点是我的)
在使用参数数组的方法中,参数数组的行为与数组类型的常规参数完全相同。但是,在使用参数数组调用方法时,可以传递参数数组类型的单个参数或参数数组元素类型的任意数量的参数。在后一种情况下,会自动创建一个数组实例并使用给定的参数进行初始化。