9

我需要一个包含一对值的结构,其中一个值将被更改。所以我的第一个想法是使用 KeyValueItem 或 Tupple<,> 但后来我看到它们只有一个吸气剂。我不明白为什么?你会在我的情况下使用什么?我可以创建自己的课程,但是还有其他方法吗?

4

4 回答 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允许修改的实现。

需要考虑的事项:

  • 您可能想要覆盖EqualsGetHashCode
  • 您可能希望它可以在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 回答