Pertanyaan Nullable vs. int? - Apakah ada perbedaan?


Tampaknya Nullable<int> dan int? setara dalam nilainya. Apakah ada alasan untuk memilih salah satu dari yang lain?

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

76
2017-10-26 23:14


asal


Jawaban:


Tidak ada perbedaan.

int? hanya singkatan untuk Nullable<int>, yang itu sendiri adalah singkatan untuk Nullable<Int32>.

Kode yang dikompilasi akan sama persis dengan yang Anda pilih untuk digunakan.


113
2017-10-26 23:16



Itu ? formulir hanyalah singkatan untuk tipe lengkap. Preferensi pribadi adalah satu-satunya alasan untuk memilih salah satu dari yang lain.

Detail lengkap sini.

Sintaksnya T? adalah singkatan untuk    Nullable<T>, dimana T adalah tipe nilai.   Kedua bentuk itu dapat dipertukarkan.


20
2017-10-26 23:17



Meskipun saya sepenuhnya setuju bahwa dalam banyak kasus mereka sama, saya baru saja menemukan situasi, ketika ada aku s perbedaan antara keduanya. Untuk detailnya, lihat pertanyaan ini, tetapi untuk memberi Anda contoh cepat di sini:

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
}

Baris pertama memberikan pesan kesalahan berikut:

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

Jika Anda ingin tahu tentang alasan yang tepat untuk ini, saya sangat menyarankan Anda untuk memeriksanya pertanyaan terkait, tetapi masalah dasarnya adalah bahwa dalam fase parsing setelah is (atau an as) operator, ketika kita menghadapi ? token kami periksa apakah berikutnya token bisa diartikan sebagai operator unary (& bisa menjadi satu) dan jika demikian: parser tidak peduli tentang kemungkinan ? Token menjadi pengubah jenis, itu hanya menggunakan jenis sebelum, dan akan mengurai sisanya seolah-olah ? Token adalah operator terner (sehingga parsing akan gagal).

Jadi, sementara secara umum int? dan Nullable<int> dapat dipertukarkan, ada beberapa kasus sudut ketika mereka menghasilkan hasil yang sama sekali berbeda, karena bagaimana parser melihat kode Anda.


15
2017-07-14 14:03



Tampaknya ada perbedaan antara keduanya ketika menggunakan generasi Entity Framework (EF) kode-pertama:

Ketika entitas Anda berisi properti yang dinyatakan seperti:

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

EF tidak akan menghasilkan properti nullable dan Anda harus memaksa generator untuk membuatnya nullable seperti:

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();
    }
}

Di sisi lain, jika Anda menyatakan entitas Anda seperti:

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

generator EF akan properti menghasilkan properti nullable dengan bidang nullable di tabel database yang sesuai.


4
2018-06-05 14:06



Nullable adalah tipe generik, tapi int? tidak.

Ada beberapa skenario di mana Nullable harus digunakan lebih int?

untuk misalnya: di sini Anda tidak dapat mengganti Nullable dengan int? 

bagaimana Anda dapat mengubah kode di bawah ini tanpa menggunakan 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;
      }
   }
}

1
2017-07-30 23:32