Какова цель вопросительного знака после типа (например: int? значение MyVariable)?

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

но я видел другое использование для него, но не могу найти объяснение этому использование ? оператора, например.

public int? myProperty
{
   get;
   set;
}

9 ответов


это означает, что рассматриваемый тип значения является тип nullable

Nullable типы являются экземплярами системы.Nullable struct. Ля nullable тип может представлять правильный диапазон значений для его базовый тип значения, плюс дополнительное значение null. Например, Nullable, произносится как "Nullable of Int32", может быть назначен любой значение от -2147483648 до 2147483647, или ему может быть присвоено значение null значение. Nullable можно присвоить значения правда, ложь или ноль. Возможность присвоения 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);
      }
  }
}

это сокращение для Nullable<int>. Nullable<T> используется с типами значений, которые не могут быть null.


на

x ? "yes" : "no"

на ? объявляет если предложение. Здесь:x представляет логическое условие; часть перед : - это затем предложение и часть после это другое предложение.

In, например,

int?

на ? объявляет тип nullable и означает, что тип перед ним может иметь значение null.


Типы Nullable

Nullable типы являются экземплярами Система.Nullable struct. нулевое тип может представлять нормальный диапазон значения для базового типа значения, плюс дополнительное значение null. Для например, [Nullable<Int32>], произносится "Nullable of Int32" может быть назначен любое значение от -2147483648 до 2147483647, или его можно назначить значение null. A [Nullable<bool>] может быть присваивается значение true или false, или ноль. Возможность присвоения null числовые и логические типы особенно полезно при работе с базы данных и другие типы данных содержащие элементы, которые могут быть присвоено значение. Например, Логическое поле в базе данных можно хранить значения true или false, или может быть не определено.


он объявляет, что тип nullable.


практическое использование:

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

  return someFunctionThatHandlesIntAndReturnsString(value);
}

чтобы добавить к ответам выше, Вот пример кода

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', потому что он не имеет значения null тип значения

обратите внимание, что для NullableTest нет ошибки компиляции. (Примечание ? в декларации t2)


int? Это сокращение для Nullable<int>, эти две формы являются взаимозаменяемыми.

Nullable<T> - это оператор, который можно использовать с типом значения T чтобы заставить его принять null.

в случае, если вы не знаете этого: типы значений типы, которые принимают значения как int, bool, char etc...

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

зачем вам это нужно? Потому что иногда переменные типа value могут получать нулевые ссылки, возвращаемые чем-то, что не очень хорошо работает, например отсутствующей или неопределенной переменной, возвращаемой из базы данных.

Я предлагаю вам прочитать Документация Microsoft потому что он охватывает эту тему довольно хорошо.


чтобы создать необязательный параметр, добавьте ? после типа, который вы хотите обернуть. Любой тип может быть необязательным, даже ваши собственные пользовательские типы. Вы не можете иметь пространство между типом и ?.

var name: String? = "Bob" // Create an optional String that contains "Bob"
var peter: Person? = Person() // An optional "Person" (custom type)

// A class with a String and an optional String property
class Car {
var modelName: String // must exist
var internalName: String? // may or may not exist
}