ใน C # ความแตกต่างระหว่าง
static readonly string MyStr;
และ
const string MyStr;
?
ใน C # ความแตกต่างระหว่าง
static readonly string MyStr;
และ
const string MyStr;
?
คำตอบ:
เมื่อคุณใช้constสตริงคอมไพเลอร์ฝังค่าสตริงของที่รวบรวมเวลา
ดังนั้นหากคุณใช้constค่าในแอสเซมบลีอื่นให้อัปเดตแอสเซมบลีเดิมและเปลี่ยนค่าแอสเซมบลีอื่นจะไม่เห็นการเปลี่ยนแปลงจนกว่าคุณจะคอมไพล์ใหม่
static readonlyสตริงเป็นสนามปกติที่ได้รับการมองขึ้นไปที่รันไทม์ ดังนั้นหากค่าของฟิลด์มีการเปลี่ยนแปลงในแอสเซมบลีอื่นการเปลี่ยนแปลงจะเห็นทันทีที่โหลดแอสเซมบลีโดยไม่ต้องคอมไพล์ใหม่
นอกจากนี้ยังหมายความว่าstatic readonlyสตริงสามารถใช้ไม่ใช่สมาชิกอย่างต่อเนื่องเช่นหรือEnvironment.UserName สตริงเท่านั้นที่สามารถเริ่มต้นได้โดยใช้ค่าคงที่อื่น ๆ หรือตัวอักษร
นอกจากนี้ยังสามารถตั้งค่าสตริงในตัวสร้างแบบคงที่ สตริงเท่านั้นที่สามารถเริ่มต้นได้แบบอินไลน์DateTime.Now.ToString()conststatic readonlyconst
โปรดทราบว่าstatic stringสามารถแก้ไขได้ คุณควรใช้static readonlyแทน
constควรใช้เฉพาะสำหรับค่าคงที่ - คงเป็นค่าที่ไม่เคย , เคย , เคยเปลี่ยนแปลง
private constสำหรับค่าที่ไม่ใช่ค่าคงที่พูดอย่างเคร่งครัด โดยพื้นฐานแล้วเป็นการใช้ในทางที่ผิดconstเพื่อวัตถุประสงค์ในการเพิ่มประสิทธิภาพระดับไมโคร ฉันจะยืนหยัดตามคำสั่ง"ไม่เคยเคย"แม้ว่ามันจะทำให้ฉันเป็นคนหน้าซื่อใจคดก็ตาม ;)
นี่คือรายละเอียดที่ดีของข้อดีและข้อเสีย :
ดังนั้นดูเหมือนว่าควรใช้ค่าคงที่เมื่อไม่น่าเป็นไปได้มากที่ค่าจะเปลี่ยนไปหรือหากไม่มีแอป / lib ภายนอกจะใช้ค่าคงที่ ควรใช้ฟิลด์แบบอ่านอย่างเดียวแบบคงที่เมื่อจำเป็นต้องมีการคำนวณรันไทม์หรือหากผู้บริโภคภายนอกเป็นปัจจัย
constpublic const string MyStr;
เป็นค่าคงที่เวลาคอมไพล์ (คุณสามารถใช้เป็นพารามิเตอร์เริ่มต้นสำหรับพารามิเตอร์เมธอดได้เช่นกัน) และจะไม่สับสนหากคุณใช้เทคโนโลยีดังกล่าว
static readonlypublic static readonly string MyStr;
เป็นค่าคงที่รันไทม์ หมายความว่าจะได้รับการประเมินเมื่อเปิดตัวแอปพลิเคชันไม่ใช่ก่อนหน้านี้ นี่คือสาเหตุที่ไม่สามารถใช้เป็นพารามิเตอร์เริ่มต้นสำหรับวิธีการ (ข้อผิดพลาดในการคอมไพล์) ตัวอย่างเช่น ค่าที่เก็บไว้ในนั้นอาจทำให้สับสนได้
OQ ถามเกี่ยวกับVSstatic string constทั้งสองมีกรณีการใช้งานที่แตกต่างกัน (แม้ว่าทั้งสองจะถือว่าเป็นแบบคงที่)
ใช้ const สำหรับค่าคงที่จริงๆเท่านั้น (เช่นความเร็วแสง - แต่ถึงแม้จะแตกต่างกันไปขึ้นอยู่กับตัวกลาง) เหตุผลสำหรับแนวทางที่เข้มงวดนี้คือค่า const ถูกแทนที่ด้วยการใช้ const ในแอสเซมบลีที่อ้างถึงซึ่งหมายความว่าคุณสามารถมีปัญหาเกี่ยวกับการกำหนดเวอร์ชันได้หาก const เปลี่ยนแทนนิยาม (กล่าวคือไม่ควรเป็นค่าคงที่ หลังจากนั้น). หมายเหตุนี้แม้จะมีผลกระทบต่อprivate constสาขาเพราะคุณอาจจะมีฐานการและประเภทรองในการประกอบแตกต่างกันและเขตภาคเอกชนได้รับมา
เขตข้อมูลคงที่จะเชื่อมโยงกับประเภทที่ประกาศไว้ภายใน ใช้สำหรับแสดงค่าที่ต้องเหมือนกันสำหรับทุกอินสแตนซ์ของประเภทที่กำหนด ช่องเหล่านี้สามารถเขียนได้หลายครั้งเท่าที่คุณต้องการ (เว้นแต่จะระบุไว้อ่านอย่างเดียว)
ถ้าคุณหมายถึงstatic readonlyvs constฉันขอแนะนำstatic readonlyสำหรับเกือบทุกกรณีเพราะมันเป็นข้อพิสูจน์ในอนาคตมากกว่า
คุณสามารถเปลี่ยนค่าของ a static readonly stringเฉพาะในตัวstaticสร้างของคลาสหรือตัวแปรเริ่มต้นในขณะที่คุณไม่สามารถเปลี่ยนค่าของconstสตริงได้ทุกที่