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

时间:2013-12-08 18:41:27

标签: c# string gethashcode

我希望为程序命名空间中使用的某些字符串创建一个自定义string.GetHashCode()方法(建议在string.GetHashCode()msdn页面here上使用) 不幸的是,string class是继承密封的。

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

CustomStringTypeInstnce.Value.GetHashCode();

而不是更好:

CustomStringTypeInstnce.GetHashCode();

如果字符串类没有被继承密封,那么这是可能的。是否正在寻找我正在寻找的代码?

如果没有,..我不一定需要或不需要覆盖基类string.GetHashCode(),对于整个程序命名空间,但这也可以,如何做?

(编辑) 对不起,有一点关注,是的,可以使用

CustomStringTypeInstnce.GetHashCode();

根据AppDeveloper的回答,我/我也希望能够直接为包装的字符串变量分配一个字符串,而不必使用访问器,但我想这几乎意味着使用禁止的继承。

2 个答案:

答案 0 :(得分:1)

您无法覆盖String.GetHashCode,因为它已被密封。

由于GetHashCode的唯一良好用法是用于“哈希”数据结构,例如DictionaryHashSet,您可以使用带有不同IEqualityComparer的构造函数。< / p>

字符串的最常见情况由StringComparer类涵盖。即有字典,用不敏感的方式比较字符串(忽略文化):

  var ages = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);

注意:不建议将GetHashCode用于任何其他目的(例如保留有关字符串的信息而不是SHA256或其他定义良好的哈希)。 String.GetHashCode文档明确指出结果可能会因版本而异,甚至可能会在不同的进程/应用域之间发生变化。

  

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

答案 1 :(得分:0)

我不认为,你可以!

String类被密封,原因是不允许任何此类修改。

你可以这样做,公开类似

的类
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)
        {

        }
    }
}