我希望为程序命名空间中使用的某些字符串创建一个自定义string.GetHashCode()方法(建议在string.GetHashCode()msdn页面here上使用) 不幸的是,string class是继承密封的。
我得到的最接近的是一个带有字符串类型值访问器的基类,但这会让代码读起来有点烦人:
CustomStringTypeInstnce.Value.GetHashCode();
而不是更好:
CustomStringTypeInstnce.GetHashCode();
如果字符串类没有被继承密封,那么这是可能的。是否正在寻找我正在寻找的代码?
如果没有,..我不一定需要或不需要覆盖基类string.GetHashCode(),对于整个程序命名空间,但这也可以,如何做?
(编辑) 对不起,有一点关注,是的,可以使用
CustomStringTypeInstnce.GetHashCode();
根据AppDeveloper的回答,我/我也希望能够直接为包装的字符串变量分配一个字符串,而不必使用访问器,但我想这几乎意味着使用禁止的继承。
答案 0 :(得分:1)
您无法覆盖String.GetHashCode
,因为它已被密封。
由于GetHashCode
的唯一良好用法是用于“哈希”数据结构,例如Dictionary
和HashSet
,您可以使用带有不同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)
{
}
}
}