C# 重写string.GetHashCode()的正确方法是什么?

C# 重写string.GetHashCode()的正确方法是什么?,c#,string,gethashcode,C#,String,Gethashcode,我希望为程序名称空间中使用的一些字符串创建一个自定义string.GetHashCode()方法(如string.GetHashCode()msdn页面上的建议) 不幸的是,遗产已被封存 我得到的最接近的是一个带有字符串类型值访问器的基类,但这会有点烦人,因为代码将读取: CustomStringTypeInstnce.Value.GetHashCode(); 而不是更好的: CustomStringTypeInstnce.GetHashCode(); 如果字符串类不是继承密封的,那么这是可

我希望为程序名称空间中使用的一些字符串创建一个自定义string.GetHashCode()方法(如string.GetHashCode()msdn页面上的建议) 不幸的是,遗产已被封存

我得到的最接近的是一个带有字符串类型值访问器的基类,但这会有点烦人,因为代码将读取:

CustomStringTypeInstnce.Value.GetHashCode();
而不是更好的:

CustomStringTypeInstnce.GetHashCode();
如果字符串类不是继承密封的,那么这是可能的。我正在寻找的代码是否已读取

如果不是,。。对于整个程序名称空间,我不一定需要或不需要重写基类string.GetHashCode(),但这也可以,怎么做

(编辑) 抱歉,有人注意到了,是的,可以用

CustomStringTypeInstnce.GetHashCode()


正如AppDeveloper的回答所建议的那样,我过去/现在也希望能够直接将字符串分配给包装字符串变量,而不必使用访问器,但我想这几乎意味着使用禁止继承。

我不认为,你可以

字符串类被密封的原因是不允许任何此类修改

您可以像

namespace ConsoleApplication2
{

    class MyClass
    {
        private string _state;
        public override int GetHashCode()
        {

            return _state.MyCustomHasCode();
        }
    }
    public static class Program
    {
        public static int MyCustomHasCode(this string str)
        {
            // return "your own hashcode implementation
        }
        static void Main(string[] args)
        {

        }
    }
}

无法重写
String.GetHashCode
,因为它是密封的

由于
GetHashCode
的唯一好用法是用于“散列”数据结构,如
Dictionary
HashSet
,因此可以使用采用不同
IEqualityComparer
的构造函数

最常见的字符串大小写由类覆盖。例如,使用字典以不区分大小写的方式比较字符串(忽略区域性):

var ages=新字典(StringComparer.OrdinalIgnoreCase);
注意:不建议将
GetHashCode
用于任何其他目的(例如,保留有关字符串的信息而不是SHA256或其他定义良好的哈希)。文档明确指出,结果可能会随着版本的变化而变化,甚至在不同的流程/应用程序域之间变化

相同字符串的哈希代码在.NET Framework的不同版本之间以及在单个.NET Framework版本的不同平台(如32位和64位)之间可能有所不同。在某些情况下,它们甚至可能因应用程序域而异


你在使用多态性吗?您没有理由不能为自定义类创建自己的
NewGetHashCode()
,并在需要时调用它吗?您指的是什么建议(如这里的string.GetHashCode()msdn页面上的建议)?我没有看到任何东西会让我认为我应该为“程序名称空间”中的字符串运行自己的哈希代码生成例程。只是我不应该真正依赖于使用什么值;也就是说,我不应该记录哈希代码并将它们从.NET的一个版本与另一个版本进行比较。为什么需要这样做?也就是说,大多数收集/排序类和方法都采用自定义比较器-因此,您可以提供自定义实现而无需继承…为什么您甚至需要为程序命名空间的一部分重写GetHashCode。@重写建议在.net 2.0版本的msdn中方法的文档:)。这将不会编译,即使它编译了,当您已经将扩展方法包装到类中时,使用扩展方法也没有多大意义。eww,程序类需要是静态的!谢谢你的尝试,AppDeveloper,我的问题不是很好。我将把你其他一些问题的答案投给更明智的问题
  var ages = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);