Обнуляемой и Инт? - Есть ли разница?
видимо Nullable<int>
и int?
эквивалентны по стоимости. Есть ли какие-то причины, чтобы выбрать один из них?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
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; } } }