C # dilinde "var" ne anlama geliyor? [çiftleme]


Yanıtlar:


161

Bu, bildirilen yerelin türünün, derleyici tarafından ilk atamasına göre çıkarılacağı anlamına gelir:

// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";

Özellikle, vardinamik tipte bir değişkeni tanımlamaz. Yani bu yasal DEĞİLDİR:

var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints

var sadece iki kullanımı vardır:

  1. Değişkenleri bildirmek için daha az yazım gerektirir, özellikle bir değişkeni iç içe geçmiş bir tür olarak bildirirken.
  2. Anonim türdeki bir nesneye bir başvuru saklarken kullanılmalıdır, çünkü tür adı önceden bilinemez: var foo = new { Bar = "bar" };

varYerliler dışında hiçbir şeyin türü olarak kullanamazsınız . Bu nedenle, varalan / özellik / parametre / dönüş türlerini bildirmek için anahtar kelimeyi kullanamazsınız .


diyerek ederken @cdhowie, ne olursa var foo = new Foo(), footipte olabilir Fooveya süper sınıfların herhangi. Bu nasıl yasal olabilir?
John Strood

3
@Djack Bu yasal değil ve durum böyle değil. var foo = new Foo();ile aynı şeydir Foo foo = new Foo();, bu , bir süper tip değil , herhangi bir alt türden bir referans veya bir nesneye referans fooiçerebileceği anlamına gelir . FooFoo Foo
cdhowie

15

Veri türünün bağlamdan türetildiği (zımni) anlamına gelir.

Gönderen http://msdn.microsoft.com/en-us/library/bb383973.aspx

Visual C # 3.0'dan başlayarak, yöntem kapsamında bildirilen değişkenlerin örtük bir türü olabilir. Örtük olarak yazılmış bir yerel değişken, türü kendiniz bildirmişsiniz gibi güçlü bir şekilde yazılır, ancak türü derleyici belirler. Aşağıdaki iki i bildirimi işlevsel olarak eşdeğerdir:

var i = 10; // implicitly typed
int i = 10; //explicitly typed

var klavye yazmayı ve görsel gürültüyü ortadan kaldırmak için kullanışlıdır, örneğin,

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();

olur

var x = new MyReallyReallyLongClassName();

ancak okunabilirliğin feda edildiği noktaya kadar aşırı kullanılabilir.


9

"var", derleyicinin kullanıma bağlı olarak değişkenin açık türünü belirleyeceği anlamına gelir. Örneğin,

var myVar = new Connection();

size Connection türünde bir değişken verir.


7

Başlatma sırasında kendisine atanan şeye dayalı olarak bir tür bildirir.

Basit bir örnek, kodun:

var i = 53;

53'ün türünü inceleyecek ve esasen bunu şu şekilde yeniden yazacak:

int i = 53;

Şunlara sahip olabileceğimizi unutmayın:

long i = 53;

Bu var ile olmayacak. Bununla birlikte olabilir:

var i = 53l; // i is now a long

Benzer şekilde:

var i = null; // not allowed as type can't be inferred.
var j = (string) null; // allowed as the expression (string) null has both type and value.

Bu, karmaşık türlerde küçük bir kolaylık olabilir. Anonim türlerde daha önemlidir:

var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name};
foreach(var j in i)
  Console.WriteLine(j.ID.ToString() + ":" + j.Name);

Burada , tuttukları türlerin adı olmadığı için tanımlama ive jkullanmaktan başka bir yol varyoktur.


5

Hiç böyle değişken başlatıcılar yazmaktan nefret ettiniz mi?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

Yani, C # 3.0'dan başlayarak, bunu şununla değiştirebilirsiniz:

var xmlSerializer = new XmlSerialzer(typeof(int))

Bir uyarı: Tür derleme sırasında çözülür, bu nedenle performansla ilgili herhangi bir sorun yoktur. Ancak Derleyici, derleme adımı sırasında türü algılayabilmelidir, böylece kod benzeri var xmlSerializer;hiç derlenmez.


0
  • Adından da anlaşılacağı gibi var, herhangi bir veri türü olmayan değişkendir.
  • Herhangi bir yöntemle hangi tür verilerin döndürüleceğini bilmiyorsanız, bu tür durumlar var kullanmak için iyidir.
  • var Örtük türdür, bu da sistemin veri türünü kendisi tanımlayacağı anlamına gelir. Derleyici, "=" operatörünün sağındaki değere göre türünü çıkaracaktır.
  • int / string vb. sizin tarafınızdan açıkça tanımlandığı şekliyle açık türlerdir.
  • Var yalnızca bir yöntemde yerel bir değişken olarak tanımlanabilir
  • Tek bir ifadede birden çok değişken bildirilemez ve başlatılamaz. Örneğin, var i = 1, j = 2; geçersizdir.
int i = 100;// explicitly typed 
var j = 100; // implicitly typed

0

var, C # 'da bir "bağlamsal anahtar sözcüktür", yani onu yalnızca değişkeni kullandığınız sınıfın bağlamında dolaylı olarak yerel bir değişken olarak kullanabileceğiniz anlamına gelir. Bunu "Main" veya başka bir dış sınıftan çağırdığınız bir sınıfta veya örneğin bir arayüzde kullanmaya çalışırsanız, CS0825 hatası < https://docs.microsoft.com/en-us/dotnet/ csharp / misc / cs0825 >

Bunu ne zaman kullanıp kullanamayacağınıza ilişkin açıklamalara şuradaki belgelerde bakın: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -yerel-değişkenler # açıklamalar >

Temel olarak, bunu yalnızca "var myValue =" Bu değerdir "gibi örtük bir değere sahip bir değişken bildirirken kullanmalısınız; Bu, örneğin" string "demeye kıyasla biraz zaman kazandırır, ancak IMHO, kaydedilir ve projenizin ölçeklenebilirliğine bir kısıtlama getirir.

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.