2012-06-26 3 views
0

Можно переопределить метод GetHashCode для строки, межд, int32 и т.д ..C# переопределение GetHashCode на строкового типа

Я не хочу, чтобы создать новый объект или класс и переопределить его, что далеко. Интересно, есть ли способ переопределить метод типа. Подобно расширению, но не очень.

string myString = "sometext"; 
myString.GetHashCode(); -- I want to override this method. 
+4

I есть только один вопрос: Почему? –

+1

Нет, извините, вы не можете переопределить метод, не наследуя от базового класса, а 'string' и' structs' не могут быть унаследованы. – Magnus

ответ

1

Если вы не хотите создавать свой собственный класс, то нет, потому что переопределение возможно только в подклассе.

В качестве альтернативы можно создать собственный метод расширения, как:

public static class MyExtensions 
{ 
    public static int GetHashCode2(this string s) 
    { 
     // Implementation 
    } 
} 

Это будет иметь такой же эффект, но вам нужно будет позвонить .GetHashCode2(), а не .GetHashCode()

1

Я думаю, что вы можете сделать это только если он находится в другом классе [http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals- метод-это-перекрываться-в-с]

Плюс, я не думаю, что вы хотите заменить его во всем мире, потому что есть сильный вероятно капот, что другие вещи будут использовать эту базу GetHashCode()

Наконец, спросите себя: «Почему вы хотите это сделать?» Если у вас нет по-настоящему веской причины, вам не нужно это делать.

2

Нет, вы не можете. Даже если вы добавили метод расширения, если есть метод экземпляра и метод расширения с тем же сигнатурой, который вызывается, то метод экземпляра выигрывает. Вы также не можете продлить string или int, потому что они запечатаны. Лучшее, что вы могли бы сделать, это создать совершенно новый класс/struct со свойством string/int, который переопределяет GetHashCode с вашей собственной реализацией (вы могли бы предоставить неявные преобразования string или int, если хотите.

Смежные вопросы