การมีค่าคงที่สาธารณะ“ ไม่ดี” หรือไม่?


38

นี่คือ:

public MyClass
{
    public const string SomeString = "SomeValue";
}

เลวร้ายยิ่งกว่านี้:

public MyClass
{
    public static string SomeString { get{ return "SomeValue";}}
}

ทั้งสองสามารถอ้างอิงได้ในลักษณะเดียวกัน:

if (someString == MyClass.SomeString)
     ...

อย่างไรก็ตามที่สองมีการป้องกันการเป็นทรัพย์สิน แต่ที่จริงแล้วมันดีกว่า const มากแค่ไหน?

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

ความคิดใด ๆ


1
ค่าคงที่สาธารณะที่ใช้ด้วยวิธีนี้ถือว่าใช้ได้ การใช้คุณสมบัติด้วยวิธีนี้คือ overkill
เบอร์นาร์ด

2
คุณได้พิจารณาใช้คำหลักแบบอ่านอย่างเดียวหรือไม่ อ่านอย่างเดียวจะช่วยให้คุณทำความสะอาด syntanx ของ const โดยไม่มีปัญหาที่กล่าวถึงในโพสต์จำนวนมาก
Matt Raffel

ยังสามารถทำได้ ... สาธารณะคงที่อ่านอย่างเดียวพิมพ์ constantName = 0;
นูป

คำตอบ:


56

ใน C # มันแย่มากเพราะไม่มีเหตุผลที่กล่าวถึงในหัวข้อนี้

ค่าคงที่สาธารณะใน C # รับการอบเข้าชุดประกอบการอ้างอิง ความหมายถ้าคุณมี SomeOtherClass ในแอสเซมบลีที่แยกต่างหากอ้างอิง SomeString ใน MyClass CIL ที่สร้างขึ้นสำหรับ SomeOtherClass จะประกอบด้วยสตริง "SomeValue" hardcoded

ถ้าคุณไปที่ redeploy dll ที่มี MyClass แต่ไม่ใช่ SomeOtherClass และเปลี่ยน const, SomeOtherClass จะไม่มีสิ่งที่คุณคิดว่ามันจะ - มันจะมีค่าเดิม

หากคุณบวก 100% มันเป็นค่าคงที่สากลอย่าง Pi ก็บ้าไปแล้ว มิฉะนั้นเหยียบอย่างระมัดระวัง

นี่คือคำอธิบายที่ดีกว่า: https://stackoverflow.com/questions/55984/what-is-the-the-difference-between-const-and-readonly


3
@Oded แต่ความแตกต่างเดียวกันคือระหว่างconstและคุณสมบัติอ่านอย่างเดียว constถูกอบเข้าในชุดการโทรคุณสมบัติการอ่านอย่างเดียวไม่ใช่
svick

1
นี่คือสิ่งที่ฉันไม่รู้ มันเป็นหลักฐานเพิ่มเติมว่าเขตข้อมูลสาธารณะไม่ดี ฉันคิดว่าแม้แต่ตัวอย่าง "Pi" ที่ปลอดภัยก็เป็นความคิดที่ไม่ดี (นักพัฒนาต้องการความแม่นยำที่มากขึ้นหรือน้อยลงใน Pi และทำการเปลี่ยนแปลงแอสเซมบลีโดยไม่ทราบปัญหานี้) ฉันมีชุดประกอบ 40+ รายการใน วิธีแก้ปัญหาและฉันสามารถเห็นสิ่งนี้กัดเราจริงๆหากเราไม่ระวัง
Vaccano

2
"คัดลอก" นี้เกิดขึ้นในส่วนอื่น ๆ ของ C # หรือไม่ (เช่น enums)
Vaccano

2
ใช่การคัดลอกเกิดขึ้น นี่ไม่ใช่ปัญหา แต่ถ้ารหัสของคุณใช้ประโยชน์จากค่าตัวเลขของ Enum และมีการเปลี่ยนแปลงในลักษณะที่ระบุไว้ในคำถามนี้นั่นอาจทำให้เกิดปัญหา
Vaccano

1
นี่คือหนึ่งในเหตุผลหลักว่าทำไมconstใน C # จึงเป็นใบ้ เราต้องการการสนับสนุนที่ดีขึ้นสำหรับ immutables ...
KChaloux

22

การเปลี่ยนเขตข้อมูลเป็นคุณสมบัติเป็นการเปลี่ยนแปลงที่ไม่สิ้นสุด คุณสูญเสียความเข้ากันได้ของไบนารีแหล่งที่มาและการสะท้อนกลับ

นอกจากนี้:

  • มีการควบคุมการเข้าถึงที่ละเอียดยิ่งขึ้นพร้อมคุณสมบัติ ต้องการให้เป็น gettable แบบสาธารณะ แต่ต้องการเพียงตั้งค่าด้วยการเข้าถึงที่ได้รับการป้องกันหรือไม่ ไม่มีปัญหา (ตั้งแต่ C # 2 เป็นต้นไปอย่างน้อย)
  • ต้องการเจาะเข้าไปในตัวดีบั๊กทุกครั้งที่มีการเปลี่ยนแปลงค่าหรือไม่ เพียงเพิ่มเบรกพอยต์ในตัวตั้งค่า
  • ต้องการบันทึกการเข้าถึงทั้งหมดหรือไม่ เพียงเพิ่มการบันทึกลงในทะเยอทะยาน
  • คุณสมบัติถูกใช้สำหรับการเชื่อมโยงข้อมูล เขตข้อมูลไม่ได้

http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx

จากทั้งหมดที่กล่าวมาฉันไม่เห็นว่าค่าคงที่ได้รับผลกระทบจากเรื่องนี้อย่างไร (โดยเฉพาะถ้าคุณไม่ต้องการคุณลักษณะใด ๆ ข้างต้น) เว้นแต่ว่า API ของคุณจะเปลี่ยนไปในลักษณะที่พวกเขาจะไม่คงที่อีกต่อไป


11

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

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


1

ค่าคงที่คือข้อมูล คุณสมบัติบ่งบอกถึงความเป็นไปได้ของพฤติกรรมเมื่อคุณมอง "คุณค่า" เป็นอย่างมาก

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

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

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

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

ข้อมูลคงที่ที่แท้จริงไม่ต้องการหรือต้องการการห่อหุ้ม

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