Обнуляемой и Инт? - Есть ли разница?


видимо Nullable<int> и int? эквивалентны по стоимости. Есть ли какие-то причины, чтобы выбрать один из них?

Nullable<int> a = null;
int? b = null;
a == b; // this is true
5 76

5 ответов:

никакой разницы.

int? - Это просто сокращение для Nullable<int>, что само по себе является сокращением для Nullable<Int32>.

скомпилированный код будет точно таким же, какой бы вы ни выбрали.

The ? форма-это просто стенография для полного типа. Личные предпочтения-это единственная причина, чтобы выбрать один над другим.

полная информация здесь.

синтаксис T? является сокращением для Nullable<T>, где T - тип значения. Эти две формы взаимозаменяемы.

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

void Test<T>(T a, bool b)
{
    var test = a is int? & b;              // does not compile
    var test2 = a is Nullable<int> & b;    // does compile
}

в первой строке выводятся следующие сообщения об ошибках:

error CS1003: Syntax error, ':' expected 
error CS1525: Invalid expression term ';'

Если вам интересно узнать точную причину этого, я очень рекомендую вам проверить уже связаны вопрос, но основная проблема заключается в том, что в фазе разбора после is (или as) оператор, когда мы сталкиваемся с ? токен мы проверяем, если далее маркер можете интерпретируется как унарный оператор (& может быть один) и если да: парсер не заботится о возможности ? токен является модификатором типа, он просто использует тип перед ним, и будет анализировать остальные, как если бы ? токен был тернарным оператором (таким образом, разбор потерпеть неудачу.)

Итак, пока вообще int? и Nullable<int> взаимозаменяемы, есть некоторые угловые случаи, когда они дают совершенно разные результаты, из-за того, как парсер видит ваш код.

по-видимому, существует разница между ними при использовании поколения Entity Framework (EF) code-first:

когда ваша сущность содержит свойство, объявленное как:

public class MyEntity
{
    public Nullable<int> MyNullableInt { get; set; } 
}

EF не будет генерировать свойство nullable, и вам придется заставить генератор сделать его nullable следующим образом:

public class YourContext : DbContext
{
    public DbSet<MyEntity> MyEntities{ get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<MyEntity>().Property(x => x.MyNullableInt).IsOptional();
    }
}

С другой стороны, если вы объявляете свою сущность как:

public class MyEntity
{
     public int? MyNullableInt { get; set; }
}

генератор EF будет свойство генерировать свойство nullable с a поле nullable в соответствующей таблице базы данных.

Nullable является общим типом, но int? нет.

в некоторых случаях Nullable должен использоваться над int?

например: здесь вы не можете заменить Nullable С int?

Как вы можете изменить приведенный ниже код без использования Nullable?

class LazyValue<T> where T : struct
{
   private Nullable<T> val;
   private Func<T> getValue;

   // Constructor.
   public LazyValue(Func<T> func)
   {
      val = null;
      getValue = func;
   }

   public T Value
   {
      get
      {
         if (val == null)
            // Execute the delegate.
            val = getValue();
         return (T)val;
      }
   }
}