Tag: mutable

字符串在C#中没有变化时字符串的可变性?

如果字符串操作没有改变字符串的值,那么最终是否会创建新实例?例如; string str=”foo”; str+=””; 我知道C#中string和stringbuilder的区别。

为什么System.Windows.Point和System.Windows.Vector是可变的?

鉴于可变结构通常被认为是邪恶的(例如, 为什么可变结构“邪恶”? ),是否有潜在的好处可能促使.NET框架的设计者制作System.Windows.Point和System.Windows.Vector可变的? 我想理解这一点,所以我可以决定是否有必要使我自己的类似结构可变(如果有的话)。 将Point和Vector变为可变的决定可能只是判断错误,但如果有充分的理由(例如,性能优势),我想了解它是什么。 我知道我偶然发现了Vector.Normalize()方法的实现,因为它惊讶(!),不会返回一个新的Vector 。 它只是改变了当前的向量。 我一直认为它应该像这样工作: var vector = new Vector(7, 11); var normalizedVector = vector.Normalize(); // Bzzz! Won’t compile 但它实际上是这样的: var vector = new Vector(7, 11); vector.Normalize(); // This compiles, but now I’ve overwritten my original vector ……所以,似乎不变性只是为了避免混淆是一个好主意,但同样,也许在某些情况下可能会引起混淆。

在没有不可变字段的类中重写Object.GetHashCode()时要返回什么?

好吧,在你因为互联网上发布了数百个类似的声音问题而疯狂之前,我可以向你保证,我刚刚花了最后几个小时阅读所有这些问题并且没有找到我的问题的答案。 背景: 基本上,我的一个大型应用程序遇到了ListBox.SelectedItem属性上的某些Binding将停止工作或者在对当前所选项目进行编辑后程序崩溃的情况。 我最初问过“已经添加了相同密钥的项目”这里从代码问题中选择ListBoxItem的例外 ,但没有得到答案。 直到本周,我才有时间解决这个问题。 现在简而言之,我找到了问题的原因。 这是因为我的数据类型类已经覆盖了Equals方法,因此也覆盖了GetHashCode方法。 现在对于那些不知道这个问题的人,我发现你只能使用不可变字段/属性来实现GetHashCode方法。 使用Harvey Kwok对Overriding GetHashCode()post的回答来解释这个: 问题是Dictionary和HashSet集合正在使用GetHashCode将每个项目放在存储桶中。 如果基于某些可变字段计算哈希码,并且在将对象放入HashSet或Dictionary后实际更改了字段,则无法再从HashSet或Dictionary中找到该对象。 所以实际问题是因为我在GetHashCode方法中使用了可变属性。 当用户在UI中更改了这些属性值时,对象的关联哈希码值发生了更改,然后在其集合中找不到项。 题: 所以,我的问题是处理我需要在没有不可变字段的类中实现GetHashCode方法的情况的最佳方法是什么? 对不起,让我更具体一点,因为之前已经提出了这个问题。 Overriding GetHashCode()post中的答案表明,在这些情况下,最好只返回一个常量值……有些建议返回值1 ,而其他建议返回素数。 就个人而言,我看不出这些建议之间有什么区别,因为我原本以为只会有一个桶用于其中任何一个。 此外,Eric Lippert博客中关于GetHashCode的指南和规则有一个标题为指南的部分:哈希码的分布必须是“随机的” ,这突出了使用导致使用不足的桶的算法的缺陷。 他警告说,算法会减少使用的桶数,并在桶变得非常大时导致性能问题 。 当然,返回常数属于这一类。 我想到了为我的所有数据类型类(仅在C#中,而不是数据库中)添加一个额外的Guid字段,特别是在GetHashCode方法中使用。 所以我想在这个长篇介绍的最​​后,我的实际问题是哪个实现更好? 总结一下: 摘要: 在没有不可变字段的类中重写Object.GetHashCode()时,最好从GetHashCode方法返回一个常量,还是为每个类创建一个额外的readonly字段,仅用于GetHashCode方法? 如果我应该添加一个新字段,它应该是什么类型,我不应该将它包含在Equals方法中? 虽然我很高兴收到任何人的答复,但我真的希望得到高级开发人员的答案,他们对这个主题有充分的了解。