การกำหนดประเภทข้อมูลตัวแปรอย่างชัดเจนเมื่อเทียบกับการใช้คำหลัก 'var' [ปิด]


35

ใน C # ฉันขอแนะนำให้ใช้คำหลัก var all-purpose สำหรับการประกาศตัวแปรทั้งหมดหรือไม่ ถ้าใช่ฉันต้องพูดถึงอักขระพิเศษเหล่านั้นสำหรับค่าตัวอักษรภายในการประกาศตัวแปรเช่น M สำหรับทศนิยมในคำสั่งต่อไปนี้:

var myDecimal = 14.5M;

ถ้ามันสร้างความแตกต่างฉันพยายามที่จะพัฒนาเว็บไซต์ด้วย C #


7
มีโหลมากกว่าที่ SO (ที่เป็นของ IMHO)

1
คำถามเดียวกันกำลังจะมาถึง C ++ กับ C ++ 0x autoประสงค์
David Thornley

5
Eric Lippert จากทีมคอมไพเลอร์ C # เพิ่งบล็อกเรื่องนี้: blogs.msdn.com/b/ericlippert/archive/2011/04/20/…
ทิมกู๊ดแมน

คำถามนี้มีอยู่หกพันล้านชุด
DeadMG

@DeadMG ที่ทำให้ฉันมีเงินหกพันล้านและหนึ่ง
wassimans

คำตอบ:


53

มีข้อพิพาทมากมายเกี่ยวกับการใช้ var กฎทั่วไปของฉันมีดังต่อไปนี้

  • เมื่อชนิดนั้นชัดเจนเช่นเมื่อมือขวาของการมอบหมายเป็นตัวสร้างให้ใช้ var
  • เมื่อชนิดมีความซับซ้อนในการเขียนเช่นแบบสอบถาม LINQ (เหตุผลสำหรับ var ในสถานที่แรก) ใช้ var
  • สำหรับประเภทที่ไม่แน่นอน (ทศนิยมของคุณเป็นตัวอย่าง) ซึ่งคุณต้องการตรวจสอบให้แน่ใจว่าตัวแปรของคุณถูกพิมพ์อย่างถูกต้องแล้วให้สะกดมันออกมา
  • ประเภทที่ไม่ระบุตัวตนต้องใช้ var
  • ในกรณีอื่น ๆ สะกดคำว่าประเภท

โดยทั่วไปเป้าหมายคือเพื่อให้ง่ายต่อการอ่านรหัส หากคุณรู้สึกว่า var นั้นพอเพียงเพราะการกำหนดนั้นชัดเจนให้ใช้ var ใช้ชื่อแบบเต็มเป็นคำแนะนำสำหรับผู้อ่านเมื่อคุณรู้สึกว่าจำเป็น


9
ฉันยังใช้ 'var' ในforeachข้อความที่ฉันสนใจเฉพาะการรวบรวมคอลเล็กชันเท่านั้นไม่จำเป็นต้องเกี่ยวกับประเภทของแต่ละรายการ
Adam Lear

1
และในขณะที่ Jesse ชี้ให้เห็นประเภทที่ไม่ระบุชื่อ;)
Michael Brown

4
@AnnaLear บางครั้งคุณต้องใส่ใจ foreach (แถว var ใน datatable.Rows) ในกรณีนี้ var เป็นวัตถุที่ไม่ใช่ DataRow อย่างที่คาดไว้
Thanos Papathanasiou

@ThanosPapathanasiou แน่นอนใช่ สิ่งเดียวกันสำหรับคอลเลกชันการควบคุมในแบบฟอร์ม Windows และอาจเป็นสถานการณ์อื่นด้วย
อดัมเลียร์

ฉันมักจะใช้ var ยกเว้นเมื่อฉันต้องการให้แน่ใจว่าชนิดของตัวแปรของฉัน (เช่นเมื่อฉันต้องการให้แน่ใจว่าค่าเป็นสองเท่า)
eka808

14

เมื่อใดจะใช้varเป็นโปรแกรม "สงครามศักดิ์สิทธิ์" มีที่เดียวที่ต้องการได้อย่างแม่นยำ: เมื่อผลลัพธ์ของการดำเนินการสร้างประเภทที่ไม่ระบุตัวตนเช่น:

var result = new { Name = "John", Age = 35 };

ไม่ว่าที่ใดก็เป็นทางเลือกและเป็นไปตามมาตรฐานการเข้ารหัสของคุณจริง ๆ เพื่อใช้หรือไม่ในสถานการณ์อื่น ๆ

และใช่คุณจะต้องใช้อักขระพิเศษสำหรับตัวอักษรเพื่อให้คอมไพเลอร์ทราบว่าอยู่ทางด้านขวามืออะไร ในตัวอย่างของคุณโดยไม่ต้องMเริ่มต้นคือมากกว่าdoubledecimal


1
ลืมทุกอย่างเกี่ยวกับประเภทที่ไม่ระบุชื่อ!
Michael Brown

ในงานล่าสุดของฉันฉันบอกว่าฉันจะยิงถ้าฉันเก็บไว้ใช้ "var" คำหลัก ...
hanzolo

มันสุดยอดมาก แต่เป็นความคิดริเริ่มของ บริษัท คุณ ดีใจที่มันเป็นงาน "สุดท้าย" ของคุณ! :)
Jesse C. Slicer

7

จาก MSDN :

อย่างไรก็ตามการใช้ var มีโอกาสอย่างน้อยที่จะทำให้โค้ดของคุณเข้าใจได้ยากยิ่งขึ้นสำหรับผู้พัฒนารายอื่น ด้วยเหตุนี้เอกสาร C # โดยทั่วไปจึงใช้ var เฉพาะเมื่อจำเป็นเท่านั้น

ฉันไม่ชอบการพิมพ์โดยนัย บนพื้นผิวมันมีแนวโน้มที่จะทำให้โค้ดอ่านง่ายขึ้น แต่สามารถนำไปสู่ปัญหามากมายที่ขวางทาง ถ้า dev เปลี่ยนตัวแปร initializer ให้พูดจาก

var myFloat=100f;

ไปยัง

var myFloat=100;

หรือ

var myFloat=100.0;

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

การพิมพ์โดยนัยยังไม่สามารถใช้งานได้ทุกที่ (จากลิงก์ MSDN เดียวกัน)

var สามารถใช้ได้เฉพาะเมื่อมีการประกาศตัวแปรท้องถิ่นและเริ่มต้นในคำสั่งเดียวกัน ไม่สามารถกำหนดค่าเริ่มต้นให้เป็นโมฆะหรือในกลุ่มวิธีการหรือฟังก์ชันที่ไม่ระบุชื่อ

ไม่สามารถใช้ var ในฟิลด์ที่ขอบเขตคลาสได้

ตัวแปรที่ประกาศโดยใช้ var ไม่สามารถใช้ในนิพจน์การเริ่มต้นได้ กล่าวอีกนัยหนึ่งนิพจน์นี้ถูกกฎหมาย: int i = (i = 20); แต่นิพจน์นี้สร้างข้อผิดพลาดในการคอมไพล์เวลา: var i = (i = 20);

ตัวแปรที่พิมพ์โดยนัยหลายรายการไม่สามารถเริ่มต้นได้ในคำสั่งเดียวกัน

หากประเภท var ชื่ออยู่ในขอบเขตแล้วคำหลัก var จะแก้ไขชื่อประเภทนั้นและจะไม่ถือว่าเป็นส่วนหนึ่งของการประกาศตัวแปรท้องถิ่นพิมพ์โดยนัย

การรักษารหัสของคุณให้สอดคล้องกัน (ในกรณีนี้โดยใช้การพิมพ์อย่างชัดเจนทุกที่) เป็นสิ่งที่ดีมาก ในความคิดของฉันvarขี้เกียจและไม่มีประโยชน์จริงและแนะนำอีกหนึ่งจุดที่อาจเกิดความล้มเหลวในกระบวนการที่ซับซ้อนอยู่แล้ว

2017 Update

ฉันเปลี่ยนใจ เมื่อทำงานใน C # ฉันใช้varเวลาส่วนใหญ่ (ยกเว้นสิ่งต่าง ๆ เช่นตัวแปรประเภทอินเตอร์เฟสและอื่น ๆ ) มันทำให้รหัสสั้นซึ่งช่วยเพิ่มการอ่าน ถึงกระนั้น - ให้ความสนใจกับประเภทที่แก้ไขแล้วจริงๆ


@ 3Dave สงสัยว่ามีอะไรเปลี่ยนความคิดของคุณ ฉันยังคงเห็นด้วยกับจุดเริ่มต้นของคุณ 100%: "var เป็นคนขี้เกียจและไม่ให้ผลประโยชน์ที่แท้จริงและแนะนำอีกจุดหนึ่งของความล้มเหลวในกระบวนการที่ซับซ้อนแล้ว"
ด่าน

@ แดนมันลงมาอ่านง่ายจริงๆ ผู้พัฒนาที่มีความสามารถสามารถกำหนดสิ่งที่อยู่ในด้านการเริ่มต้นของการประกาศได้อย่างรวดเร็วโดยไม่มีปัญหา เหมือนกับที่ไม่ได้ใช้this.ทุกที่หรือพูดSystem.Blah.SomeTypeแทน a usingซึ่งฉันก็ยังพบว่ารหัส terse ที่น่ารำคาญยิ่งกว่านั้นคืออย่างน้อยสำหรับฉัน - โดยทั่วไปแล้วจะง่ายต่อการแยกวิเคราะห์ทางสายตา ยังมีอีกหลายสถานการณ์ที่การพิมพ์ที่ชัดเจนเป็นตัวเลือกที่เหมาะสม แต่ทุกวันนี้ฉันเป็นทนายความด้านภาษาน้อยกว่าใครบางคนที่พยายามทำให้โค้ดสะอาดหมดจด
3Dave

@ ด่าน (แน่นอนฉันเป็นคนที่ใช้using namespace std;ไฟล์. cpp ด้วย (ไม่ใช่ส่วนหัวเพราะฉันอยากหลีกเลี่ยงการถูก tarred และมีขนนก)
3Dave

3

การอ้างอิง C # แสดงต่อไปนี้เพื่อแสดงให้เห็นถึงประโยชน์ที่ดีกับการใช้สิ่งก่อสร้างนี้ที่ไม่ดี:

ตัวอย่างต่อไปนี้แสดงนิพจน์แบบสอบถามที่สอง ในนิพจน์แรกอนุญาตให้ใช้ var ได้ แต่ไม่จำเป็นเนื่องจากประเภทของผลลัพธ์แบบสอบถามสามารถระบุอย่างชัดเจนว่าเป็น IEnumerable อย่างไรก็ตามในนิพจน์ที่สองต้องใช้ var เนื่องจากผลลัพธ์คือชุดของประเภทที่ไม่ระบุตัวตนและชื่อของประเภทนั้นไม่สามารถเข้าถึงได้ยกเว้นคอมไพเลอร์เอง โปรดทราบว่าในตัวอย่าง # 2 รายการตัวแปรการวนซ้ำ foreach นั้นจะต้องพิมพ์โดยนัยเช่นกัน

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }

0

คำหลัก var ขอให้คอมไพเลอร์เพื่อลดประเภทของตัวแปรประเภท var โดยอัตโนมัติ ดังนั้นหากคุณต้องการเก็บตัวแปรประเภททศนิยมในตัวแปร var คุณต้องใช้ m ในทำนองเดียวกันหากคุณกำลังจัดเก็บสตริงคุณจะต้องใส่ไว้ในเครื่องหมายคำพูด


0

สำหรับฉันฉันไม่ได้ใช้ var สำหรับกรณีต่อไปนี้:

  • เมื่อฉันต้องการให้แน่ใจว่าประเภทของตัวแปรของฉัน (ตัวอย่างเช่นเพื่อให้แน่ใจว่าประเภทที่ใช้เป็นสองเท่าและไม่ใช่ทศนิยมและนี่เป็นเรื่องใหญ่ที่เชื่อใจฉัน!)
  • รหัส polymorphic Fruit foo = new Apple();เช่น ในกรณีนี้ฉันคิดว่า var คือการหลีกเลี่ยงและใช้คลาสผู้ปกครอง (นี่คือผลไม้) ดีกว่าโดยให้ความเข้าใจที่ดีขึ้นเกี่ยวกับโค้ดโลจิคัลและข้อ จำกัด ของข้อบกพร่องที่เป็นไปได้ (ด้วย var ไม่มีการตรวจสอบแนวคิด polymorphic!)

สำหรับส่วนที่เหลือฉันคิดว่ามันขึ้นอยู่กับกรณีและพื้นหลังของนักพัฒนา บางคนจากโลก PHP จะไม่ชอบดูแลตัวแปรประเภทนี้และบางคนจากโลกของ Java จะคิดว่า var เป็นบาปและยิ่ง verbose ดีกว่า

คุณจะต้องให้ความเห็นส่วนตัว :)

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