Законное использование ReferenceEquals () - PullRequest
7 голосов
/ 28 марта 2012

В программе .NET, написанной в соответствии с декларативным стилем, каковы некоторые допустимые варианты использования ReferenceEquals ()?

Ответы [ 3 ]

12 голосов
/ 28 марта 2012

Не уверен, что вы подразумеваете под "написано, чтобы следовать декларативному стилю", но ReferenceEquals обычно используется при переопределении оператора ==.От http://msdn.microsoft.com/en-us/library/ms173147.aspx:

public static bool operator ==(ThreeDPoint a, ThreeDPoint b)
{
    // If both are null, or both are same instance, return true.
    if (System.Object.ReferenceEquals(a, b))
    {
        return true;
    }

    // If one is null, but not both, return false.
    if (((object)a == null) || ((object)b == null))
    {
        return false;
    }

    // Return true if the fields match:
    return a.x == b.x && a.y == b.y && a.z == b.z;
}

Важно увидеть Примечание ниже для обоснования:

Примечание: ОбщееОшибка в перегрузках оператора == заключается в использовании (a == b), (a == null) или (b == null) для проверки на равенство ссылок.Вместо этого создается вызов перегруженного оператора ==, что вызывает бесконечный цикл.Используйте ReferenceEquals или приведите тип к Object, чтобы избежать цикла.

11 голосов
/ 28 марта 2012

В программе .NET, написанной в соответствии с декларативным стилем, каковы некоторые допустимые варианты использования ReferenceEquals ()?

Существует только одно допустимое использование ReferenceEquals независимо от стиля"в которой написана программа: для сравнения двух ссылок на равенство ссылок .

Если вы используете ReferenceEquals для чего-то отличного от сравнения двух ссылок на равенство ссылок, вы, вероятно, делаете что-тонеправильно.

1 голос
/ 28 марта 2012

Что ж, если дизайн и / или использование связанных объектов таковы, что никогда не бывает более одного экземпляра любого объекта, "равного" любому другому, тогда это будет правильно, и, вероятно, будет быстреечем сравнение некоторого числа переменных экземпляра.

Или, как написано в другом ответе, вы можете сначала проверить его как «простой» и выполнить глубокую проверку на равные, только если они отличаются.Это использование это просто улучшение производительности.

...