Soru Nullable vs int? - Fark var mı?


Görünüşe göre Nullable<int> ve int? değerde eşdeğerdir. Birini diğeri seçmek için herhangi bir sebep var mı?

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

76
2017-10-26 23:14


Menşei




Cevaplar:


Fark yok.

int? sadece kısaydı Nullable<int>kendisi için kestirme olan Nullable<Int32>.

Derlenmiş kod, kullanmayı seçtiğiniz hangisi ile aynı olacaktır.


113
2017-10-26 23:16



... önce EF kodunu kullanmadığınız sürece. Cevabımı aşağıya bakın. - Maciej
Ne yazık ki bu kesinlikle doğru olmayan bazı köşe durumları var. Bunu gör Cevap. - qqbenq


? form tam tip için sadece bir shorthand. Kişisel tercih, diğerini seçmenin tek sebebidir.

Tüm detaylar İşte.

Sözdizimi T? için kısa    Nullable<T>, nerede T bir değer türüdür.   İki form birbiriyle değiştirilebilir.


20
2017-10-26 23:17



... ya da okunabilirlik. - adrianbanks
@adrianbanks - kesin - Steve Townsend


Çoğu durumda aynı olduklarını tamamen kabul etsem de, son zamanlarda bir durumla karşılaştım. olduğu Bu ikisi arasında bir fark. Gory detayları için bkz. bu soruama burada hızlı bir örnek vermek için:

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
}

İlk satır aşağıdaki hata iletilerini verir:

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

Bunun nedenini merak ediyorsanız, gerçekten kontrol etmenizi öneririz. bağlantılı soruAncak temel sorun, ayrıştırma aşamasında is (ya da asOperatör, yüz yüze geldiğimizde ? eğer biz kontrol edelim Sonraki jeton kutu tek operatör olarak yorumlanabilir (& bir tane olabilir) ve eğer öyleyse: ayrıştırıcı, ? tote bir tür değiştirici, basitçe önce bu tür kullanır ve geri kalanını sanki ? belirteç üçlü bir operatördü (böylelikle ayrıştırma başarısız olur).

Yani, genel olarak int? ve Nullable<int> Değiştirilebilir, ayrıştırıcı kodunuzu nasıl gördüğünden dolayı tamamen farklı sonuçlar ürettiklerinde bazı köşe durumları vardır.


16
2017-07-14 14:03



İlk dava test, bir parantez ile sabitlenmiştir, yani var test = (a is int?) & b;. İle de sabitlenebilir var test = a is int? && b;ve buna göre b Basit bir değer parametresidir (değerlendirmede yan etkisi yoktur) tercih etmek garip gözükür &üzerinde &&. - Jeppe Stig Nielsen
Bu özel sözdiziminde, ? anahtar bir karakterdir. - Pete Garafano
Bağlantılı soruyu ve cevabı gör, yorumların hepsi oraya hitap ediyor :) Bu bilgiyi buraya ekledim, çünkü iki form arasında bir fark yarattığından, ilgili olduğunu hissettim ve sadece sözdizimsel şeker olmadığını kanıtlıyor. - qqbenq
Jeppe doğru. Bu yorumlama değil çünkü int? üçlü bir operasyon olarak (var test = a is int? <return if true> : <return if false>), null olmayan bir int. - Levi Fuller
Ayrıca @Jeppe ... & bir bit ise VE && mantıksal operatördür. Örneğin, sonuç bit için biti değerlendirir ... (<decimal> == <ikili>) 1 == 01 & 2 == 10... (1 & 2) == 0 - Levi Fuller


Kod ilk Entity Framework (EF) nesli kullanılırken ikisi arasında fark vardır:

Varlığınız, aşağıdaki gibi bildirilen bir mülk içerdiğinde:

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

EF, bir nullable özellik üretmeyecek ve jeneratörü nullable yapmak için zorlamak zorunda kalacaksınız:

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ğer taraftan, varlığınızı şöyle bildirirseniz:

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

EF jeneratörü, ilgili veritabanı tablosunda nullable bir alana sahip bir nullable özellik üretecektir.


4
2018-06-05 14:06



Bu gerçekten talihsiz bir şey. - siride
Bu senin başka bir tane olduğunu gösteriyor. Nullable bir yerde tanım, çünkü yerleşik Nullable<T>EF'in ikisi arasındaki farkı görmesi mümkün değil. EF üyeleri onlara farklı davranmak istese bile yapamadılar. - hvd
Birisi bunu doğruladı mı? (olumsuz oylar nedeniyle sadece biraz ihtiyatlı) - RayLoveless
@RayL Hayır Bu böyle değil. Bu cevap doğru değil ve hvd işaret ettiği gibi imkansız. - Shoe
EF kodunun kod şablonları kullanılarak üretildiği düşünüldüğünde, bu aslında mümkün olabilir. Cevabım deneyimlerime ve sahip olduğum sorunu düzeltmemdeki değişiklikime dayanıyor. Ayrıca, bazı insanlar yukarı-oylara dayanan bir durum olduğunu fark etmiş gibi görünüyor. - Maciej


null genel bir türüdür, ancak int? değil.

Bazı senaryolar var. null üzerinde kullanılmalı int?

örneğin: burada değiştiremezsiniz null ile int? 

Aşağıdaki kodu kullanmadan nasıl değiştirebilirsin null?

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



private T? val gayet iyi çalışıyor. - johnnyRose
Soru, genel türler hakkında soru soruyorsa sorun olabilir, ancak soru int belirtti, bu yüzden değil Nullable<T> onun Nullable<int> - Andrew