Как получается, что C # может скопировать элемент структуры, но не может проверить на равенство? - PullRequest
3 голосов
/ 10 марта 2011

Я могу присвоить одно значение структуры другому, и память будет скопирована автоматически. Но если я хочу проверить, содержат ли две структуры одни и те же данные (как если бы я только что выполнил назначение), я должен явно их кодировать. Это почему? Похоже, что фреймворк должен иметь стандартную реализацию оператора == для структур.

Ответы [ 3 ]

6 голосов
/ 10 марта 2011

Реализация по умолчанию ValueType.Equals делает именно то, что вы хотите.Поэтому, если вы сделаете:

s1 = ...;
s2 = ...;
s1.Equals(s2);

Вызов "Equals" сделает автоматическое глубокое сравнение, которое вы ищете.

В целом, C # предпочитает не использовать перегруженные операторы, которыеВероятно, поэтому он не реализует оператор.

Кроме того, философски C # склонен избегать неявного поведения, включая такие вещи, как неявная генерация методов.

5 голосов
/ 10 марта 2011

Фреймворк имеет реализацию по умолчанию Equals. Оператор == - это функция C #, которую вы должны реализовать самостоятельно, используя Equals, если хотите.

0 голосов
/ 10 марта 2011

Если у вас есть разрешение на выполнение собственного кода, просто позвоните memcmp:

static class memcmpsig<T> where T : struct
{
    [DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
    static extern int memcmp(ref T left, ref T right, UIntPtr count);
}

static class CompareExtension
{
    int CompareTo<T>(this T left, T right) { return memcmpsig<T>::memcmp(left, right, Marshal::SizeOf(typeof(T));
}
...