ValueTuple结构只能作为变量变化吗?

时间:2017-05-08 16:15:46

标签: c# immutability mutability valuetuple

我玩$stmt2 = $db_connection->prepare("SELECT sponsor.image, sponsor.link FROM sponsor_tier_rel INNER JOIN sponsor_tier ON sponsor_tier_rel.sponsor_tier_id = 8 INNER JOIN sponsor ON sponsor_tier_rel.sponsor_id = sponsor.id "); 结构并试图实现一个不可变的复合键。密钥由值类型组成。

我试图通过一些单元测试打破以下实现,到目前为止还没有成功。我错过了什么吗?

此外,这只是出于好奇,我希望在.NET 4.7发布之前获得ValueTuple和它的限制。

到目前为止,我对ValueTuple的理解是它只能作为变量而不是作为字段或属性变化。不知道“可变”在这里意味着什么。改变ValueTuple实例实际是否会创建一个新的ValueTuple(就像知道字符串是“不可变的”但实际引用类型一样)?< / p>

  来自this answer

     

ValueTuple不仅是System.ValueTuple,而且是可变的,并且在使用它们时必须要小心。想想当一个班级将struct作为一个字段时会发生什么。

这是我的实施和测试

System.ValueTuple
  

错误:无法修改'ImmutableKey.Key'的返回值,因为它不是变量

1 个答案:

答案 0 :(得分:5)

有三种情况可以改变可变结构并看到结果:

  • 本地变量:MyStruct s = new MyStruct(); s.Prop = 4;
  • 另一种类型的
  • 字段class MyType { public MyStruct S;} ... myType.S.Prop = 4;
  • array 的元素:MyStruct[] myArray =...; myArray[3].Prop = 4;

为什么帖子中的代码没有检测到更改 - 代码使用了属性而不是字段。

请注意,List<MyStruct>不允许修改,因为索引器(this[..])返回项的副本(因为没有像C ++那样的支持返回引用)。