我需要一个包含一对值的结构,其中一个值将被更改。所以我的第一个想法是使用 KeyValueItem 或 Tupple<,> 但后来我看到它们只有一个吸气剂。我不明白为什么?你会在我的情况下使用什么?我可以创建自己的课程,但是还有其他方法吗?
问问题
5577 次
4 回答
10
它们是不可变的类型。不可变类型的想法是它们代表一个值,因此不能改变。如果你需要一个新值,你就创建一个新值。
假设您的元组的第一个值需要更改,只需执行以下操作:
myValue = Tuple.Create(newValue, myValue.Item2);
要理解为什么不变性很重要,请考虑一个简单的情况。我有一门课说包含最低和最高温度。我可以将其存储为两个值并提供两个属性来访问它们。或者我可以将它们存储为一个元组并提供一个提供该元组的属性。如果元组是可变的,那么其他代码可以更改这些最小值和最大值,这意味着我的类中的最小值和最大值将发生变化。通过使元组不可变,我可以安全地一次传递两个值,确保其他代码无法篡改它们。
于 2013-11-01T10:48:04.747 回答
2
您可以创建自己的实现:
public class Pair<T, U> {
public Pair() {
}
public Pair(T first, U second) {
this.First = first;
this.Second = second;
}
public T First { get; set; }
public U Second { get; set; }
};
于 2013-11-01T10:44:48.457 回答
0
元组在 C# 中是只读的。这在此处的答案中进行了解释,主要是由于它们来自函数式编程的性质。
您应该创建自己的MutableTuple
允许修改的实现。
需要考虑的事项:
- 您可能想要覆盖
Equals
和GetHashCode
- 您可能希望它可以在
First
元组 (IComparable
) 的元素上排序。
于 2013-11-01T10:46:06.593 回答
0
元组历史上来自函数式编程,其中一切都应该是不可变的。您可以在此处了解有关函数式编程的更多信息:
为了获得历史方法的好处,C# 中的元组以相同的方式设计。如果您真的想要可变元组,您可以自己轻松实现:
public class MutableTuple<TFirst, TSecond>
{
public TFirst { get; set; }
public TSecond { get; set; }
}
于 2021-09-15T10:57:59.753 回答