Değişken veri türlerini açıkça belirten 'var' anahtar sözcüğünü kullanma vs. [kapalı]


35

C #, her değişken bildirimi için çok amaçlı var anahtar sözcüğünü kullanmaya teşvik edilir miyim? Eğer evetse, aşağıdaki ifadede ondalık için M gibi değişken bildirimi içindeki değişmez değerler için bu özel karakterlerden bahsetmek zorunda mıyım:

var myDecimal = 14.5M;

Bir fark yaratırsa, C # ile bazı web geliştirme yapmaya çalışıyorum.


7
SO'da bir düzine dupe var (nerede IMHO'ya ait).

1
Aynı sorular C ++ 'a C ++ 0x repurposing ile geliyor auto.
David Thornley

5
C # derleyici ekibinden Eric Lippert kısa süre önce bunun hakkında blog yazdı: blogs.msdn.com/b/ericlippert/archive/2011/04/20/…
Tim Goodman

Bu sorunun altı milyarı var.
DeadMG

@DeadMG bu onları altı milyar bir yapar.
wassimans

Yanıtlar:


53

Var kullanımı konusunda çok fazla anlaşmazlık oldu. Genel kurallarım aşağıdaki gibidir.

  • Tür, ödevin sağ elinin bir kurucu olduğu zaman açıksa, var.
  • Yazma işlemi, örneğin bir LINQ sorgusu (ilk etapta var sebebi) gibi karmaşık olduğunda, var.
  • Değişkeninizin doğru yazıldığından emin olmak istediğiniz değişken türler için (örnek olarak Ondalık kodunuz), heceleyin.
  • Adsız türler var kullanmak zorunda.
  • Diğer tüm durumlarda tipi heceleyerek.

Temel olarak, amaç kodu okumayı kolaylaştırmaktır. Atamanın açık olduğu için var'ın yeterli olduğunu düşünüyorsanız, var'ı kullanın. Tam tür adını, gerekli olduğunu düşündüğünüzde okuyucu için bir ipucu olarak kullanın.


9
foreachHer öğenin türü hakkında değil, yalnızca bir koleksiyonun numaralandırılmasıyla ilgilendiğim ifadelerde 'var' kullanıyorum .
Adam Lear

1
Ve Jesse adsız türlerini işaret etti;)
Michael Brown

4
@AnnaLear bazen olsa yine de dikkat etmeniz gerekir. foreach (datatable'da var satırı. Satırlar) bu durumda var, beklendiği gibi DataRow değil bir nesnedir.
Thanos Papathanasiou

@ThanosPapathanasiou Elbette, evet. Aynı şey, Windows Forms'daki Controls koleksiyonu ve muhtemelen diğer durumlarda da geçerlidir.
Adam Lear

Değişkenimin türünden emin olmak istemediğim durumlar dışında genellikle
var'ı kullanıyorum (

14

Ne zaman kullanacağınız varbir programlama "kutsal savaş" dır. Tam olarak gerekli olduğu bir yer var: bir işlemin sonucu gibi bir adsız tür oluşturduğunda:

var result = new { Name = "John", Age = 35 };

Başka bir yerde, isteğe bağlı ve gerçekten başka durumlarda kullanmak veya kullanmamak kodlama standardına bağlı.

Ve evet, değişmezlerin derleyiciye sağ tarafta ne olduğunu bilmeleri için özel karakterlere ihtiyacınız olacak. Örnekte, olmadan M, varsayılan doubledeğil decimal.


1
anonim türleri hakkında her şeyi unuttum!
Michael Brown

Son işimde "var" anahtar kelimesini kullanmaya devam edersem kovulacağımı söylemiştim ...
hanzolo 18:13

Bu aşırı, ama şirketinizin girişimi. Yine de "son" işin olmasına sevindim! :)
Jesse C. Dilimleme

7

MSDN'den :

Ancak, var kullanımı en azından kodunuzu diğer geliştiriciler için anlaşılmasını zorlaştırma potansiyeline sahiptir. Bu nedenle, C # belgeleri genellikle yalnızca gerektiğinde var kullanır.

Gerçekten, gerçekten örtük yazmayı sevmiyorum. Yüzeyde kodu daha okunaklı hale getirme eğilimindedir, ancak yol boyunca birçok soruna yol açabilir. Bir dev değişken başlatıcıyı değiştirirse, örneğin

var myFloat=100f;

için

var myFloat=100;

veya

var myFloat=100.0;

Tür değişecek ve tüm derleyici hataları ile sonuçlanacak ya da bir web görünümündeyseniz ve görünümlerinizi önceden derlemek için post-build adımını kullanmıyorsanız, etkili bir şekilde yakalanmayacak bir dizi çalışma zamanı hatası dağıtım öncesi sınama.

Kapalı yazma da her yerde çalışmaz (aynı MSDN bağlantısından)

var, yalnızca aynı değişkende yerel bir değişken bildirildiğinde ve ilklendirildiğinde kullanılabilir; değişken null değerine, bir yöntem grubuna veya adsız bir işleve başlatılamıyor.

sınıf kapsamındaki alanlarda var kullanılamaz.

Var kullanılarak bildirilen değişkenler, başlatma ifadesinde kullanılamaz. Başka bir deyişle, bu ifade yasaldır: int i = (i = 20); ancak bu ifade derleme zamanı hatası veriyor: var i = (i = 20);

Birden çok örtülü olarak yazılan değişkenler aynı ifadede başlatılamaz.

Var adlı bir tür kapsam dahilindeyse, var anahtar sözcüğü bu tür adına çözümlenir ve dolaylı olarak yazılmış yerel değişken bildiriminin bir parçası olarak değerlendirilmez.

Kodunuzu tutarlı tutmak (bu durumda, her yerde açık yazarak kullanmak) çok, çok iyi bir şeydir. Benim düşünceme göre var, tembel ve gerçek bir fayda sağlamaz ve zaten karmaşık bir süreçte başka bir potansiyel başarısızlık noktası sunar.

2017 Güncellemesi

Fikrimi tamamen değiştirdim. C # ile çalışırken varçoğu zaman kullanıyorum (arayüz tipi değişkenler ve benzeri şeyler hariç). Okunabilirliği artıran kısa kodu tutar. Yine de, - çözülen türün gerçekte ne olduğuna dikkat edin.


Fikrinizi neyin değiştirdiğini merak ederek @ 3Dave. Orijinal noktanıza hala% 100 katılıyorum: "var tembel ve gerçek bir fayda sağlamaz ve zaten karmaşık bir süreçte başka bir potansiyel başarısızlık noktası ortaya koyuyor".
Dan

@Dan Gerçekten okunabilirliğe geldi. Yetkili bir geliştirici, bir bildirimin ilklendirme aşamasında ne olduğunu derhal belirleyebilir. Tıpkı this.her yerde kullanmamak ya da hala inanılmaz derecede sinir bozucu bulduğum bir şeye söylemek System.Blah.SomeTypeyerine using, daha fazla kısa öz kod - en azından benim için - görsel olarak ayrıştırmak daha kolay. Açık yazmanın doğru seçim olduğu birçok senaryo vardır. Fakat bu günlerde, bir dil avukatından daha az kapıya girip temiz kod almaya çalışıyorum.
3Dave

@Dan (Tabii ki, ben de kullandığı o adamım using namespace std;. .Cpp dosyalarında (Değil başlıkları, ben önlemek için tercih ediyorum olarak katran ve tüylü olan).
3Dave

3

C # Referansı, bu yapının iyi veya kötü kullanımını gösteren aşağıdakileri gösterir:

Aşağıdaki örnekte iki sorgu ifadesi gösterilmektedir. İlk ifadede, var kullanımına izin verilir, ancak zorunlu değildir, çünkü sorgu sonucunun türü açıkça bir IEnumerable olarak belirtilebilir. Ancak, ikinci ifadede, sonuç anonim türlerden oluşan bir koleksiyon olduğundan ve bu türün adı derleyicinin kendisi dışında erişilebilir olmadığından var kullanılmalıdır. Örnek 2'de, foreach yineleme değişkeni öğesinin de örtük olarak yazılması gerektiğini unutmayın.

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }

0

Var anahtar sözcüğü, derleyiciden yalnızca var tür değişkeni türünü otomatik olarak algılamasını ister. Bu nedenle, ondalık bir değişkeni var değişkeninde saklamak istiyorsanız, m'yi kullanmanız gerekir. Aynı şekilde bir dizgiyi saklıyorsanız, onu tırnak işaretleri içine almanız gerekir.


0

Benim için aşağıdaki durumlarda var kullanmıyorum:

  • Değişkenimin türünden emin olmak istediğimde (örneğin, kullanılan türün çift olduğundan ve ondalık olmadığından emin olun ve bu büyük bir güven bana!)
  • Polimorfik kod gibi Fruit foo = new Apple();. Bu durumda, var olanı önlemek ve kullanmaktan kaçınmak olduğunu düşünüyorum (burada Meyve) kod mantığının daha iyi anlaşılmasını ve olası hataların sınırlandırılmasını daha iyi anlamaya izin vererek daha iyidir (Var ile polimorfik kavramı kontrol etmeden!)

Gerisi için, duruma ve geliştiricinin geçmişine bağlı olduğunu düşünüyorum. PHP dünyasından bazı insanlar değişken tiplerine dikkat etmeyi tercih etmeyeceklerdir ve Java dünyasından bazı insanlar var'in bir sapkınlık olduğunu ve ne kadar fazla olsa o kadar iyi olduğunu düşüneceklerdir.

Kişisel görüşünüzü vermeniz gerekecek :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.