Подтвердить что ты не робот

Метод SingleOrDefault(): что такое значение по умолчанию?

Я тестирую существование записи пользователя в следующем выражении:

if (fromUser.AllFriends.Where(af => af.FriendUserID == toUserID).SingleOrDefault() == ???

С учетом документации:

Возвращает единственный, определенный элемент последовательности, или значение по умолчанию, если этот элемент не найден.

На что ссылается полужирный текст? Что, черт возьми, я тестирую в своем заявлении if?

Серьезный вопрос, который, вероятно, кажется простым и нелепым для большинства.

Спасибо.

4b9b3361

Ответ 1

Выдержки из Библии ECMA, стих 334:


12.2 Значения по умолчанию

Значение переменной по умолчанию зависит от типа переменной и определяется следующим образом:

  • Для переменной типа значения значение по умолчанию совпадает с значением, вычисленным конструктором по умолчанию типа value (§11.1.1).
  • Для переменной ссылочного типа значение по умолчанию null.

[Примечание. Инициализация значений по умолчанию обычно выполняется с помощью диспетчера памяти или сборщика мусора инициализируйте память до всех бит-ноль, прежде чем она будет выделена для использования. По этой причине удобно использовать all-bitszero для представления нулевой ссылки. end note]

Значение по умолчанию для типа nullable - это экземпляр, для которого свойство HasValue false. Ссылка на Свойство Value значения по умолчанию для типа NULL приводит к исключению типа System.InvalidOperationException. Значение по умолчанию также известно как нулевое значение нулевой тип. Неявное преобразование существует из нулевого типа (§11.2.7) в любой тип с нулевым значением, и это преобразование создает нулевое значение типа.

18.3.4 Значения по умолчанию

Как описано в §12.2, несколько видов переменных автоматически инициализируются значением по умолчанию, когда они созданы. Для переменных типов классов и других ссылочных типов это значение по умолчанию равно null. Однако, поскольку structs - это типы значений, которые не могут быть null, значением по умолчанию для struct является значение, созданное устанавливая все поля типа значения в их значение по умолчанию и все поля ссылочного типа равны null.

Пример: ссылаясь на описанную выше конструкцию Point, пример

Point[] a = new Point[100]; 

инициализирует каждую точку в массиве значением, создаваемым установкой полей x и y в ноль.

Значение по умолчанию для структуры соответствует значению, возвращаемому конструктором по умолчанию структуры (§11.1.1). В отличие от класса, struct не разрешается объявлять конструктор экземпляров без параметров. Вместо этого каждая структура неявно имеет конструктор экземпляров без параметров, который всегда возвращает полученное значение от установки всех полей типа значения до их значения по умолчанию и всех полей ссылочного типа в значение null.

11.1.2 Конструкторы по умолчанию

Все типы значений неявно объявляют открытый конструктор экземпляров без параметров, называемый конструктором по умолчанию. Конструктор по умолчанию возвращает нулевой инициализированный экземпляр, известный как значение по умолчанию для типа значения:

  • Для всех простых типов значением по умолчанию является значение, созданное битовой диаграммой всех нулей:
    • Для sbyte, byte, short, ushort, int, uint, long и ulong значение по умолчанию 0.
    • Для char значение по умолчанию '\x0000'.
    • Для float значение по умолчанию 0.0f.
    • Для double значение по умолчанию 0.0d.
    • Для десятичного значения по умолчанию 0m.
    • Для bool значение по умолчанию false.
  • Для типа enum-типа E значение по умолчанию 0.
  • Для структурного типа значением по умолчанию является значение, созданное установкой всех полей типа значения в их значение по умолчанию, а все поля ссылочного типа - null.
  • Для типа с нулевым значением значением по умолчанию является значение, для которого HasValue возвращает false.

Аминь

Вы можете загрузить святую книгу (версия 4.0) непосредственно с веб-сайта Microsoft.

Ответ 2

Значение по умолчанию для ссылочных типов null. Значение по умолчанию для числовых типов 0. Есть еще несколько особых случаев, но если вы когда-нибудь захотите убедиться, просто оцените default(type), чтобы получить конкретное значение по умолчанию для любого типа значений, о котором вы не уверены. В вашем конкретном случае значение по умолчанию, вероятно, null, если вы работаете с классами.

Ответ 3

Значение по умолчанию - это значение по умолчанию (T) для этого типа.

Но в вашем случае вы должны использовать Enumerable.Any:

if (!fromUser.AllFriends.Where(af => af.FriendUserID == toUserID).Any())
{
    // etc...
}

Вы также можете комбинировать вызовы Where и Any:

if (!fromUser.AllFriends.Any(af => af.FriendUserID == toUserID))
{
    // etc...
}

Ответ 4

значение по умолчанию - это все, что вы получаете, когда вызываете default(TypeName).

При ReferenceTypes это неизменно null. Для ValueTypes обычно это 0 (для числовых типов) или экземпляр структуры после вызова конструктора по умолчанию.

Ответ 6

Значение по умолчанию для элемента по умолчанию (тип). Для классов значение по умолчанию равно null.