“ var” หมายถึงอะไรใน C #? [ซ้ำ]


คำตอบ:


161

หมายความว่าประเภทของโลคัลที่ประกาศจะถูกสรุปโดยคอมไพเลอร์ตามการกำหนดครั้งแรก:

// 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 มีเพียงสองประโยชน์:

  1. ต้องใช้การพิมพ์น้อยลงเพื่อประกาศตัวแปรโดยเฉพาะอย่างยิ่งเมื่อประกาศตัวแปรเป็นประเภททั่วไปที่ซ้อนกัน
  2. ต้องใช้เมื่อจัดเก็บการอ้างอิงถึงอ็อบเจ็กต์ประเภทนิรนามเนื่องจากไม่สามารถทราบชื่อชนิดล่วงหน้าได้: var foo = new { Bar = "bar" };

คุณไม่สามารถใช้varเป็นประเภทของอะไรก็ได้นอกจากคนในท้องถิ่น ดังนั้นคุณจึงไม่สามารถใช้คีย์เวิร์ดvarเพื่อประกาศประเภทฟิลด์ / คุณสมบัติ / พารามิเตอร์ / ผลตอบแทน


@cdhowie เกิดอะไรขึ้นถ้าในขณะที่พูดว่าvar foo = new Foo(), fooอาจจะเป็นประเภทFooหรือใด ๆ ของชั้นเรียนสุดมัน จะเป็นไปตามกฎหมายได้อย่างไร?
John Strood

3
@Djack มันไม่ถูกกฎหมายและนั่นไม่ใช่กรณี var foo = new Foo();เป็นสิ่งเดียวFoo foo = new Foo();ซึ่งหมายความว่าfooสามารถมีFooการอ้างอิงหรือการอ้างอิงไปยังวัตถุใด ๆFoo ย่อยชนิดไม่Foo ซุปเปอร์ประเภท
cdhowie

15

หมายความว่าชนิดข้อมูลได้มา (โดยนัย) จากบริบท

จาก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();

แต่สามารถใช้มากเกินไปจนถึงจุดที่เสียสละความสามารถในการอ่านได้


9

"var" หมายถึงคอมไพเลอร์จะกำหนดประเภทที่ชัดเจนของตัวแปรตามการใช้งาน ตัวอย่างเช่น,

var myVar = new Connection();

จะให้ตัวแปรประเภท Connection


7

มันประกาศประเภทตามสิ่งที่กำหนดให้ในการเริ่มต้น

ตัวอย่างง่ายๆคือรหัส:

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เนื่องจากไม่มีชื่อสำหรับประเภทที่พวกเขามีอยู่


5

คุณเคยเกลียดการเขียนตัวแปรเริ่มต้นหรือไม่?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

ดังนั้นเริ่มต้นด้วย C # 3.0 คุณสามารถแทนที่ด้วย

var xmlSerializer = new XmlSerialzer(typeof(int))

ข้อสังเกตประการหนึ่ง: ประเภทได้รับการแก้ไขในระหว่างการรวบรวมดังนั้นจึงไม่มีปัญหากับประสิทธิภาพ แต่คอมไพเลอร์ควรตรวจจับชนิดได้ในระหว่างขั้นตอนการสร้างดังนั้นโค้ดเช่นvar xmlSerializer;จะไม่คอมไพล์เลย


0
  • ตามชื่อที่แนะนำ var เป็นตัวแปรที่ไม่มีประเภทข้อมูลใด ๆ
  • หากคุณไม่ทราบว่าข้อมูลประเภทใดจะถูกส่งกลับโดยวิธีใดกรณีดังกล่าวเหมาะสำหรับการใช้ var
  • var คือ Implicit type ซึ่งหมายความว่าระบบจะกำหนดประเภทข้อมูลเอง คอมไพลเลอร์จะสรุปประเภทตามค่าทางด้านขวาของตัวดำเนินการ "="
  • int / string เป็นต้นเป็นประเภทที่ชัดเจนตามที่คุณกำหนดไว้อย่างชัดเจน
  • Var สามารถกำหนดได้ในวิธีการเป็นตัวแปรท้องถิ่นเท่านั้น
  • ไม่สามารถประกาศและเตรียมข้อมูลเบื้องต้นได้หลายตัวแปรในคำสั่งเดียว ตัวอย่างเช่น var i = 1, j = 2; ไม่ถูกต้อง
int i = 100;// explicitly typed 
var j = 100; // implicitly typed

0

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 ใช้เวลาไม่มาก บันทึกและวางข้อ จำกัด เกี่ยวกับความสามารถในการปรับขนาดของโครงการของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.