我玩$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'的返回值,因为它不是变量
答案 0 :(得分:5)
有三种情况可以改变可变结构并看到结果:
MyStruct s = new MyStruct(); s.Prop = 4;
class MyType { public MyStruct S;} ... myType.S.Prop = 4;
MyStruct[] myArray =...; myArray[3].Prop = 4;
。 为什么帖子中的代码没有检测到更改 - 代码使用了属性而不是字段。
请注意,List<MyStruct>
不允许修改,因为索引器(this[..]
)返回项的副本(因为没有像C ++那样的支持返回引用)。