Soru C # 'de ne var? [çift]


Olası Kopyalama:
C # cinsinden var anahtar kelimesinin kullanımı 

C #, anahtar kelime nasıl "var" iş?


76
2017-11-29 19:54


Menşei




Cevaplar:


Bu, bildirilen yerel türün derleyici tarafından anlaşılacağı anlamına gelir:

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

Özellikle, var değişken bir dinamik tipte tanımlamaz. Yani bu yasal değil:

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

var sadece iki kullanım alanı vardır:

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

Kullanamazsın var yerlilerden başka bir şey türü olarak. Yani anahtar kelimeyi kullanamazsın var alan / özellik / parametre / dönüş türlerini bildirmek.


139
2017-11-29 19:56



Bu, Yığın Değişiminde neyin olması gerektiğine dair iyi bir örnektir. Bazen insanlar önemli bilgileri çıkarırlar ve / veya kısa ve özensiz kalırlar. - Panzercrisis
@cdhowie Ne derken var foo = new Foo(), foo tip olabilir Foo veya süper sınıflarından herhangi biri. Bu nasıl yasal olabilir? - John Strood
@Djack Yasal değil ve durum böyle değil. var foo = new Foo(); aynı şey Foo foo = new Foo();, bu demektir ki foo içerebilir Foo referans veya herhangi bir nesneye referans Foo  alttipi, değil bir Foo  Süperyazın. - cdhowie


Bu, veri türünün içerikten türetilmiş (ima edilmiş) olduğu anlamına gelir.

itibaren http://msdn.microsoft.com/en-us/library/bb383973.aspx

Visual C # 3.0'dan başlayarak, değişkenler   Yöntem kapsamında bildirilenler   örtülü tip var. bir   örtülü olarak yazılan yerel değişken   tıpkı sahipmiş gibi   türünü kendiniz ilan etti, ancak   derleyici türü belirler.   i iki beyanını takiben   işlevsel olarak eşdeğer:

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 yararlıdır, örn.

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();

olur

var x = new MyReallyReallyLongClassName();

ancak okunabilirliğin feda edildiği noktaya aşırı yüklenebilir.


12
2017-11-29 19:55





"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 tür bir bağlantı verir.


7
2017-11-29 19:56





Bu tür değişken başlatıcılar yazmaktan hiç nefret ettin mi?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

Yani, C # 3.0 ile başlayarak, onunla değiştirebilirsiniz

var xmlSerializer = new XmlSerialzer(typeof(int))

Bir uyarı: Derleme sırasında tür çözülür, bu nedenle performansla ilgili bir sorun yoktur. Ancak derleyici, oluşturma adımı sırasında tür algılayabilmelidir, var xmlSerializer; hiç derleme yapmaz.


4
2017-11-29 20:05





Başlatmada kendisine neyin atanmış olduğuna bağlı olarak bir tür bildirir.

Basit bir örnek şu koddur:

var i = 53;

53 türünü inceleyecek ve temel olarak aşağıdaki gibi yeniden yazacak:

int i = 53;

Şunları yapabileceğimize dikkat edin:

long i = 53;

Bu var ile olmaz. 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 tiplerde 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 tanımlamanın başka yolu yok i ve j kullanmaktan var tuttukları türler için bir isim olmadığı için.


4
2017-11-29 20:05