C # 'da var anahtar kelimesinin kullanımı


406

C # 3'te 'var' anahtar kelimesinin kullanımı ile ilgili meslektaşları ile görüştükten sonra insanların var yoluyla tür çıkarmanın uygun kullanımları hakkında ne düşündüklerini merak ettim.

Örneğin ben oldukça tembel şüpheli durumlarda var örneğin kullanılır: -

foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.

Var'ın daha meşru kullanımları şunlardır: -

var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.

İlginçtir ki LINQ biraz gri bir alan gibi görünüyor, örneğin: -

var results = from r in dataContext.SomeTable
              select r; // Not *entirely clear* what results will be here.

IEnumerable'ı uygulayan bir tür olacağı sonuçların ne olacağı açıktır, ancak yeni bir nesneyi bildiren bir varlıkla aynı şekilde tamamen açık değildir.

Nesnelere LINQ söz konusu olduğunda daha da kötüdür, örneğin: -

var results = from item in someList
              where item != 3
              select item;

Bu, equeachent foreach (someList içindeki var item) {// ...} equamentent'ten daha iyi değildir.

Burada tip güvenliği ile ilgili gerçek bir endişe var - örneğin, bu sorgunun sonuçlarını IEnumerable <int> ve IEnumerable <double> kabul eden aşırı yüklenmiş bir metoda yerleştirirsek, arayan istemeden yanlış türde geçebilir.

var yok istemeden bir yönteme türü yanlış geçerken, aşırı yükler ortalama derleyici hataları çıkarılacak olmayabilir zaman büyütülmüş bir şeyi güçlü yazarak korumak ama soru tipi tanımı hemen fark edilmeyebilir için çok tehlikeli gerçekten olup olmadığıdır.


68
Var kullanmak iyidir, ancak "türü anlamak zorunda değilim" bunu kullanmak için çok kötü bir neden gibi görünüyor ... türün ne olduğunu bilmeniz gerekiyor , var yazmaktan kaçınmak için sadece bir kısayol
Thomas Levesque

53
var i = 0;== başarısız! var c = new CrazyFrigginLongClassName();== kazan!
dotjoe

6
"Var ayrıca bana VB / VBA varyant tipini de hatırlatıyor. Yeri de vardı. (Yıllar önce) kullanımının istenilenden daha az olduğunu hatırlıyorum ve oldukça kaynak açtı." <- C # 'var' türü VB / VBA varyant türü ile ilgisi yoktur, bu bir baiting soru olduğunu gösterir.
user7116

20
var readabilityBeDamned = true;
spoulson

9
Burada belirtilen tüm örneklerle ilgili sorun, ONE kod satırına bakmamızdır. "Var" bildirimlerinin ardındaki satırı, birbiri ardına gördüğümde, kontrolden çıkar. Okunabilirlik özneldir, ancak varili olarak kullanılandan çok daha fazla istismar görüyorum.
jro

Yanıtlar:


293

Hala varbazı durumlarda kodu daha okunabilir hale getirebilir düşünüyorum . Bir Orders özelliği ile bir Müşteri sınıfı varsa ve bunu bir değişkene atamak istiyorsanız, ben sadece bunu yapacağım:

var orders = cust.Orders;

Müşteri.Orders olup olmadığını umursamıyorum IEnumerable<Order>, ObservableCollection<Order>ya da BindingList<Order>- tek istediğim, bu listeyi tekrarlamak ya da daha sonra bir şey elde etmek için hafızada tutmaktır.

Yukarıdaki beyanı aşağıdakilerle karşılaştırın:

ObservableCollection<Order> orders = cust.Orders;

Bana göre, tür adı sadece gürültü. Geri dönüp parça aşağı Customer.Orders türünü değiştirmeye karar Ve eğer (dan söylemek ObservableCollection<Order>için IList<Order>ben ilk RMD ediyorum eğer yapmak zorunda olmaz bir şey - o zaman ben de o bildiriyi değiştirmeye gerek) yer.


48
Ben kod okurken önümde açık türü olması seviyorum. Burada tür olmadan "cust.Orders" ne olduğunu nasıl bilebilirim? Evet, öğrenmek için faremin üzerine gelebilirim, ama neden yapmalıyım? :)
Jon Tackabury

77
Ama mesele şu ki, genel olarak önemli değil. Sipariş verilen numaralandırma yapabileceğiniz bir şeydir (örneğin, herşeyi öngörmek), ne tür olduğu önemli değildir. Ekstra kod sadece amacı okumaya engel olur.
Matt Hamilton

67
Ama sadece bu cust.Orders "numaralandırmak bir şey" gerekiyorsa o zaman IEnumerable <Order> olarak ilan etmiyor bu gereksinimi açık ve net yapmak? Var olarak bildirilmesi, bu gereksinimi etkili bir şekilde kaybettiğiniz anlamına gelir.
GrahamS

5
@jon ve IEnumerbal siparişleri = cust.Orders siparişleri (siparişlerde değişken sipariş) nasıl bir fark yaratır? IEnumerable'ın söylediği tek şey, bunu bir foreach'a koyabileceğinizdir, ancak aşağıdaki satırdan bunu zaten biliyordunuz
Rune FS

18
“IEnumerable'ın söylediği tek şey onu bir foreach'e koyabileceğinizdir” - aynı zamanda yapabileceğiniz tek şeyin numaralandırılması niyetini de ifade eder . Var kullanmak somut toplama türündeki kamu üyelerine erişim sağlar ve bilgi verir.
Joe

167

Çok kullanıyorum var. Bunun kodun okunabilirliğini azalttığı yönünde eleştiriler var, ancak bu iddiayı destekleyecek hiçbir argüman yok.

Kuşkusuz, hangi türle uğraştığımız açık değil. Ne olmuş yani? Bu aslında ayrıştırılmış bir tasarımın noktasıdır. Arayüzlerle uğraşırken, bir değişkenin sahip olduğu tiple kesinlikle ilgilenmezsiniz. varGerçek, çok öteye taşıyor, ama argüman bakış bir okunabilirliği açısından aynı kalır düşünüyorum: programcı aslında değişkenin tipinde ziyade değişken hizmet ile ilgilenen edilmemelidir yapar . Bu nedenle Microsoft, tür çıkarımını “ördek yazarak” da çağırır.

Peki, bir değişkeni kullanarak beyan ettiğimde ne yapar var? Kolay, IntelliSense bana söylediklerini yapıyor. IDE'yi görmezden gelen C # ile ilgili herhangi bir akıl gerçek değildir. Uygulamada, her C # kodu IntelliSense'i destekleyen bir IDE'de programlanmıştır.

varBildirilen bir değişken kullanıyorsam ve değişkenin ne için olduğunu karıştırırsam, kodumda temelde yanlış bir şey var. varnedeni değil, sadece semptomları görünür kılar. Elçiyi suçlama.

Şimdi, C # ekibi, yalnızca anonim bir tür oluşturan bir LINQ ifadesinin sonucunu yakalamak için kullanılması vargereken bir kodlama kılavuzu yayınladı (çünkü burada gerçek bir alternatifimiz yok ). Peki, vidala. C # ekibi bana bu kılavuz için sağlam bir argüman vermediği sürece, bunu görmezden geleceğim çünkü profesyonel ve kişisel düşünceme göre, bu tamamen baloney. (Üzgünüm; söz konusu yönerge ile ilgili bir bağlantım yok.)var

Aslında, neden kullanmamanız gerektiğine dair bazı (yüzeysel) iyi açıklamalar var varama yine de büyük ölçüde yanlış olduklarına inanıyorum. “Aranabilirlik” örneğini ele alalım: yazar , kullanılan varyerleri aramayı zorlaştırdığını iddia ediyor MyType. Sağ. Arayüzler de öyle. Aslında, neden sınıfın nerede kullanıldığını bilmek isteyeyim? Nerede başlatıldığıyla daha fazla ilgilenebilirim ve bu hala aranabilir olacaktır çünkü kurucusunun bir yere çağrılması gerekir (bu dolaylı olarak yapılsa bile, tür adı bir yerde belirtilmelidir).


14
İyi bir IDE'de, sınıf kullanımını elde etmek için bir metin araması kullanmazsınız, IDE'yi ayrıştırma ağacına dayalı olarak yaparsınız, ancak başka türlü nesne türlerini tanımlar. Statik yazımdan bahsettiğimiz için, anonim türler dışında her şey bulacaktır.
Dustman

6
Hiçbir dokümantasyon ve liberal var kullanımı ile 100k kaynak satırını devralmak nefret ediyorum. Özellikle var'ı yararlı olmayan değişken adlarıyla birleştirirseniz. Bir noktayı (veya anonim türlerle uğraşırken) gösterirken ancak üretim kodunda yararlı olduğunu görebiliyor muydunuz?
Shea

7
Arnshea: zaten orada gerçek soruna işaret ettiniz: işe yaramaz değişken isimleri ve eksik belgeler . varKarışıklığa neyin katkıda bulunduğunu gerçekten göremiyorum . Elbette, bir değişkenin tipini / boyutunu vurgulamanın önemli olduğu durumlar olabilir (örneğin, düşük seviye bit işlemleri). Bu iyi: hiç kimse bunun varsadece kullanılması gerektiğini iddia etmedi . Kural basit: gerçekten karışıklığa neden oluyorsa, kullanmayın.
Konrad Rudolph

17
Gördüğüm var var her örnek programcı anlamsız değişken adları kullanacağını varsayar. Ama belki de bu yüzden var, açıkça bir tür belirtmekten daha iyidir: Programcıyı iyi değişken isimleri bulmaya zorlar.
Ryan Lundy

16
Microsoft ayrıca tür çıkarımını “ördek yazarak” olarak adlandırır. - Gerçekten mi? Şok olurdum ...
Anton Tykhyy

118

Var, bence, C # iyi bir şey tm . Bu şekilde yazılan herhangi bir değişken hala güçlü bir şekilde yazılır, ancak türünü, tanımlandığı ödevin sağ tarafından alır. Tür bilgileri sağ tarafta bulunduğundan, çoğu durumda, sol tarafa da girilmesi gereksiz ve aşırı ayrıntılıdır. Bunun tip güvenliğini azaltmadan okunabilirliği önemli ölçüde artırdığını düşünüyorum.

Benim açımdan, değişkenler ve yöntemler için iyi adlandırma kuralları kullanmak, okunabilirlik açısından açık tip bilgiden daha önemlidir. Tip bilgisine ihtiyacım varsa, her zaman değişkenin (VS'de) üzerine gelip alabilirim. Bununla birlikte, genellikle, okuyucu için açık tip bilgi gerekli olmamalıdır. Geliştirici için, VS'de değişkenin nasıl bildirildiğine bakılmaksızın hala Intellisense alırsınız. Tüm bunları söyledikten sonra, türü açıkça bildirmenin mantıklı olduğu durumlar olabilir - belki de a döndüren bir yönteminiz vardır List<T>, ancak bunu birIEnumerable<T>yönteminizde. Arabirimi kullandığınızdan emin olmak için arabirim türünün değişkenini bildirmek bunu açık hale getirebilir. Ya da, belki de, başlangıç ​​değeri olmayan bir değişkeni bildirmek istersiniz - çünkü hemen bazı koşullara dayalı bir değer alır. Bu durumda tipe ihtiyacınız vardır. Tür bilgisi yararlı veya gerekliyse, devam edin ve kullanın. Yine de, genellikle gerekli olmadığını ve kod çoğu durumda onsuz okumak daha kolay olduğunu hissediyorum.


3
Genel olarak katılıyorum. Bence burada kilit nokta, niyetin açık olduğundan emin olmaktır. Takımdaki çoğunluk geliştiricilerine açık değilse, o zaman zararlı, yararlı değil. Bununla birlikte, ben şahsen bunun BÜYÜK bir hayranıyım, ancak takımımdaki diğer geliştiriciler niyetimi belirlemekte sorun yaşadığında kendimi biraz dizginlemek zorunda kaldım. Git şekil.
Steve Brouillard

3
Eh, yazım solda olduğunda okumayı daha kolay buluyorum. ReSharper kullanarak, sağdaki türü yeniden yazmak zorunda değilim, bu yüzden beni rahatsız etmiyor.
BlueRaja - Danny Pflughoeft

1
@BlueRaja - İyi değişken isimleri kullanmanın genellikle anlamak için gerçek tiple uğraşma ihtiyacını ortadan kaldırdığını düşünüyorum. Intellisense hala "var" tanımlı değişkenler üzerinde kullanılabilir, bu yüzden kodlama sırasında üzerinde bir yöntem / özellik seçmek için türü bilmek gerekmez.
tvanfosson

2
Ne zaman kodlama hakkında o kadar kod okumak zorunda olduğu kadar değil.
BlueRaja - Danny Pflughoeft

1
Ben sadece kalın tarafında olması gerekir, ben iyi Yöntem ve değişken isimleri ve düzgün okuduğum kodu anlamak için üzerinde işletilen türleri anlamak gerekir. Bence haklısın, daha büyük sorunların belirtileri var. Güven biri. Kodun göründüğü gibi çalıştığından emin olmak için kullanılan türlerden emin olmanız gerekir .
AnthonyWJones

91

Bunların hiçbiri kesinlikle doğru değil; varokunabilirlik üzerinde olumlu ve olumsuz etkileri olabilir. Bence, varaşağıdakilerden biri doğru olduğunda kullanılmalıdır:

  1. Tür anonimdir ( bu durumda var olması gerektiği için burada başka seçeneğiniz yoktur )
  2. Tipi tayin tanımlanması üzerine belirgin dayanır (örneğin var foo = new TypeWithAReallyLongNameTheresNoSenseRepeating())

varsözdizimsel şeker olduğu için hiçbir performans etkisi yoktur; derleyici tipe girer ve IL'ye derlendiğinde onu tanımlar; bu konuda gerçekten dinamik bir şey yok.


1
Her ikisi de aynı fikirdeyim, ancak ikinci durum üzerinde uzun kısıtlamalar olsa da, eğer bir tür uzunsa, genellikle çok sayıda iç içe argüman içeren genel bir türdür, bu durumda, güçlü bir şekilde yazılan "TypeWithAReallyLongNameTheresNoSenseRepeating'e eşdeğer ShortType" daha mantıklı
İyon Todirel

12
Dini bir savaşa girme arzum yok, ama ben şahsen İyon'a katılmıyorum. Kısaltılmış ve muhtemelen belirsiz daha kısa bir tür adından çok uzun, ama çok kesin bir tür adı (ala Bob Martin Amca) tercih ederim. Yapay olarak adın uzunluğunu şişirmeyi kabul etmediğim uyarıyı da ekleyeceğim. 5 karakter, amacı açıkça gösteren kısa bir ad oluşturuyorsa, 25 değil 5 kullanın.
Steve Brouillard

2
@Steve: Seninle aynı fikirdeyim; bir "kısa tip" oluşturmak (ki bu sadece belirli bir isim türünden miras olarak kısaltmak amacıyla miras almak anlamına geliyor) iyi bir uygulama değildir; jenerik türden herhangi bir kurucuyu çoğaltmanızı ve içinden geçmenizi ve ayrıca genel türden işleve farklı bir tür geçirmenizi engellemenizi gerektirir. Kalıtım bir typedefzamanlar gibi değil.
Adam Robinson

7
Kullan vartipi açıktır zaman? Belki, ama gerçek kazanç tipin önemli olmadığı zamandır. Böyle bir şey yapıyorsanız var customers = whatever; var query = from c in customers select stuff, tam olarak 'müşterilerin' ne olduğu önemli değildir. Nasıl kullanabileceğiniz açıktır ve bu yeterlidir. Ve eğer gerçek tip hantalsa, onu bastırmaya değer.
Joren

2
@Kristoffer: Etiketlerin karışıklığını ortadan kaldırmak istemeyi anlayabilirim, ancak bunları bir sınıfa sarmak kabul edilebilir bir alternatif değildir, çünkü daha sonra bu genel türün diğer (meşru) alt sınıflarının olma olasılığını kestiğinizden geçerli bir parametre. using ShortType = LongGenericType<A,B,C>Dosyanın üst kısmında bir yönerge kullanmayı tercih ederim , çünkü aynı okunabilirliği verir, kurucuları yeniden oluşturmanızı gerektirmez ve alt sınıfları aday olmaktan çıkarmaz.
Adam Robinson

68

C # ekibinde Kıdemli Yazılım Tasarım Mühendisi Eric Lippert'den:

varAnahtar kelime neden tanıtıldı?

Biri bugün var, biri 3.0'da ortaya çıkacak iki neden var.

İlk neden, bu kodun tüm fazlalık nedeniyle inanılmaz derecede çirkin olması:

Dictionary<string, List<int>> mylists = new Dictionary<string, List<int>>();

Ve bu basit bir örnek - daha kötü yazdım. Aynı şeyi iki kez yazmak zorunda kaldığınızda, kaldırabileceğimiz bir artıklık budur. Yazmak çok daha hoş

var mylists = new Dictionary<string,List<int>>();

ve derleyiciye ödeve dayalı türün ne olduğunu bulmasına izin verin.

İkincisi, C # 3.0, anonim türler sunar. Tanıma göre anonim türlerin adı olmadığından, türü anonim ise, değişkenin türünü başlangıç ​​ifadesinden çıkarabilmeniz gerekir .

Vurgu madeni. Bütün makale, C # 3.0 hala statik olarak yazılmış, dürüst! ve takip eden dizi oldukça iyi.

Bunun variçin bu. Diğer kullanımlar muhtemelen çok iyi çalışmayacaktır. JScript, VBScript veya dinamik yazarak yapılan herhangi bir karşılaştırma toplam ranzadır. Not yine varedilir gerekli .NET içinde diğer bazı özellikleri iş var için.


Lippert'in iddiasını tuhaf buluyorum. Kimse ikinci sınıf adını yazmaz, Intellisense'in onlar için yazmasına izin verir, ancak sonra döner ve var'ın daha iyi olduğunu iddia eder, çünkü derleyici / Intellisense bunu çalıştırır. Her iki yöne de sahip olamazsınız!
Dave

5
C # ekibi zekayı kontrol etmez, derleyiciyi kontrol eder. Her durumda ana sorun bu değildir. Ben var yazmak sadece tasarruf yazarak 100 puan yapmış olurdu sanmıyorum.
Dustman

@Dustman: var yazmayı hiç kaydetmiyor. Daha fazla yazmanızı sağlar!
Piotr Perak

53

Ben var kullanımı akıllıca seçilmiş değişken isimleri ile birleştirilmesi gerektiğini düşünüyorum.

Ben böyle olmadığı sürece bir foreach ifadesinde var kullanarak hiçbir sorun yok:

foreach (var c in list) { ... }

Daha çok böyle olsaydı:

foreach (var customer in list) { ... }

... sonra kodu okuyan birisinin "liste" nin ne olduğunu anlama olasılığı daha yüksektir. Liste değişkeninin adı üzerinde kontrolünüz varsa, bu daha da iyidir.

Aynı durum diğer durumlar için de geçerlidir. Bu oldukça işe yaramaz:

var x = SaveFoo(foo);

... ama bu mantıklı:

var saveSucceeded = SaveFoo(foo);

Her biri kendi başına, sanırım. Kendimi bunu yaparken buldum, ki bu sadece çılgınca:

var f = (float)3;

Bir çeşit 12 adımlı var programına ihtiyacım var. Benim adım Matt ve ben (ab) var.


6
Peki "var f = (float) 3;" "var f = 3f" veya "var f = 3.0 (tek duyarlıklı emişlere neden olur)" olmalıdır.
MichaelGG

3
Heh evet 3f veya 3.0 gitmek için bir yol! Biz var manyaklar birbirine yapışmak zorunda!
Matt Hamilton

27
Bu ilk örnekteki asıl sorun "liste" dir, "c" değil. ne "listesi" ? "liste", "müşteriler" veya "customerWhoOweMoney" veya "currentCustomers" veya daha açıklayıcı bir şekilde yeniden adlandırılmalıdır. Ve bunu elde ettikten sonra, "c" olduğu gibi kalabilir, çünkü ne içereceğini zaten biliyorsunuzdur.
Ryan Lundy

4
Merhaba Matt! Benim adım Kenny ve ben bir varaddict'im.
kenny

var MattHamil = "Luke Skywalker"; // bir ton çıkardı
Binoj Antony

40

Bakım modunda yeni geliştirmeden çok daha fazla zaman harcadığınız varsayımına dayanarak "makineler değil insanlar için kodlar" ahlakını kabul ettik.

Benim için bu, derleyicinin değişkenin ne tür olduğunu "bildiğini" argümanı geçersiz kılar - elbette, derleyici kodunuzun derlenmesini durdurduğundan, ancak bir sonraki geliştirici kodu okurken ilk kez geçersiz kod yazamazsınız 6 ay içinde değişkenin ne yaptığını doğru ya da yanlış yaptığını ve sorunların nedenini hızlı bir şekilde belirleyebilmeleri gerekir.

Böylece,

var something = SomeMethod();

kodlama standartlarımız tarafından yasaklanmıştır, ancak okunabilirliği arttırdığı için ekibimizde aşağıdakiler teşvik edilmektedir:

var list = new List<KeyValuePair<string, double>>();
FillList( list );
foreach( var item in list ) {
   DoWork( item ); 
}

4
Ben ("makineler için değil, insanlar için kod") mükemmel bir kılavuz olarak buldum - takip daha iyi kod sonuçlanabilir ve erken optimizasyon önlemek yardımcı olur.
Thanatos

3
Var list = yeni KeyValuePair <string, double>? Benim için bir liste her şeyden daha fazlasına sahip olabilir.
TTT

"İnsanlar için kod, makineler değil" - amen.
user1068352

39

Kötü değil, daha sübjektif olma eğilimi olan daha stilistik bir şey. Var kullandığınızda ve kullanmadığınızda tutarsızlıklar ekleyebilir.

Başka bir endişe konusu, aşağıdaki çağrıda sadece döndürülen koda bakarak söyleyemezsiniz CallMe:

var variable = CallMe();

Bu var karşı ana şikayet.

Metodlarda anonim delegeler ilan ettiğimde var kullanıyorum, bir şekilde var kullanacağımdan daha temiz görünüyor Func. Bu kodu düşünün:

var callback = new Func<IntPtr, bool>(delegate(IntPtr hWnd) {
   ...
});

EDIT : Julian'ın girdisine dayalı olarak son kod örneği güncellendi


3
Ama gerçekten o satırdaki türü bilmeniz gerekiyor mu? CallMe'nin bir şey döndürdüğünü biliyorsunuz; adlı yerel bir değişkenin variableyaratıldığını bilmek yeterli değil mi? Örneğinizi genişletmedikçe, bu çok sağlam bir şikayet değil, IMO.
Randolpho

2
Bu ayrıntılı olmamak değil, derleyicinin sözdizimi şekerini sizin için yapmasına izin vermemekle ilgilidir. Şunu düşünün: var getter ..., şimdi bu Func <object> getter ..., ikincisi ile herhangi bir parametre ve ne döndürdüğünüzü bilmek zorunda değilsiniz. Başlangıçtan itibaren "ne yapması gerektiğini" biliyorsunuz ve bir şey tasarlarken veya yeniden düzenlerken kararları daha hızlı alabilirsiniz. Tüm bilgilerin elinizin altında olması birkaç karakterden daha önemlidir. Bu yalnızca çok sayıda kodla çalışırken takdir edilebilir.
Ion Todirel

2
Hepimiz görsel stüdyo hakkında konuştuğumuz için, farenizi bir saniyeliğine değişkenin üzerine getirmenin ve ne tür olduğunu görmenin en önemli yanı nedir? Zaten deklarasyona koşmaktan çok daha iyi.
Rubys

3
Genel değişken ve işlev adları ( variable, CallMe) kötü örnekler verir. Ancak, CallMe()bir tür "telefon uygulaması" bir fonksiyon var call = CallMe(); .... call.HangUp();olsaydı , o zaman çok daha mantıklı olurdu.
Danko Durbić

3
@Randolpho: "Farenizi bir saniyeliğine değişkenin üzerinde tutmanın ve ne tür olduğunu görmenin en önemli yanı nedir?" Bakım yüküne zaman ekler ... artı bir saniye, klavyeyi fare bağlam anahtarına saymak yerine sadece fareyle üzerine gelme süresidir. Seni bilmiyorum ama bir son tarihle çalışıyorum. Ne tür olduğunu bulmak için bir değişkenin üzerine gelmek zorunda kaldığımda, bir sorunu düzeltmek için daha iyi vakit geçirebileceğim zamandır.
Powerlord

36

Var hiç de varyant gibi değil. Değişken hala güçlü bir şekilde yazılmıştır, sadece bu şekilde elde etmek için tuşlara basmamanızdır. Türü görmek için fareyle üzerine gelebilirsiniz. Basılı kodu okuyorsanız, türün ne olduğunu anlamak için biraz düşünmeniz gerekebilir. Ancak onu bildiren tek bir satır ve onu kullanan birçok satır vardır, bu yüzden şeylere iyi adlar vermek, kodunuzu daha kolay takip etmenin en iyi yoludur.

Intellisense kullanmak tembel midir? Tüm addan daha az yazıyor. Yoksa daha az iş ama eleştiriyi hak etmeyen şeyler var mı? Bence var ve var onlardan biri.


6
+1, sadece not edilecek kişi ile varilgisi yoktur Variant.
user7116

27

Buna ihtiyaç duyacağınız en muhtemel zaman anonim türler içindir (% 100 gerekli olduğu yerde); ancak önemsiz durumlar için tekrardan kaçınır ve IMO hattı daha net hale getirir. Basit bir başlatma için türü iki kez görmem gerekmiyor.

Örneğin:

Dictionary<string, List<SomeComplexType<int>>> data = new Dictionary<string, List<SomeComplexType<int>>>();

(lütfen yukarıdaki hscroll düzenlemeyin - bu biraz kanıtlıyor !!!)

vs:

var data = new Dictionary<string, List<SomeComplexType<int>>>();

Bununla birlikte, bunun yanıltıcı olduğu ve potansiyel olarak hatalara neden olabileceği durumlar vardır. varOrijinal değişken ve başlatılmış tür aynı değilse kullanmaya dikkat edin . Örneğin:

static void DoSomething(IFoo foo) {Console.WriteLine("working happily") }
static void DoSomething(Foo foo) {Console.WriteLine("formatting hard disk...");}

// this working code...
IFoo oldCode = new Foo();
DoSomething(oldCode);
// ...is **very** different to this code
var newCode = new Foo();
DoSomething(newCode);

1
(bilgi için, bunun örtük tipte bir dönüşüm olduğu herhangi bir şeyde benzer sorunları alabilirsiniz)
Marc Gravell

1
Aynı satırda iki kez görmek istemediğiniz bölüme katılmıyorum. Gelecekte, türün ne olduğunu doğrudan netleştiremeyebileceğinden, bildirdikten sonra değişkeni doğrudan oluşturmamanız mümkündür (örneğin, tanımın altındaysa). Çoğu geliştirici, özellikle kodu okumayı daha zor hale getirmek istemediğiniz karmaşık kodlarda doğrudan satırın başında türü görmek için kullanılır.
Gertjan

@TheVillageIdiot - çünkü Düzenlemenizi geri alındı bu vesileyle HScroll noktası ;-p ilişkilidir
Marc Gravell

2
@Gertjan - beynim sınırlı; karmaşık ise, ben yok iki kez görmek ve karşılaştırma (arayüz / beton / vs) başlamak zorunda istiyorum. Bir kez görmek ve "onlardan biri olarak yazılmış" düşünmek için mutluyum.
Marc Gravell

17

Var'ın zor olduğu özel bir durum: çevrimdışı kod incelemeleri, özellikle kağıt üzerinde yapılanlar.

Bunun için fareyle üzerine gelemezsiniz.


17
Neden kağıt üzerinde kod inceliyorsunuz? Ağaçları düşünün! ;)
Dustman

8
Aynı sorunu var kullanmadan da yaşayabilirsiniz. Sorun var değil; sorun hatalı değişken isimleridir. Değişken adları iyi seçilmişse, var kullanımı önemli değildir.
Ryan Lundy

Ekibimde kendi kodunu yazdıran ve hataları arayan bir adam var, kodunu yazdırarak. Duvarları kodlarla kaplıdır. Bir keresinde içeri girdim ve hata ayıklama egzersizlerinden biriyle kaplı büyük bir beyaz tahta vardı. Muhtemelen ~ 10000 LOC idi
Bip sesi Bip

Değişken isimleri, türün adın bir parçası olduğu Macarca gösterime dönmezseniz, sorunu çözmez.
Kevin Gale

17

Büyük anlaşmanın ne olduğunu anlamıyorum ..

var something = someMethod(); // Type of 'something' not clear <-- not to the compiler!

Hala 'bir şey' konusunda tam bir fikre sahipsiniz ve belirsiz bir durum için birim testleriniz var, değil mi? ( yapıyor musun? )

Varchar değil, loş değil ve kesinlikle dinamik veya zayıf yazım değil. Bu maddnes'i şu şekilde durduruyor:

List<somethinglongtypename> v = new List<somethinglongtypename>();

ve toplam zihin karmaşasını azaltmak:

var v = new List<somethinglongtypename>();

Güzel, o kadar güzel değil:

v = List<somethinglongtypename>();

Ama sonra Boo bunun için.


'bir şey' türü derleyici için çok açıktır, dahili olarak, "var" 'someMethod' dönüş türüne ayarlanır, derleyici için açıktır, ancak proje üzerinde çalışan geliştiriciler için açık olmayabilir. ve Boo beni hızla büyütüyor.
stephenbayer

Hayır, v = List<somethinglongtypename>();daha da hoş değil. Yeni bir değişken tanıtmak ve mevcut bir değişkene atamak arasında ayrım yapmak önemlidir.
4

Geçerli kapsamda daha önce 'v'ye atadıysanız, varolan bir göreve atanır. Aksi takdirde yeni değişken 'v' ye atanır. Kolay.
Frep D-Oronge

17

Birisi var"türü bulmak" istemediği için anahtar kelimeyi kullanıyorsa , bu kesinlikle yanlış nedendir. varDinamik bir türüne sahip bir değişken oluşturmak değil anahtar, derleyici hala türü bilmek zorunda değil. Değişkenin her zaman belirli bir türü olduğundan, türün mümkünse kodda da belirgin olması gerekir.

varAnahtar kelimeyi kullanmanız için iyi nedenler şunlardır:

  • Gerektiğinde, yani anonim tip için bir referans beyan etmek.
  • Kodu daha okunabilir kıldığı yerde, yani tekrarlayan bildirimleri kaldırmak.

Veri türünü yazmak genellikle kodun izlenmesini kolaylaştırır. Hangi veri türlerini kullandığınızı gösterir, böylece önce kodun ne yaptığını anlayarak veri türünü bulmak zorunda kalmazsınız.


11

Intellisense'ın şu anda ne kadar güçlü olduğu göz önüne alındığında, var'ın bir sınıfta üye değişkenlere veya görünür ekran alanında tanımlanan bir yöntemde yerel değişkenlere sahip olmaktan daha zor olduğunu bilmiyorum.

Gibi bir kod satırınız varsa

IDictionary<BigClassName, SomeOtherBigClassName> nameDictionary = new Dictionary<BigClassName, SomeOtherBigClassName>();

Okunması çok daha kolay veya zor:

var nameDictionary = new Dictionary<BigClassName, SomeOtherBigClassName>();

Aslında bunu dikkate almadım, diğer sorudan bir kez daha kullanmak için oldukça güçlü bir nokta gibi görünüyor.
Finglas

Temelde bu uygulamanın tek nedeni (anonim türleri bildirmenin yanı sıra, "var" ı yalnızca anonim türler için olan özel bir anahtar kelime haline getirmiş olabilir.)
mqp

10

Ben VAR ile anahtar şey sadece uygun yerlerde kullanmak olduğunu yani Linq kolaylaştırır (ve muhtemelen diğer durumlarda) bir şeyler yaparken.

Eğer ettiyseniz var içinde bir şey için bir tür o zaman kullanmalıyım - yapmamaya böylece genel teşvik edilmelidir yaratıcı tembellik aksine basit tembellik (- iyi programcılar oft tembel olmaya çok çalışıyoruz ve düşünülebilir ilk etapta şeyin kaynağı).

Battaniye yasağı, yapıyı kötüye kullanmak kadar kötüdür, ancak mantıklı bir kodlama standardına ihtiyaç vardır.

Hatırlanması gereken diğer şey, türlerini değiştirmek olamayacağını onun değil bir VB tipi var - o olduğunu kesinlikle yazılı değişken onun tipi (anlaşılmaktadır sadece hangi onun mantıksız değil olduğunu iddia edecektir insanlar vardır yüzden diyelim ki bir foreach kullanıyorum ama hem okunabilirlik hem de sürdürülebilirlik nedenlerinden dolayı katılmıyorum).

Bu çalışacak ve koşacak şüpheli (-:

Murph


10

Tabii, intkolaydır, ancak değişkenin türü olduğunda IEnumerable<MyStupidLongNamedGenericClass<int, string>>, var işleri daha kolay hale getirir.


2
Bunun için +1. intile karşılaştırmak varzordur, ancak birden fazla iç içe jenerik tip varbir nimettir. Burada, tür adını tekrar tekrar kullanmak, kodun okunabilirliğini gerçekten yok eder.
Chris Farmer

Bunu kullanmanın kesinlikle yanlış nedeni budur. Kodunuz iç içe bir genel tür kullanıyorsa, bunun için belirli bir adlandırılmış sınıf türetmelisiniz. Örneğin: class IntStringEnumerator : IEnumerable<MyStupidLongNamedGenericClass<int, string>>ve sonra yeni adı kullanın. Bu, kodu temizler ve türü daha iyi açıklar.
xxbbcc

Tamam, ama benim örneğim sadece abartılıydı. IntStringEnumerator i = new IntStringEnumerator()hala çok fazla yazıyor.
Blorgbeard

9

Çalıntı CodingHorror bu konuda yazı :


Ne yazık ki, siz ve diğer herkes hemen hemen yanlış anladınız. Artıklığın iyi bir şey olmadığını kabul etsem de, bu sorunu çözmenin en iyi yolu aşağıdaki gibi bir şey yapmak olurdu:

MyObject m = new ();

Veya parametreleri geçiyorsanız:

Kişi p = yeni ("Adı", "Soyadı);

Yeni bir nesnenin oluşturulmasında, derleyici türü sağdan değil sol taraftan alır. Bunun "var" a göre başka avantajları da vardır, çünkü saha bildirimlerinde de kullanılabilir (bunun da faydalı olabileceği başka alanlar da vardır, ama buraya girmeyeceğim).

Sonunda, artıklığı azaltmak için tasarlanmamıştı. Beni yanlış anlamayın, "var" C # anonim türleri / projeksiyonlar için çok önemlidir, ama burada kullanım sadece YOL kapalı (ve ben uzun, uzun süredir söylüyorum) türünü gizlemek gibi kullanılıyor. İki kez yazmak zorunda kalmak çok sık, ancak sıfır kez bildirmek çok az.

Nicholas Paldino .NET / C # MVP, 20 Haziran 2008 08:00 AM


Sanırım asıl endişeniz daha az yazmak zorundaysa - o zaman onu kullanmanıza engel olacak herhangi bir argüman yoktur.

Yalnızca yapacaksanız hiç , sonra koduna kim umurunda bakar insan olmak? Aksi takdirde, böyle bir durumda:

var people = Managers.People

iyi, ama böyle bir durumda:

var fc = Factory.Run();

beynimin kodun İngilizce'sinden oluşmaya başlayabileceği herhangi bir acil tip kesintisini kısa devre yapar.

Aksi takdirde, projeniz üzerinde çalışması gerekebilecek diğer kişilere karşı en iyi muhakemenizi ve programlama 'nezaketinizi' kullanın.


4
Yukarıdaki örnekleriniz var kullanmamak için bir argüman değildir; iyi tanımlayıcı değişken adları kullanmak için bir argüman. Eğer [var fc = Factory.Run ();] yerine [bool fc = Factory.Run ();] yerine, kod daha net olmazdı.
Ryan Lundy

9

Kullanılması varyerine açık Çeşidi refactorings çok daha kolay (bu nedenle hiçbir fark yarattı yoksa sadece "sözdizimsel şeker" demek önceki afişleri ters olmalıdır) yapar.

Bu yöntemin çağrıldığı her dosyayı değiştirmeden yöntemlerinizin dönüş türünü değiştirebilirsiniz. Hayal etmek

...
List<MyClass> SomeMethod() { ... }
...

hangi gibi kullanılır

...
IList<MyClass> list = obj.SomeMethod();
foreach (MyClass c in list)
  System.Console.WriteLine(c.ToString());
...

Bir SomeMethod()döndürmek için yeniden düzenleme yapmak IEnumerable<MySecondClass>isterseniz, değişken bildirimini değiştirmeniz gerekir (ayrıcaforeach istiyorsanız, yöntemi kullandığınız her yerde ) .

Yazarsan

...
var list = obj.SomeMethod();
foreach (var element in list)
  System.Console.WriteLine(element.ToString());
...

bunun yerine, değiştirmeniz gerekmez.


kabul etti - bu güzel yan etkinin neden daha popüler yanıtlardaki diğer daha öznel profesyoneller kadar lanse edilmediğini merak ediyor.
fieldingmellish

Bugün bana oldu. MainMenu sınıfının istance döndüren bir fabrika sınıfı var. Bugün MainMenu'nun aynı arayüzü ile bir MainMenu2 oluşturdum. Değişiklikten sonra tüm uygulama koduma dokunmadım!
Marco Staffoli

8

@aku: Bir örnek kod incelemeleridir. Başka bir örnek, yeniden düzenleme senaryolarıdır.

Temelde faremle tip avına çıkmak istemiyorum. Kullanılamayabilir.


2
İlginçtir, çünkü var yeniden düzenlemeyi daha basit hale getirebilir. Var kullandıysanız, yapmanız gerekmez. Şimdi her zaman IDE'nin yeniden düzenleme araçlarına güvenebilirsiniz, ancak bilirsiniz, her zaman bu tür için IDE'ye güvenebilirsiniz :)
Fred

8

Bu bir zevk meselesi. Hakkında tüm bu hilkat garibesiDinamik olarak yazılan dillere alıştığınızda bir değişkenin türü ortadan kalkar. Yani, eğer onları sevmeye başlarsanız (herkesin yapabileceğinden emin değilim, ama yaparım).

C # 's varoldukça serin dinamik yazım gibi görünüyor , ama aslında statik yazım - derleyici doğru kullanımı zorlar.

Değişkeninizin türü gerçekten o kadar önemli değil (daha önce söylendi). Bağlamdan (diğer değişkenler ve yöntemlerle etkileşimleri) ve adından nispeten açık olmalıdır - beklemeyin customerList'in bir int...

Hala patronumun bu konuda ne düşündüğünü görmeyi bekliyorum - 3.5'te yeni yapıları kullanmak için "devam et" battaniyem var, ama bakım hakkında ne yapacağız?


7

Arasında karşılaştırıldığında IEnumerable<int>ve IEnumerable<double>size endişe gerekmez - Eğer kod zaten derlemek olmaz türü yanlış geçirirseniz.

Olarak tip-güvenliği konusunda hiçbir endişe var, varbir değil dinamik. Bu sadece derleyici büyüsü ve yaptığınız her tür güvensiz arama yakalanacak.

Var Linq için kesinlikle gereklidir:

var anonEnumeration =
    from post in AllPosts()
    where post.Date > oldDate
    let author = GetAuthor( post.AuthorId )
    select new { 
        PostName = post.Name, 
        post.Date, 
        AuthorName = author.Name
    };

Şimdi anonEnumeration'a intellisense bakın ve böyle bir şey görünecekIEnumerable<'a>

foreach( var item in anonEnumeration ) 
{
    //VS knows the type
    item.PostName; //you'll get intellisense here

    //you still have type safety
    item.ItemId;   //will throw a compiler exception
}

C # derleyicisi oldukça zekidir - ayrı ayrı üretilen anon türleri, özellikleri eşleşirse aynı tür üretilir.

Bunun dışında, bilginiz olduğu sürece var, bağlamın net olduğu her yerde kullanmak mantıklıdır .

//less typing, this is good
var myList = new List<UnreasonablyLongClassName>();

//also good - I can't be mistaken on type
var anotherList = GetAllOfSomeItem();

//but not here - probably best to leave single value types declared
var decimalNum = 123.456m;

IQueriable<T>Tekrarlamadan önce lütfen kurtulun : anonEnumeration.ToList();
David Diez

@DavidDiez yeniden ifade edebilir misiniz? İfadeniz hiçbir anlam ifade etmiyor. Kod parçacıklarımın hiçbiri referans yok IQueryableveya.ToList()
Keith

var anonEnumeration = from post in AllPosts() where post.Date > oldDate let author = GetAuthor( post.AuthorId ) select new { PostName = post.Name, post.Date, AuthorName = author.Name };dönmüyor IQueriable<T>?
David Diez

1
@DavidDiez ne AllPosts()döndürdüğüne bağlıdır - asker atıfta bulunur, List<T>bu yüzden bunu varsaydım. Bu durumda sonuç anonEnumerationtür olacaktır IEnumerable<'a>. Şimdi eğer AllPosts()döner IQueryable<T>yerine o anonEnumerationolur IQueryable<'a>(not hayır iQueryable olarak) - ancak benim kod bu durumda hala çünkü çalışır IQueryable<T>uygular IEnumerable<T>. Burada aralarındaki farklar hakkında daha iyi sorular var - burada benim durumum 'aanonim ve varstatik olarak yazılan bir değişkene atamanıza izin veriyor.
Keith

Ohh Anlıyorum, açıkladığınız için teşekkürler :) Yorumum, yineleme yapmak IQueryable<T>iyi bir uygulama değil çünkü her yinelemede DB'de bir okuma ifadesi hazırlıyorsunuz. *.ToList() IQueryable<T>Onları tekrarlamadan önce emin olun
David Diez

7

Sanırım bakış açınıza bağlı. Şahsen var"yanlış kullanım" nedeniyle bir kod parçasını anlamakta hiç zorluk çekmedim ve iş arkadaşlarım ve ben bunu oldukça fazla kullanıyorum. (Intellisense'in bu konuda büyük bir yardım olduğuna katılıyorum.) Tekrarlı rüzgarı kaldırmanın bir yolu olarak kabul ediyorum.

Sonuçta, eğer gibi ifadeler

var index = 5; // this is supposed to be bad

var firstEligibleObject = FetchSomething(); // oh no what type is it
                                            // i am going to die if i don't know

başa çıkmak gerçekten imkansızdı, kimse dinamik olarak yazılmış dilleri kullanmazdı.


Muhtemelen dinamik türlerin ortak olduğu Net 4'te bu daha önemli hale gelecek mi?
Colin Desmond

2
Aksine, şimdi "var" ile karıştırılırsanız, "dinamik" ile ek olarak karıştırılmanızı beklerim. Tanrı kimsenin bir dinamik beyan
etmesini yasaklar

Dinamik d = 52 gibi bir şey demek istedim; var x = d; ki bu iyi olmalı.
mqp

7

Sadece hangi türün kullanıldığını görmek net olduğunda var kullanıyorum.

Örneğin, x'in "Sınıfım" türünde olacağını hemen görebileceğiniz için bu durumda var kullanacağım:

var x = new MyClass();

Fareyi kodun üzerine sürükleyip MyFunction'un ne tür döndüğünü görmek için araç ipucuna bakmanız gerektiğinden, böyle durumlarda KULLANMAYACAĞIM:

var x = MyClass.MyFunction();

Özellikle, sağ tarafın bir yöntem değil, sadece bir değer olduğu durumlarda asla var kullanmıyorum:

var x = 5;

(çünkü derleyici bayt, kısa, int veya başka bir şey isteyip istemediğimi bilemez)


Sağ taraftaki kullanımını haklı göstermek için yeterince açık değilse var, o zaman varsorun değil: sağ taraftaki sorundur. Yeterince açıklayıcı değil . Customer c = GetContext()olduğu hala belirsiz ve kullanma daha iyi var.
JulianR

6

Bana göre antipati var, .NET'te iki dilliliğin neden önemli olduğunu göstermektedir. Ayrıca VB .NET yapmış olan C # programcıları için avantajları varsezgisel olarak açıktır. Standart C # beyanı:

List<string> whatever = new List<string>();

VB .NET'te şunu yazmanın karşılığıdır:

Dim whatever As List(Of String) = New List(Of String)

Kimse VB .NET'te bunu yapmaz. Aptalca olurdu, çünkü .NET'in ilk sürümünden beri bunu başardınız ...

Dim whatever As New List(Of String)

... bu da değişkeni yaratır ve hepsini oldukça küçük bir satırda başlatır. Ah, ama ne istiyorsan IList<string>, değil List<string>mi? Peki, VB. NET'te bunu yapmanız gerektiği anlamına gelir:

Dim whatever As IList(Of String) = New List(Of String)

Tıpkı C # 'da yapmak zorunda kalacağınız ve açıkçası kullanamadığınız vargibi:

IList<string> whatever = new List<string>();

Eğer varsa gerek farklı bir şey olması türünü, bu olabilir. Ancak iyi programlamanın temel ilkelerinden biri artıklığı azaltmaktır ve var tam da bunu yapar.


1
Komik iki dillilik var kullanımını teşvik bir şey olarak söz. Var anahtar kelimesine karşı düşmanım doğrudan javascript benim akıcılık kaynaklanıyor! :)
urig

varC # ile varJavaScript'te herhangi bir bağlantı yoktur . Bir varC # -declared değişken kesinlikle yazılan edilir.
Ryan Lundy

6

Anonim türler için kullanın - bunun için var. Başka bir şey çok uzak bir kullanımdır. C'de yetişen birçok insan gibi ben de bu tipin bildirisinin soluna bakmaya alışkınım. Zorunlu olmadıkça sağ tarafa bakmıyorum. varHerhangi bir eski deklarasyon için kullanmak beni her zaman yapmamı sağlıyor, ki bu şahsen rahatsız edici buluyorum.

'Önemli değil, mutlu olduğun şeyi kullan' diyenler resmin tamamını görmezler. Herkes bir noktada başka insanların kodlarını alacak ve yazdıkları sırada verdikleri kararlarla uğraşmak zorunda kalacak. Tüm ' varya da değil' şeyi karışıma eklemeden radikal olarak farklı adlandırma kurallarıyla ya da - klasik kavrama - canlandırıcı stillerle uğraşmak yeterince kötü . En kötü durum, bir programcının kullanmadığı varve daha sonra onu seven ve onu kullanarak kodu genişleten bir bakımcı geleceği olacaktır. Şimdi kutsal olmayan bir karışıklığın var.

Standartlar tam olarak iyi bir şeydir, çünkü rastgele kod alıp hızlı bir şekilde almanız çok daha olasıdır. Ne kadar farklı olursa o kadar zorlaşır. Ve 'her yerde var' stiline geçmek büyük bir fark yaratıyor.

Dinamik yazmayı umursamıyorum ve onlar için tasarlanmış dillerde yazmayı da taklit etmiyorum. Python'u çok seviyorum. Ancak C #, statik olarak açıkça yazılan bir dil olarak tasarlanmıştır ve bu şekilde kalmalıdır. Anonim türler için kurallara uymak yeterince kötüydü; İnsanların bunu daha da ileri götürmelerine ve dilin deyimlerini daha da kırmasına izin vermek, memnun olmadığım bir şey. Şimdi cin şişeden çıktı, asla geri dönmeyecek. C # kamplara balkanlaştırılacak. İyi değil.


7
Vay. Bu konuda şimdiye kadar ortaya atılan tüm argümanları göz ardı etmek ve tüm tartışmayı yeniden ayarlamak oldukça başarılı.
Konrad Rudolph

Bu% 100 'var' hakkında nasıl hissettiğimi anlatıyor, özellikle de başka birinin kodunu alma açısından. Değişken kullanımı, el altından doluysa eldeki görevi kökten değiştirir. +1
Simon

6

Test sırasında birçok zaman, kendimi böyle bir kod sahip buluyorum:

var something = myObject.SomeProperty.SomeOtherThing.CallMethod();
Console.WriteLine(something);

Şimdi, bazen, SomeOtherThing'in kendisinin ne içerdiğini görmek isteyeceğim, SomeOtherThing, CallMethod () öğesinin döndürdüğü türle aynı değildir. Ben var olsa kullandığım için, ben sadece bunu değiştirmek:

var something = myObject.SomeProperty.SomeOtherThing.CallMethod();

buna:

var something = myObject.SomeProperty.SomeOtherThing;

Var olmadan, sol tarafta da bildirilen türü değiştirmeye devam etmeliydim. Küçük olduğunu biliyorum, ama son derece uygun.


6

varZaman kazandıran düşünceler için , yazmak için daha az tuş vuruşu gerekir:

StringBuilder sb = new StringBuilder();

göre

var sb = new StringBuilder();

Bana inanmıyorsan onları say ...

19 ve 21

Gerekirse açıklayacağım, ama sadece deneyin ... (zekanızın mevcut durumuna bağlı olarak her biri için birkaç tane daha yazmanız gerekebilir)

Ve aklınıza gelebilecek her tip için doğrudur !!

Benim kişisel hissim, varlığın asla bilinmediği durumlar dışında kullanılmaması gerektiğidir, çünkü koddaki tanıma okunabilirliğini azaltır. Beynin türü tanıması tam bir çizgiden daha uzun sürer. Makine kodunu ve bitlerini anlayan eski zamanlayıcılar tam olarak neden bahsettiğimi biliyor. Beyin paralel olarak işler ve var kullandığınızda onu seri hale getirmeye zorlarsınız. Neden birisi beyninin daha fazla çalışmasını ister ki? Bilgisayarlar bunun için.


Ben açıkça tanımak için dağınık ve daha uzun stringBuilder sb = yeni StringBuilder () tekrarını bulabilirsiniz. Ekstra gürültü. Sorun şu ki, bazı kodları anlamak için ekstra entelektüel çaba neyin yaratıp neyin yaramadığını belirlemek oldukça özneldir!
ljs

"var türü asla bilinmeyen yerler dışında kullanılmamalıdır ..." - Her zaman, derleyici gibi türü bilmek. Bu dinamik yazım değildir, sadece derleyicinin sizin için türü belirlemesine izin verir. Ancak tür asla bilinmez.
Gabriel Magana

5

Tüm yerleri üzerinde ben bölünmüş var, benim için tek şüpheli yerleri dahili kısa türleridir, mesela ben tercih int i = 3;üzerindevar i = 3;


5

Dün yazdığım koddan işleri basitleştirebiliriz:

var content  = new Queue<Pair<Regex, Func<string, bool>>>();
...
foreach (var entry in content) { ... }

Bu olmadan son derece ayrıntılı olurdu var.

Zeyilname: Gerçek tür çıkarımlı bir dil (örn. F #) ile harcanan biraz zaman, derleyicilerin ifade türlerini doğru bir şekilde elde etme konusunda ne kadar başarılı olduklarını gösterecektir. Kesinlikle elimden geldiğince kullanmaya eğilimli olduğum anlamına geliyordu varve şimdi açık bir tür kullanmak, değişkenin başlangıç ​​ifadesinin türünden olmadığını gösteriyor.


Evet, derleyiciler bizden daha akıllı, üstesinden gel!
Benjol

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.