ใน C # คำหลักvar
ทำงานอย่างไร
ใน C # คำหลักvar
ทำงานอย่างไร
คำตอบ:
หมายความว่าประเภทของโลคัลที่ประกาศจะถูกสรุปโดยคอมไพเลอร์ตามการกำหนดครั้งแรก:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
โดยเฉพาะอย่างยิ่งvar
ไม่ได้กำหนดตัวแปรให้เป็นประเภทไดนามิก ดังนั้นจึงไม่ถูกกฎหมาย:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var
มีเพียงสองประโยชน์:
var foo = new { Bar = "bar" };
คุณไม่สามารถใช้var
เป็นประเภทของอะไรก็ได้นอกจากคนในท้องถิ่น ดังนั้นคุณจึงไม่สามารถใช้คีย์เวิร์ดvar
เพื่อประกาศประเภทฟิลด์ / คุณสมบัติ / พารามิเตอร์ / ผลตอบแทน
var foo = new Foo();
เป็นสิ่งเดียวFoo foo = new Foo();
ซึ่งหมายความว่าfoo
สามารถมีFoo
การอ้างอิงหรือการอ้างอิงไปยังวัตถุใด ๆFoo
ย่อยชนิดไม่Foo
ซุปเปอร์ประเภท
หมายความว่าชนิดข้อมูลได้มา (โดยนัย) จากบริบท
จากhttp://msdn.microsoft.com/en-us/library/bb383973.aspx
เริ่มต้นใน Visual C # 3.0 ตัวแปรที่ประกาศในขอบเขตวิธีการสามารถมี var ชนิดโดยนัย ตัวแปรโลคัลที่พิมพ์โดยปริยายจะถูกพิมพ์อย่างมากเช่นเดียวกับที่คุณประกาศประเภทด้วยตัวเอง แต่คอมไพเลอร์จะกำหนดประเภท คำประกาศสองคำต่อไปนี้ของ i เทียบเท่ากับฟังก์ชัน:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var
มีประโยชน์ในการกำจัดการพิมพ์แป้นพิมพ์และเสียงรบกวนจากภาพเช่น
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
กลายเป็น
var x = new MyReallyReallyLongClassName();
แต่สามารถใช้มากเกินไปจนถึงจุดที่เสียสละความสามารถในการอ่านได้
"var" หมายถึงคอมไพเลอร์จะกำหนดประเภทที่ชัดเจนของตัวแปรตามการใช้งาน ตัวอย่างเช่น,
var myVar = new Connection();
จะให้ตัวแปรประเภท Connection
มันประกาศประเภทตามสิ่งที่กำหนดให้ในการเริ่มต้น
ตัวอย่างง่ายๆคือรหัส:
var i = 53;
จะตรวจสอบประเภทของ 53 และเขียนสิ่งนี้ใหม่เป็น:
int i = 53;
โปรดทราบว่าในขณะที่เราสามารถมี:
long i = 53;
สิ่งนี้จะไม่เกิดขึ้นกับ var. แม้ว่าจะสามารถทำได้ด้วย:
var i = 53l; // i is now a long
ในทำนองเดียวกัน:
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.
นี่อาจเป็นความสะดวกเล็กน้อยกับประเภทที่ซับซ้อน มีความสำคัญมากกว่ากับประเภทที่ไม่ระบุตัวตน:
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);
ที่นี่ไม่มีวิธีอื่นในการกำหนดi
และj
ใช้มากกว่าvar
เนื่องจากไม่มีชื่อสำหรับประเภทที่พวกเขามีอยู่
คุณเคยเกลียดการเขียนตัวแปรเริ่มต้นหรือไม่?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
ดังนั้นเริ่มต้นด้วย C # 3.0 คุณสามารถแทนที่ด้วย
var xmlSerializer = new XmlSerialzer(typeof(int))
ข้อสังเกตประการหนึ่ง: ประเภทได้รับการแก้ไขในระหว่างการรวบรวมดังนั้นจึงไม่มีปัญหากับประสิทธิภาพ แต่คอมไพเลอร์ควรตรวจจับชนิดได้ในระหว่างขั้นตอนการสร้างดังนั้นโค้ดเช่นvar xmlSerializer;
จะไม่คอมไพล์เลย
int i = 100;// explicitly typed
var j = 100; // implicitly typed
var เป็น "คีย์เวิร์ดตามบริบท" ใน C # ซึ่งหมายความว่าคุณสามารถใช้เป็นตัวแปรโลคัลโดยปริยายในบริบทของคลาสเดียวกันกับที่คุณใช้ตัวแปรเท่านั้น หากคุณพยายามใช้ในคลาสที่คุณเรียกจาก "หลัก" หรือคลาสภายนอกอื่น ๆ หรืออินเทอร์เฟซเช่นคุณจะได้รับข้อผิดพลาด CS0825 < https://docs.microsoft.com/en-us/dotnet/ csharp / misc / cs0825 >
ดูข้อสังเกตเกี่ยวกับเวลาที่คุณทำได้และใช้ไม่ได้ในเอกสารที่นี่: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -local- ตัวแปร # หมายเหตุ >
โดยทั่วไปคุณควรใช้สิ่งนี้เมื่อคุณประกาศตัวแปรที่มีค่านัยเช่น "var myValue =" นี่คือค่า "ซึ่งจะช่วยประหยัดเวลาได้เล็กน้อยเมื่อเปรียบเทียบกับการพูดว่า" string "เป็นต้น แต่ IMHO ใช้เวลาไม่มาก บันทึกและวางข้อ จำกัด เกี่ยวกับความสามารถในการปรับขนาดของโครงการของคุณ
var foo = new Foo()
,foo
อาจจะเป็นประเภทFoo
หรือใด ๆ ของชั้นเรียนสุดมัน จะเป็นไปตามกฎหมายได้อย่างไร?