gpt4 book ai didi

C#:不可变类

转载 作者:太空宇宙 更新时间:2023-11-03 18:07:13 27 4
gpt4 key购买 nike

我有一个在这个类中应该是不可变的类,我只有索引器一个私有(private)设置属性,所以为什么这不是不可变的,我可以在数组中设置一些字段,就像你在主类中看到的那样...

class ImmutableMatice
{
public decimal[,] Array { get; private set; } // immutable Property

public ImmutableMatice(decimal[,] array)
{
Array = array;
}
public decimal this[int index1, int index2]
{
get { return Array[index1, index2]; }
}

........在主要方法中,如果我用数据填充此类并更改数据

    static void Main(string[] args)
{
decimal[,] testData = new[,] {{1m, 2m}, {3m, 4m}};
ImmutableMatice matrix = new ImmutableMatice(testData);
Console.WriteLine(matrix[0,0]); // writes 1
testData[0, 0] = 999;
Console.WriteLine(matrix[0,0]); // writes 999 but i thought it should
// write 1 because class should be immutable?
}
}

有没有办法让这个类不可变?

是的,解决方案是在构造函数中将数组复制到新数组,如下所示:

    public ImmutableMatice(decimal[,] array)
{
decimal[,] _array = new decimal[array.GetLength(0),array.GetLength(1)];
//var _array = new decimal[,] { };
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
_array[i, j] = array[i, j];
}
}
Array = _array;
}

最佳答案

那是因为您实际上是在更改 ARRAY 中的数据,而不是索引器中的数据。

static void Main(string[] args)
{
decimal[,] testData = new[,] {{1m, 2m}, {3m, 4m}};
ImmutableMatice matrix = new ImmutableMatice(testData);
Console.WriteLine(matrix[0,0]); // writes 1
testData[0, 0] = 999; // <--- THATS YOUR PROBLEM
Console.WriteLine(matrix[0,0]); // writes 999 but i thought it should
// write 1 because class should be immutable?
}

您可以在构造函数中将数组复制到您的私有(private)属性中以避免这种情况。

请注意,您确实不能编写 matrix[0,0] = 999;,因为索引器没有 setter。

编辑

正如 Chris 所指出的(我自己怎么会错过它?)- 您根本不应该将数组公开为属性(这意味着在大多数情况下它甚至不必是属性)。

改为考虑以下代码:

private decimal[,] _myArray; // That's private stuff - can't go wrong there.

public decimal this[int index1, int index2]
{
// If you only want to allow get data from the array, thats all you ever need
get { return Array[index1, index2]; }
}

关于C#:不可变类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233256/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com