C#double作为参考?

时间:2016-06-30 12:39:35

标签: c# reference double

我有自己的类使用MathDotNet包(更确切地说,是名称空间MathNet.Numerics.LinearAlgebra中的Vector<double>类)。 Vector<double>类有一个方法

public double At(int index)

返回指定索引的double值。在内部,Vector<double>类对该存储使用double[]。我认为无法直接访问内部double[]

class TwoVectors
{
    private Vector<double> v1, v2;

    // initializes the vectors v1 and v2, both have length 2.
    public TwoVectors(double[] entries1, double[] entries2)
    {
        if (entries1 == null || entries2 == null ||
            entries1.Length != 2 || entries2.Length != 2)
            throw new ArgumentException("Erroneous input!");

        v1 = Vector<double>.Build.Dense(entries1);
        v2 = Vector<double>.Build.Dense(entries2);
    }

    // gives a copy of the vector data.
    public double[] ArrayData
    {
        get
        {
            return new double[] { v1.At(0), v1.At(1), v2.At(0), v2.At(1) };
        }
    }
}

但我希望Getter不要返回矢量数据的副本,而是返回实际的矢量数据,以便将来的变化反映在矢量中。

即。如果我打电话

public static Main()
{
    TwoVectors twoVec = new TwoVectors(new double[] {1, 2}, new double[] {3, 4});
    twoVec.ArrayData[0] = 42;
    double[] arrayData = mc.ArrayData;  // this now contains {1, 2, 3, 4}
}

然后我希望arrayData包含{42,2,3,4}而不是{1,2,3,4},就像现在一样。

我相信我可以用指针做到这一点,但我不知道怎么做! 我以为我可以写

public double[] ArrayData
    {
        get
        {
            unsafe { return new double*[] { &v1.At(0), &v1.At(1), &v2.At(0), &v2.At(1) }; }
        }
    }

但是编译器告诉我v1.At(0)和其他地址无法获取(为什么?)。 还有指针,我想我不能写像

这样的东西
twoVec.ArrayData[0] = 42;
double[] arrayData = mc.ArrayData;

但有*或&amp;的东西或 - &gt;,所以必须有其他方式...任何想法?

PS:我知道我可以为我的类写一个看起来像这样的索引器:

public double this[int i]
{
    set
    {
        switch (i)
        {
            case 0: v1.At(0, value); break;
            case 1: v1.At(1, value); break;
            case 2: v2.At(0, value); break;
            case 3: v2.At(1, value); break;
            default: throw new IndexOutOfRangeException("Index must range from 0 to 3!");
        }
    }
}

(方法Vector<double>.At(int index, double value)是从线程顶部获取getter方法的setter) 但是我想知道是否有直接的方法来制作像

这样的陈述
twoVec.ArrayData[0] = 42;

按预期工作(即在矢量中进行实际更改)。

0 个答案:

没有答案