【发布时间】:2011-06-03 18:34:51
【问题描述】:
我正在尝试用 C# 编写一个小型数学库。我想创建一个通用向量结构,用户可以在其中定义元素类型(int、long、float、double 等)和维度。
我的第一次尝试是这样的......
public struct Vector<T>
{
public readonly int Dimensions;
public readonly T[] Elements;
// etc...
}
不幸的是,Elements 作为一个数组,也是一个引用类型。因此,这样做,
Vector<int> a = ...;
Vector<int> b = a;
a[0] = 1;
b[0] = 2;
将导致 a[0] 和 b[0] 都等于 2。
我的第二次尝试是定义一个接口IVector<T>,然后使用Reflection.Emit在运行时自动生成合适的类型。生成的类大致如下所示:
public struct Int32Vector3 : IVector<T>
{
public int Element0;
public int Element1;
public int Element2;
public int Dimensions { get { return 3; } }
// etc...
}
这似乎很好,直到我发现接口似乎像对底层对象的引用一样。如果我将IVector 传递给函数,函数中元素的更改将反映在原始向量中。
我认为我的问题是我需要能够创建具有用户指定数量的字段的类。我不能使用数组,也不能使用继承。
有人有解决办法吗?
编辑:这个库将在性能关键的情况下使用,所以引用类型不是一个选项。
【问题讨论】:
-
你可以简单地创建一个复制构造函数,人们必须知道 Vector
是一个引用类型,所以一个简单的赋值可能不是他们想要的。 -
有什么问题?我根本不明白你想要做什么。你想解决什么问题?您似乎误解了引用的分配是什么。在您的示例中,对于 a 和 b,在 b=a 之后,b 和 a 指的是同一个 Vector 实例。
-
b 和 a 不引用同一个实例 - Vector
是一个值类型。但是,它们的两个 Elements字段都引用了同一个实例,这是第一次尝试的问题。 -
糟糕。错过了它是一个结构。