Какой самый эффективный способ сравнить два значения на равенство? - PullRequest
2 голосов
/ 04 июля 2011

Скажем, у меня есть универсальный метод в C #, который принимает два значения типа T:

public void M<T>(T a, T b)
{
    ...
}

Внутри тела M () Я хочу сравнить оба входных значения на равенство. Поскольку я ничего не знаю об их типах времени выполнения, за исключением того, что они одного типа, я мог бы сделать это с помощью статического метода object.Equals () и позволить ему выбрать лучший способ:

public void M<T>(T a, T b)
{
    if (object.Equals(a, b))
    {
        ...
    }
    else
    {
        ...
    }
}

Проблема, которую я вижу здесь, заключается в ненужной упаковке двух значений, когда T не является ссылочным типом. Я хотел бы избежать этого штрафа, потому что M () вызывается очень часто.

Мой вопрос: есть ли лучший способ сделать это? Я, очевидно, заинтересован в решении, которое не включало бы слишком много анализа Т-фронта, которое компенсировало бы выгоды от уклонения от бокса.

ТИА.

1 Ответ

7 голосов
/ 04 июля 2011
if(EqualityComparer<T>.Default.Equals(a,b))
{...}

при этом используется IEquatable<T>, когда это возможно, чтобы избежать упаковки, и обрабатывается типы значений, ссылочные типы и "поднятое" использование против Nullable<T>, чтобы избежать упаковки в почти всех сценариях.

Когда IEquatable<T> является недоступным , оно должно быть отложено до object.Equals, поэтому может произойти упаковка типов значений.

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