นี่เป็นคำตอบที่ล่าช้าสำหรับคำถามเก่า แต่คำตอบอื่น ๆ ทั้งหมดหายไปซึ่งเป็นที่. NET ไม่ได้มีชื่อสามัญจนกระทั่ง. NET 2.0 ในปี 2005
String
เป็นประเภทการอ้างอิงแทนที่จะเป็นประเภทค่าเนื่องจากมีความสำคัญอย่างยิ่งสำหรับ Microsoft เพื่อให้แน่ใจว่าสามารถเก็บสตริงได้อย่างมีประสิทธิภาพที่สุดในคอลเลกชันที่ไม่ใช่แบบทั่วไปเช่นSystem.Collections.ArrayList
เช่น
การเก็บค่าประเภทในคอลเลกชันที่ไม่ใช่แบบทั่วไปต้องมีการแปลงแบบพิเศษเป็นประเภทobject
ที่เรียกว่ามวย เมื่อ CLR ทำกล่องชนิดของค่ามันจะตัดค่าภายในSystem.Object
และเก็บไว้ในฮีปที่ได้รับการจัดการ
การอ่านค่าจากคอลเล็กชันต้องการการดำเนินการผกผันซึ่งเรียกว่า unboxing
ทั้งการชกมวยและการไม่จิกมีค่าใช้จ่ายที่ไม่สำคัญ: มวยต้องการการจัดสรรเพิ่มเติม, การยกเลิกการจั่วต้องมีการตรวจสอบประเภท
บางคำตอบอ้างว่าไม่ถูกต้อง string
ไม่สามารถนำมาใช้เป็นประเภทค่าได้เนื่องจากขนาดของมันคือตัวแปร ที่จริงแล้วมันง่ายที่จะใช้สตริงเป็นโครงสร้างข้อมูลความยาวคงที่โดยใช้กลยุทธ์การเพิ่มประสิทธิภาพสตริงขนาดเล็ก: สตริงจะถูกเก็บไว้ในหน่วยความจำโดยตรงเป็นลำดับของอักขระ Unicode ยกเว้นสตริงขนาดใหญ่ที่จะถูกเก็บไว้เป็นตัวชี้ไปยังบัฟเฟอร์ภายนอก การเป็นตัวแทนทั้งสองสามารถออกแบบให้มีความยาวคงที่เท่ากันเช่นขนาดของตัวชี้
หากมีข้อมูลทั่วไปตั้งแต่วันแรกฉันเดาว่าการใช้สตริงเป็นประเภทค่าอาจเป็นวิธีที่ดีกว่าด้วยความหมายที่ง่ายกว่าการใช้หน่วยความจำที่ดีขึ้นและตำแหน่งแคชที่ดีขึ้น List<string>
ที่มีเพียงสายขนาดเล็กจะได้รับบล็อกติดกันเดียวของหน่วยความจำ
is
การทดสอบกัน) คำตอบอาจเป็น ประสิทธิภาพของการทำสำเนาไม่สามารถเป็นเหตุผลได้เนื่องจากไม่จำเป็นต้องคัดลอกวัตถุที่ไม่เปลี่ยนรูปแบบ ตอนนี้มันเป็นไปไม่ได้ที่จะเปลี่ยนแปลงโดยไม่ทำลายโค้ดที่ใช้is
เช็ค (หรือข้อ จำกัด ที่คล้ายกัน)