Почему мы не можем сделать 'if (object)' в C #, чтобы проверить, является ли object нулевым? - PullRequest
8 голосов
/ 17 ноября 2011

В C, чтобы проверить, равен ли указатель нулю, мы можем сделать:

  • if (p != NULL)
  • if (p != 0)
  • if (p)

Почему в C # нет эквивалента, который позволил бы нам сделать следующее?

if (object)

вместо

if (object != null)

Ответы [ 8 ]

20 голосов
/ 17 ноября 2011

Поскольку тесты такого рода могут приводить к неожиданным ошибкам в программах, они предпочитают, чтобы булевы выражения были явными (как в Java), вместо выполнения неявного преобразования в bool.

Это также та же причина, по которой вы не можете использовать int в качестве логического выражения в C #. Поскольку единственными допустимыми логическими выражениями являются выражения, которые оцениваются непосредственно в bool, это предотвращает появление непредвиденных ошибок в коде, таких как старая ошибка C:

if (x = 5)
{ 
   // always true
}

Итак, вкратце, он не был включен для удобства чтения и ясности. Да, это кратко сказывается на небольшой стоимости, но выигрыш в уменьшении неожиданных ошибок * на 1013 * больше , чем компенсирует стоимость hainvg для добавления != null в скобках. ..

(Конечно, вы можете создать неявное преобразование пользовательского типа в bool, как обходной путь, но вы не можете глобально применить это к любому типу объекта)

14 голосов
/ 17 ноября 2011

Почему в C # нет эквивалента, который позволил бы нам делать следующее?

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

  • думал о
  • 1010 * предназначен *
  • 1012 * указано *
  • одобрено
  • реализован
  • протестирован
  • 1020 * погружено *

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

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

9 голосов
/ 17 ноября 2011

Технически говоря, это не работает, потому что неявное преобразование невозможно из вашего пользовательского класса объектов в bool (логическое значение).Пока вы предоставляете оператор неявного преобразования, который может проверять ваш объект на ноль, вы можете продолжать использовать свой синтаксис:

    public static implicit operator bool(MyType p)
    {
        return (p != null) && (p != 0);
    }

Интеграция предложения с помощью Дэн Брайант :

Альтернативный способ - реализовать неявные операторы «истина» и «ложь» для вашего типа данных.Это может понадобиться, если ваш тип допускает оценку трех состояний до bool: true, false и null.Это довольно распространенный случай в базах данных, где нулевое значение обозначает отсутствующие данные.Вот пример с веб-страницы MSDN :

public static bool operator true(DBBool x)
{
    return x.value > 0;
}

public static bool operator false(DBBool x)
{
    return x.value < 0;
}
4 голосов
/ 17 ноября 2011

Потому что так разработчики языка разработали язык.Частично это для предотвращения глупых ошибок, таких как:

if (p = 42)
3 голосов
/ 17 ноября 2011

Поскольку объект не является указателем, это объект.

2 голосов
/ 17 ноября 2011

Потому что это не в спецификации C # и компилятор не понимает такого выражения.

И если вы по той причине, почему это не используется таким образом в C # - с моей точки зрения, совершенно нелогично проверять что-либо на нуль способом if (object).

Если объект какой?

1 голос
/ 17 ноября 2011

Ваш пример выглядит читабельным только потому, что ваш объект называется «объект». В действительности объекты имеют имена, которые вытекают из их использования / функции Если бы ваш объект назывался validatedWidget, ваш код был бы похож на

if (validatatedWidget)
{
    // do something
}

Что неверно подразумевало бы что-то, где как:

if (validatedWidget != null)
{
   // do something
}

Гораздо более явный, и вряд ли много работы.

0 голосов
/ 21 ноября 2011

Синтаксис оператора if: ::

if(condition)

, и результат условия должен быть логическим, т. Е. Истинным или ложным.

Поэтому мы пишем любое условие, например

x = 10;
if(x == 10)

но если (объект) не задает конкретное условие для получения логического результата.

, если мы напишем

 boolean object = true;
 if(object)

, тогда все будет в порядке.

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

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