'const string' กับ 'static readonly string' ใน C #


คำตอบ:


172

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

static readonlyสตริงเป็นสนามปกติที่ได้รับการมองขึ้นไปที่รันไทม์ ดังนั้นหากค่าของฟิลด์มีการเปลี่ยนแปลงในแอสเซมบลีอื่นการเปลี่ยนแปลงจะเห็นทันทีที่โหลดแอสเซมบลีโดยไม่ต้องคอมไพล์ใหม่

นอกจากนี้ยังหมายความว่าstatic readonlyสตริงสามารถใช้ไม่ใช่สมาชิกอย่างต่อเนื่องเช่นหรือEnvironment.UserName สตริงเท่านั้นที่สามารถเริ่มต้นได้โดยใช้ค่าคงที่อื่น ๆ หรือตัวอักษร นอกจากนี้ยังสามารถตั้งค่าสตริงในตัวสร้างแบบคงที่ สตริงเท่านั้นที่สามารถเริ่มต้นได้แบบอินไลน์DateTime.Now.ToString()const
static readonlyconst

โปรดทราบว่าstatic stringสามารถแก้ไขได้ คุณควรใช้static readonlyแทน


26
+1 และข้อสรุปที่ชัดเจนจากมุมมองที่จุดของการปฏิบัติและความหมาย: constควรใช้เฉพาะสำหรับค่าคงที่ - คงเป็นค่าที่ไม่เคย , เคย , เคยเปลี่ยนแปลง
LukeH

3
@LukeH ไม่เคยแข็งแรงเลยแม้แต่น้อย ฉันไม่คิดว่าจะมีอะไรเลวร้ายที่จะเกิดขึ้นหากมีการประกาศสตริงส่วนตัวเป็น const และเปลี่ยนระหว่างเหตุการณ์ recompile สองเหตุการณ์
Brenda Bell

5
@ เบรนด้า: ฉันจะยอมรับว่าฉันใช้private constสำหรับค่าที่ไม่ใช่ค่าคงที่พูดอย่างเคร่งครัด โดยพื้นฐานแล้วเป็นการใช้ในทางที่ผิดconstเพื่อวัตถุประสงค์ในการเพิ่มประสิทธิภาพระดับไมโคร ฉันจะยืนหยัดตามคำสั่ง"ไม่เคยเคย"แม้ว่ามันจะทำให้ฉันเป็นคนหน้าซื่อใจคดก็ตาม ;)
LukeH

สิ่งที่เกี่ยวกับประสิทธิภาพในกรณีของสตริงโดยเฉพาะ? การใช้ const แต่ละครั้งจะสร้างสำเนาใหม่ของสตริงในหน่วยความจำหรือไม่
Andrii

@ Andrii no สตริงคงที่ถูกสร้างขึ้นครั้งเดียว การใช้งานแต่ละครั้งจะมีการอ้างอิงเดียวกันในหน่วยความจำ
Migg

43

นี่คือรายละเอียดที่ดีของข้อดีและข้อเสีย :

ดังนั้นดูเหมือนว่าควรใช้ค่าคงที่เมื่อไม่น่าเป็นไปได้มากที่ค่าจะเปลี่ยนไปหรือหากไม่มีแอป / lib ภายนอกจะใช้ค่าคงที่ ควรใช้ฟิลด์แบบอ่านอย่างเดียวแบบคงที่เมื่อจำเป็นต้องมีการคำนวณรันไทม์หรือหากผู้บริโภคภายนอกเป็นปัจจัย


19
ประเด็นที่น่าสนใจมากจากบทความ - "ในระดับสูงค่าคงที่จะถูกจัดการในเวลาคอมไพล์อย่างชัดเจนในขณะที่ฟิลด์แบบอ่านอย่างเดียวแบบคงที่จะถูกตั้งค่าในเวลาที่มีการประเมิน ณ รันไทม์ความจริงที่ว่าค่าคงที่ถูกแทนที่โดยคอมไพเลอร์ หมายความว่าไลบรารี / แอสเซมบลีใด ๆ ที่อ้างอิงค่าคงที่จะต้องมีการคอมไพล์ใหม่หากค่าคงที่เปลี่ยนไปไลบรารีที่อ้างถึงฟิลด์แบบอ่านอย่างเดียวแบบคงที่จะอ้างอิงฟิลด์นั้นไม่ใช่ค่าดังนั้นพวกเขาจะรับการเปลี่ยนแปลงใด ๆ ในฟิลด์โดยไม่จำเป็น สำหรับการคอมไพล์ใหม่ "
s_hewitt

1
ใช่ฉันอ่านเช่นกันและมีเวลาสักครู่ ฉันไม่รู้แน่นอน
spinon

นี่คือเวอร์ชันแคชของ Google: webcache.googleusercontent.com/…
spinon

2
ลิงก์อ้างอิงไม่สามารถใช้ได้อีกต่อไป
Salomon Zhang

นี่เป็นคำชมเชยที่ยอดเยี่ยมสำหรับคำตอบที่ทำเครื่องหมายว่าเป็นวิธีแก้ปัญหา การกำหนดการใช้งานมีประโยชน์มาก +1 จากฉัน
Bonez024

11

const

public const string MyStr;

เป็นค่าคงที่เวลาคอมไพล์ (คุณสามารถใช้เป็นพารามิเตอร์เริ่มต้นสำหรับพารามิเตอร์เมธอดได้เช่นกัน) และจะไม่สับสนหากคุณใช้เทคโนโลยีดังกล่าว

static readonly

public static readonly string MyStr;

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


6

OQ ถามเกี่ยวกับVSstatic string constทั้งสองมีกรณีการใช้งานที่แตกต่างกัน (แม้ว่าทั้งสองจะถือว่าเป็นแบบคงที่)

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

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

ถ้าคุณหมายถึงstatic readonlyvs constฉันขอแนะนำstatic readonlyสำหรับเกือบทุกกรณีเพราะมันเป็นข้อพิสูจน์ในอนาคตมากกว่า


"OQ" ที่คุณพูดถึงคือใคร?
Peter Mortensen

“ คำถามเดิม”
Ben Aston

0

คุณสามารถเปลี่ยนค่าของ a static readonly stringเฉพาะในตัวstaticสร้างของคลาสหรือตัวแปรเริ่มต้นในขณะที่คุณไม่สามารถเปลี่ยนค่าของconstสตริงได้ทุกที่


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