Яка мета знака питання після типу (наприклад: int? MyVariable)?


433

Як правило, основне використання знака питання призначене для умовного x ? "yes" : "no",.

Але я бачив ще одне використання для цього, але не можу знайти пояснення цього використання ?оператора, наприклад.

public int? myProperty
{
   get;
   set;
}

Відповіді:


437

Це означає, що відповідний тип значення - це нульовий тип

Зменшувані типи є екземплярами структури System.Nullable. Нульовий тип може представляти правильний діапазон значень для його базового типу значення плюс додаткове нульове значення. Наприклад, a Nullable<Int32>, вимовляється "Nullable of Int32", може бути призначене будь-яке значення від -2147483648 до 2147483647, або йому може бути присвоєно нульове значення. A Nullable<bool>можуть бути призначені значення true, false або null. Можливість присвоєння нулю числовим і булевим типам особливо корисна, коли ви маєте справу з базами даних та іншими типами даних, що містять елементи, яким не може бути призначено значення. Наприклад, булеве поле в базі даних може зберігати значення true або false або вони можуть бути невизначені.

class NullableExample
{
  static void Main()
  {
      int? num = null;

      // Is the HasValue property true?
      if (num.HasValue)
      {
          System.Console.WriteLine("num = " + num.Value);
      }
      else
      {
          System.Console.WriteLine("num = Null");
      }

      // y is set to zero
      int y = num.GetValueOrDefault();

      // num.Value throws an InvalidOperationException if num.HasValue is false
      try
      {
          y = num.Value;
      }
      catch (System.InvalidOperationException e)
      {
          System.Console.WriteLine(e.Message);
      }
  }
}

3
Використовується для структури. Не думайте, що це насправді корисно для занять.
MonsieurDart

8
@MonsieurDart - ось чому у відповіді написано "тип значення"
Шон

3
@AntoineDahan - типи значень не мають нульових типів, оскільки вони за визначенням є ненульовими. Я думаю, ти думаєш про Яву, де є intтип і відповідний Integerклас, наприклад.
Шон

2
новітня документація (2015 р.) для зведеного тут
динозавр


118

Це скорочення для Nullable<int>. Nullable<T>використовується, щоб дозволити встановити тип значення null. Типи значення зазвичай не можуть бути нульовими .


3
плюс один за використання терміна стенограми, досить прямо!
Харі

3
Друге речення мене бентежить. Що ви маєте на увазі під "не можу"? На рівні компілятора або в контексті програми.
problemofficer

5
@problemofficer за визначенням, value typesне може бути нульовим. Якщо ви оголосите int або bool (які є типовими типами), не призначаючи значення, вони все одно матимуть значення (0 та false, відповідно), тобто. вони не були б нульовими. reference typesЗ іншого боку, непризначений , наприклад об’єкт або MyClass, буде недійсним. Ви можете прочитати про різницю між типами значень та типовими типами.
Клаус Бисков Педерсен

Дякую за пояснення. Я тепер розумію.
problemofficer

62

В

x ? "yes" : "no"

то ? оголошує речення if . Тут: x являє булеву умову; Частина до : це те пропозицію , а частина після того, як це ще пропозицію.

У, наприклад,

int?

то ? оголошує нульовий тип і означає, що тип перед ним може мати нульове значення.


9
Я не бачу жодних стосунків між "?" декларація нульового типу та потрійний вираз. Голосування своєї відповіді, сер.
Gus Crawford

36
Я не згоден з коментарем, викладеним вище від Гуса. Питання показує, що можлива плутанина з потрійним виразом. Ця відповідь стосується цього питання.
Mario Levesque

Де б ви не використовували подібне порівняння з нулями? Всередині повернення, здається, це не дозволяється. return value ? value : "isNull";підказує мені, що string valueне перетворюється в bool.
C4d

Треба сказати, що це дуже суперечлива відповідь, особливо в порівнянні з іншими на це питання .. -1
FastTrack

Це має бути прийнятою відповіддю. Так як це чітко і точно. +1
JP Dolocanog

49

Зменшувані типи

Зменшувані типи є екземплярами структури System.Nullable. Нульовий тип може представляти нормальний діапазон значень для його базового типу значення плюс додаткове нульове значення . Наприклад, [ Nullable<Int32>], вимовляється "Nullable of Int32", може бути призначене будь-яке значення від -2147483648 до 2147483647, або йому може бути призначено нульове значення. [ Nullable<bool>] Може бути призначено значення true або false або null. Можливість присвоєння нулю числовим і булевим типам особливо корисна при роботі з базами даних та іншими типами даних, що містять елементи, яким не може бути призначено значення. Наприклад, булеве поле в базі даних може зберігати значення true або false або вони можуть бути невизначені.



6

практичне використання:

public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
  if (value == null)
  {
    return "bad value";
  }

  return someFunctionThatHandlesIntAndReturnsString(value);
}

1
Поки ОП все ще активна, через 5 років після того, як було поставлено запитання, відповідь може більше не бути актуальною.
Полуниця

10
мені це було 3 години тому :-)
AJBauer

3

Щоб додати відповіді вище, ось зразок коду

struct Test
{
    int something;
}
struct NullableTest
{
    int something;
}
class Example
{
    public void Demo()
    {
        Test t = new Test();
        t = null;

        NullableTest? t2 = new NullableTest();
        t2 = null;
    }
}

Це призведе до помилки компіляції:

Помилка 12 Неможливо перетворити null у "Test", оскільки це нерегульований тип значення

Зауважте, що для NullableTest немає помилки компіляції. (зверніть увагу на? у декларації t2)


2

int?це скорочення для Nullable<int>. Дві форми взаємозамінні.

Nullable<T>це оператор, який ви можете використовувати з типом значення, Tщоб змусити його приймати null.

Якщо ви цього не знаєте: типи значень - це типи, які приймають значення як int, boolі charт.д. ...

Вони не можуть приймати посилання на значення: вони створюють помилку під час компіляції, якщо призначити їм a null, на відміну від типів посилань , які, очевидно, можуть прийняти його.

Навіщо вам це потрібно? Тому що іноді змінні типу значення можуть отримувати нульові посилання, повернені чимось, що не дуже добре працює, як, наприклад, відсутня або невизначена змінна, повернута з бази даних.

Я пропоную вам прочитати документацію Microsoft, оскільки вона досить добре висвітлює тему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.