หลังจากสนทนากับเพื่อนร่วมงานเกี่ยวกับการใช้คำหลัก 'var' ใน C # 3 ฉันสงสัยว่าความคิดเห็นของผู้คนเกี่ยวกับการใช้การอนุมานประเภทที่เหมาะสมผ่านทาง var คืออะไร
เช่นฉันค่อนข้างใช้ var อย่างเกียจคร้านในสถานการณ์ที่น่าสงสัยเช่น: -
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 ที่ถูกต้องมากขึ้นมีดังนี้: -
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
LINQ ที่น่าสนใจน่าจะเป็นพื้นที่สีเทาเล็กน้อยเช่น: -
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
เห็นได้ชัดว่าผลลัพธ์จะเป็นอย่างไรซึ่งจะเป็นประเภทที่ใช้ IEnumerable แต่ก็ไม่ชัดเจนโดยสิ้นเชิงเช่นเดียวกับที่ var ประกาศวัตถุใหม่
มันยิ่งแย่ลงเมื่อพูดถึง LINQ กับวัตถุเช่น: -
var results = from item in someList
where item != 3
select item;
สิ่งนี้ไม่ดีไปกว่า foreach ที่เท่าเทียมกัน (รายการ var ใน someList) {// ... } equivilent
มีข้อกังวลอย่างแท้จริงเกี่ยวกับความปลอดภัยของประเภทที่นี่ - ตัวอย่างเช่นถ้าเราวางผลลัพธ์ของข้อความค้นหานั้นลงในวิธีที่มากเกินไปที่ยอมรับ IEnumerable <int> และ IEnumerable <double> ผู้โทรอาจส่งผ่านผิดประเภท
var
ยังคงมีการพิมพ์ที่แข็งแกร่ง แต่คำถามก็คือจริง ๆ ว่ามันอันตรายสำหรับประเภทที่จะไม่ปรากฏในคำนิยามทันทีสิ่งที่ขยายเมื่อโอเวอร์โหลดหมายถึงข้อผิดพลาดของคอมไพเลอร์อาจไม่ได้รับเมื่อคุณส่งชนิดผิดไปยังวิธีการ
var i = 0;
== ล้มเหลว! var c = new CrazyFrigginLongClassName();
== ชนะ!
var readabilityBeDamned = true;