Почему в c # нет ключевого слова "нет"? - PullRequest
8 голосов
/ 03 декабря 2010

Иногда имеет смысл проверить, не относится ли объект к типу X, поэтому вам нужно сделать это вместо этого:

 if(this.GetType() != typeof(X)) 
 {
      //Do my thing.

 }

Что, на мой взгляд, немного громоздко, не будет ли что-то вроде этого лучше:

 if(this is not X) 
 {
     //Do my thing
 }

Ответы [ 4 ]

21 голосов
/ 03 декабря 2010

Как насчет логического оператора NOT !, отлично подходит под описание слова «not»:

if (!(this is X)) 
{
    //Do my thing
}

Как уже указывали другие, is также используется для проверки того,класс объекта наследуется от некоторого класса или реализует некоторый интерфейс, который довольно отличается от GetType().

Оба CodeInChaos и StriplingWarrior имеют разумные объяснения, почему нет* ключевое слово not в C #.

10 голосов
/ 03 декабря 2010

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

if (!(pero is Human)) ...

... который будет читать типичный разработчик C # (/ C / C ++ / Java) «еслинет (перо человек) ".Так что для особого ключевого слова нет особых оснований.

5 голосов
/ 03 декабря 2010

Обратите внимание, что this.GetType()! = typeof(X) возвращает значение false, если оно получено из (или реализуется в случае типа интерфейса), но не идентично X, тогда как this is X возвращает значение true.

Ипочему было бы отдельное ключевое слово, когда вы можете просто использовать !(a is X)?Это раздутый язык с небольшим выигрышем.Эрик Липперт любит подчеркивать, что каждая новая языковая функция должна предлагать достаточно преимуществ, чтобы компенсировать кодирование, документирование, тестирование и, конечно, повышенную сложность языка.И оператор not is просто не предлагает достаточно.

Вы можете реализовать метод расширения, но я думаю, что это глупо:

public static bool IsNot<T>(this object obj)
{
  return !(obj is T);
}
4 голосов
/ 03 декабря 2010

Используйте добрый символ взрыва:

if (!(pero is Human)) 
{

}

Кстати, is отличается, поскольку он улавливает не только конечный класс, но и всю его иерархию, как интерфейсы, так и классы.

Итак, для

class Human: ICanSpeak, Mamal
{
...
}

Human h;

if (h is Human)  {   will be true  }
if (h is ICanSpeak)  {  will be true  }
if (h is Mamal) {  will also be true  }
...