Есть ли причина для такого сравнения типов? - PullRequest
3 голосов
/ 22 июля 2010

Я привык видеть старый код вроде

if (true)
{
    ...
}

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

private static bool logField(Type t, string fieldname)
{
    if (t.ToString() == typeof (Property).ToString())
    {
        ...
    }
    return true;
}

и делать это так:

private static bool logField(Type t, string fieldname)
{
    if (t == typeof (Property))
    {
        ...
    }
    return true;
}

Ответы [ 5 ]

6 голосов
/ 22 июля 2010

Я бы сказал, что это обычно лень - но это может не быть. Например, вы можете иметь два типа свойств в одном и том же файле, но разные копии. Если typeof(Property) загружает его из одного файла, а t загружается из другого, ваша замена скажет, что они разные, но исходный код будет сравнивать, скажем, что они одинаковые.

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

3 голосов
/ 22 июля 2010

Я не могу придумать никаких веских причин.

На самом деле, первый бросит, если t равно нулю.

1 голос
/ 22 июля 2010

Первый сравнивает ссылки на строки, а второй фактически проверяет, имеет ли t тип свойства.

Первая всегда будет «правильной», поскольку две строки ссылаются на один и тот же объект, но вторая - правильный способ проверить, относится ли t к типу свойства.

Anэквивалентный и более читаемый способ проверки типа -

if (t is Property)
0 голосов
/ 22 июля 2010

Я бы сказал, что первый подход, вероятно, был сделан кем-то, незнакомым с C #, не обязательно быть ленивым.Сравнение строк будет работать большую часть времени, за исключением:

  1. Если t равно нулю, будет выдано исключение нулевой ссылки.
  2. Он не учитывает пространства имен.

Я бы порекомендовал второй случай, если только вам не нужен крайний случай # 2.

0 голосов
/ 22 июля 2010

Нет, получение объекта типа из 2 экземпляров одного типа всегда будет возвращать ссылку на один и тот же тип объекта в памяти. Это означает, что достаточно выполнить проверку на равенство ссылок (==).

По сути, звоните: if (t.ToString () == typeof (Свойство) .ToString ())

дважды вызовет ToString () для одного и того же объекта, где t - это тип свойства.

...