แบบแผนการตั้งชื่อ C # สำหรับค่าคงที่?


419
private const int THE_ANSWER = 42;

หรือ

private const int theAnswer = 42;

ส่วนตัวฉันคิดว่าด้วย IDEs ที่ทันสมัยเราควรไปกับ camelCase เนื่องจาก ALL_CAPS ดูแปลก คุณคิดอย่างไร?


4
@mmiika: ความหมาย "ใน" ในตัวอย่างนี้คืออะไร? มันเป็นเช่นเดียวกับ "The Hitchhiker's Guide to the Galaxy" หรือเป็นไปตามมาตรฐานการเข้ารหัส C ++ บางอย่างหรือไม่? (เช่นเก่า c ++ กรอบสำหรับ Macintosh คิด C [และต่อมาไซแมนเทค C ++] ใช้คำนำหน้า "ของ" สำหรับตัวชี้ / สมาชิกอ้างอิงและ "ว่า" สำหรับสมาชิกเกลา.)
ปีเตอร์มอร์เทน

5
@ Peter เนื่องจากค่าของค่าคงที่คือ 42 ผมขอ belive ก็อ้างอิงถึงที่โบกรถของจักรวาล
Albireo

@PeterMortensen มันเป็นความคิดสร้างสรรค์! แต่ชื่ออย่างพนักงานและลูกจ้างมันดูเหมือนว่าพวกเขาอาจทำให้เข้าใจผิด
Camilo Martin


theAnswerฉันชอบ ก่อนหน้านี้เคยเป็นแฟนโน้ตชาวฮังการี แต่ตั้งแต่ฉันเรียนรู้ที่จะไม่ใช้มันฉันชอบที่จะหลีกเลี่ยงตัวบ่งชี้เมตาอย่างเคร่งครัดในการตั้งชื่อ IInterfaceเดียวกันจะไปสำหรับการเชื่อมต่อเช่น Interfacableฉันชอบ แต่เมื่อทำงานในทีมฉันต้องปฏิบัติตามกฎ :(
nawfal

คำตอบ:


484

การตั้งชื่อที่แนะนำและการประชุมโครงสร้างเงินทุนที่จะใช้P ascal C asingสำหรับค่าคงที่ (Microsoft มีเครื่องมือที่ชื่อว่าStyleCopว่าเอกสารทั้งหมดประชุมที่ต้องการและสามารถตรวจสอบแหล่งที่มาของการปฏิบัติตาม - แม้ว่ามันจะเป็นเล็กน้อยเกินไป anally ยึดสำหรับรสนิยมของคนจำนวนมาก) . เช่น

private const int TheAnswer = 42;

การประชุมโครงสร้างเงินทุนของปาสคาลนอกจากนี้ยังมีการบันทึกไว้ในไมโครซอฟท์แนวทางการออกแบบกรอบ


51
ที่จริงแล้ว StyleCop คือ "ไม่ใช่ผลิตภัณฑ์ของ Microsoft" แต่ "เครื่องมือที่พัฒนาโดยนักพัฒนาที่มีความหลงใหลใน Microsoft (ในช่วงเย็นและวันหยุดสุดสัปดาห์)" (ดูblogs.msdn.com/sourceanalysis/archive/2008/07/20/ …และblogs.msdn.com/bharry/archive/2008/07/19/19 ) สำหรับรายละเอียด) กล่าวว่าการตั้งชื่อกรอบงานของ Microsoft การประชุมใช้ปลอกปาสกาลสำหรับค่าคงที่ดังนั้นเครื่องมือที่เป็นเพียงการบังคับใช้มาตรฐานที่ไมโครซอฟท์ไม่เผยแพร่และรับรอง
bdukes

12
@bdukes - ฉันไม่ได้บอกว่ามันเป็นผลิตภัณฑ์ของ Microsoft แต่มันมีการใช้งานและการสนับสนุนค่อนข้างมากทั่วทั้งองค์กร (ในฐานะพนักงานเก่าฉันใช้มันมาหลายปีก่อนที่ใครก็ตามที่อยู่ข้างนอก Microsoft จะได้รับมัน ฉันตระหนักดีถึงมรดกของมัน)
Greg Beech

8
ฉันไม่ชอบสิ่งนี้เพราะโดยทั่วไปจะใช้ตัวอักษรตัวแรกเพื่อระบุว่าตัวแปรสามารถมองเห็นได้จากภายนอกหรือไม่ ในรหัส TheAnswer ดูเหมือนทรัพย์สินสาธารณะไม่ใช่ const ส่วนตัวสำหรับฉัน จริง ๆ แล้วฉันต้องการไปกับคำนำหน้าเช่น constTheAnswer และ ConstTheAnswer
Efrain

52
ฉันจะใช้สัญลักษณ์ TheAnswer ยกเว้นเมื่อค่าเป็น 42 ซึ่งในกรณีนี้ฉันจะใช้แนวทาง ALL_CAPS อย่างแน่นอน
Benoittr

4
เขตข้อมูลส่วนตัวไม่ควรถูกอูฐกรณีหากเป็น const?
Markus Meyer

70

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

const int THE_ANSWER = 42;

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

public static class Constant
{
    public static readonly int Cons1 = 1;
    public static readonly int coNs2 = 2;
    public static readonly int cOns3 = 3;
    public static readonly int CONS4 = 4;
}

// Call constants from anywhere
// Since the class has a unique and recognizable name, Upper Case might lose its charm
private void DoSomething(){
var getCons1 = Constant.Cons1;
var getCons2 = Constant.coNs2;
var getCons3 = Constant.cOns3;
var getCons4 = Constant.CONS4;
 }

5
ฉันก็ชอบสิ่งนี้เช่นปลอกปาสคาลอาจสับสนกับการอ้างอิงคุณสมบัติได้อย่างง่ายดาย
bc3tech

8
โดยไม่คำนึงถึงคำแนะนำข้างต้นฉันชอบ UPPER_CASE สำหรับค่าคงที่เช่นกันเพราะทำให้ง่ายต่อการระบุเมื่อเปรียบเทียบกับกรณีอื่น ๆ
พากย์ stylee

23
@usefulBee "SNAKE_CASE" เป็นกำลังใจอย่างยิ่งใน C #; คำตอบนี้ผิด กรณีที่ถูกต้องสำหรับ const ใน C # คือ "TitleCase"
BrainSlugs83

13
@ BrainSlugs83 ฉันไม่คิดว่าจะถูกหรือผิดที่นี่ มันลงมาที่การตั้งค่าและสิ่งที่ทำให้รหัสชัดเจนขึ้น
UsefulBee

2
@usefulBee เห็นด้วย แต่ก็ยังดีที่จะทำเครื่องหมายว่าฉันทามติเป็นอย่างไร ฉันได้ทำการโหลดรหัสทับทิมเมื่อเร็ว ๆ นี้และฉันคิดว่า SCREAMING_SNAKE_CASE สมเหตุสมผล: มันชัดเจนมากว่ามันเป็นอะไรที่พิเศษและคุณไม่จำเป็นต้องโฮเวอร์ / Go To Definition เพื่อค้นหาว่ามันเกี่ยวกับอะไร คุณรู้ได้ทันที
ต่อ Lundberg

69

จริงๆแล้วมันคือ

private const int TheAnswer = 42;

อย่างน้อยถ้าคุณดูที่ไลบรารี. NET ซึ่ง IMO เป็นวิธีที่ดีที่สุดในการตัดสินใจตั้งชื่ออนุสัญญา - เพื่อให้โค้ดของคุณไม่ได้ดูผิดที่


23

ฉันยังไปกับตัวพิมพ์ใหญ่สำหรับค่า const แต่นี่เป็นนิสัยมากกว่าสำหรับเหตุผลเฉพาะใด ๆ

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

ข้อสรุปของฉัน: ไปกับท่ออูฐ บางทีฉันจะเปลี่ยนสไตล์ของฉันด้วย ;-)

แก้ไข:

มีบางอย่างที่มีกลิ่นฮังการีไม่ใช่อาร์กิวเมนต์ที่ถูกต้อง IMO คำถามที่ควรจะเป็น: มันช่วยหรือเจ็บหรือไม่?

มีหลายกรณีที่ชาวฮังการีช่วย ทุกวันนี้มีไม่มากนัก แต่ก็ยังมีอยู่


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

2
IDEs ของวันนี้พบปัญหามากมายก่อนการรวบรวม ฉันไม่คิดว่าการจดจำค่าคงที่ด้วยชื่อมีความสำคัญไม่เช่นนั้นคุณไม่ควรเพิ่มชื่อพิเศษสำหรับตัวแปรแบบอ่านอย่างเดียวด้วยใช่ไหม
mmiika

5
หากคุณคิดเกี่ยวกับมันกระต่ายตัวพิมพ์ใหญ่อาจมาจากมาโครตัวประมวลผลก่อนแทนที่จะเป็นค่าคงที่ (ฉันไม่เคยใช้บล็อกตัวพิมพ์ใหญ่สำหรับค่าคงที่จริง) ในบริบทนั้นมันเหมาะสมที่จะแยกความแตกต่างของแมโครจากรหัสจริงเพราะแมโครอาจเป็นนิพจน์จริงและไม่ใช่ค่าคงที่การขยายตัวอาจทำให้เกิดผลข้างเคียงและอื่น ๆ ดังนั้นคุณจำเป็นต้องรู้ว่าเมื่อคุณใช้แมโครและเมื่อคุณใช้ const ฉันดีใจที่ได้เห็นมาโครด้านหลังของตัวประมวลผลล่วงหน้าพวกเขามีความเป็นไปได้สูงที่จะทำให้โค้ดอ่านยาก
Tim Long

7
@Tim: ฉันเห็นด้วยในที่สุดมาโคร preprocessor นำอันตรายมากกว่าดี ส่วนใหญ่แมโครโปรดของฉัน PP: "#define เอกชนสาธารณะ" ;-)
Treb

1
@Tim: C ++ Standard Tempate Library ใช้ตัวพิมพ์เล็กสำหรับค่าคงที่เช่น std :: string :: npos ( cplusplus.com/reference/string/string/npos ) ดังนั้น ALL_CAPS นั้นมีไว้สำหรับมาโครและตัวประมวลผลล่วงหน้าเท่านั้นซึ่งทำให้ดูน่าประหลาดใจมากขึ้นใน C #
Richard Dingwall

16

ขั้นแรกให้สัญกรณ์ฮังการีเป็นแนวปฏิบัติในการใช้ส่วนนำหน้าเพื่อแสดงชนิดข้อมูลของพารามิเตอร์หรือการใช้งานที่ตั้งใจไว้ ข้อตกลงในการตั้งชื่อของ Microsoft สำหรับการบอกว่าไม่ทำเครื่องหมายในฮังการี http://en.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/library/ms229045.aspx

ไม่สนับสนุนการใช้ UPPERCASE ตามที่ระบุไว้ที่นี่: Pascal Case เป็นแบบแผนที่ยอมรับได้และการตรวจสอบ CAPS http://en.wikibooks.org/wiki/C_Sharp_Programming/Naming

Microsoft ยังระบุที่นี่ว่าสามารถใช้ UPPERCASE ได้หากทำเพื่อให้ตรงกับแบบแผนที่มีอยู่ http://msdn.microsoft.com/en-us/library/x2dbyw72.aspx

ผลรวมนี้สวยขึ้น


3
ใช่สัญกรณ์ฮังการีไม่ใช่ตัวพิมพ์ใหญ่ทั้งหมด
snibbets

13

ในบทความค่าคงที่ (คู่มือการเขียนโปรแกรม C #) , Microsoft ให้ตัวอย่างต่อไปนี้:

class Calendar3
{
    const int months = 12;
    const int weeks = 52;
    const int days = 365;

    const double daysPerWeek = (double) days / (double) weeks;
    const double daysPerMonth = (double) days / (double) months;
}

ดังนั้นสำหรับค่าคงที่ก็ปรากฏcamelCasingว่าไมโครซอฟท์แนะนำการใช้งานของ แต่โปรดทราบว่าค่าคงที่เหล่านี้มีการกำหนดไว้ในเครื่อง

เนื้อหาการตั้งชื่อค่าคงที่ภายนอกที่มองเห็นได้นั้นน่าสนใจยิ่งขึ้น ในทางปฏิบัติเอกสาร Microsoft ของค่าคงที่สาธารณะในห้องสมุดชั้น .NET ตามเขต นี่คือตัวอย่างบางส่วน:

PascalCasingสองคนแรกเป็นตัวอย่างของ คนที่สามดูเหมือนว่าจะเป็นไปตามข้อตกลงการใช้อักษรตัวพิมพ์ใหญ่ของ Microsoft สำหรับตัวย่อสองตัวอักษร (แม้ว่าpiไม่ใช่คำย่อ) และอันที่สี่ดูเหมือนว่าจะแนะนำว่ากฎสำหรับนามแฝงสองตัวอักษรนั้นขยายไปถึงตัวย่อหรือตัวระบุตัวอักษรเดียวเช่นE(ซึ่งแสดงถึงค่าคงที่ทางคณิตศาสตร์e )

นอกจากนี้ในเอกสาร Capitalization Conventions ไมโครซอฟท์ระบุว่าควรระบุชื่อฟิลด์ผ่านทางPascalCasingและให้ตัวอย่างต่อไปนี้สำหรับMessageQueue.InfiniteTimeoutและUInt32.Min :

public class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}

สรุป: ใช้PascalCasingสำหรับค่าคงที่สาธารณะ (ซึ่งมีการจัดทำเป็นเอกสารconstหรือstatic readonlyฟิลด์)

ในที่สุดเท่าที่ฉันรู้ Microsoft ไม่สนับสนุนการตั้งชื่อหรือแบบแผนการใช้ตัวพิมพ์ใหญ่สำหรับตัวระบุส่วนตัวดังที่แสดงในตัวอย่างที่นำเสนอในคำถาม


นักพัฒนาที่เขียนบทความนั้นไม่ได้ปฏิบัติตามข้อกำหนดในการจัดแต่งทรงผมที่แนะนำของ Microsoft สำหรับ C #
BrainSlugs83

2
บทความที่ชี้ไปตามคำตอบนี้มีการเปลี่ยนแปลง consts เป็นแบบสาธารณะและได้รับ PascalCased แล้ว ด้วยการเปลี่ยนแปลงทั้งสองสิ่งนี้ไม่ได้ช่วยตอบว่าค่าคงที่ส่วนตัวควรเป็น PascalCased หรือ camelCased
Metalogic

12

ออกจากฮังการีไปยังชาวฮังกาเรียน

ในตัวอย่างฉันยังทิ้งบทความที่ชัดเจนและไปด้วย

private const int Answer = 42;

นั่นคือคำตอบหรือว่าเป็นคำตอบ?

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


2
ในกรณีที่เฉพาะเจาะจงนี้มันเป็นคำตอบ แต่เพียงเพราะฉันชอบอ่าน D. Adams มาก
Treb

ใช่ แต่คำถามคืออะไร และอย่าให้อาหารฉันขอโทษสำหรับความไม่สะดวกสาย)
นกพิราบ

2
อ่า แต่เมื่อคุณรู้คำตอบแล้วคุณไม่สามารถรู้คำถามได้ พวกเขาเป็นพิเศษร่วมกัน (พนันได้เลยว่าคุณรู้แล้ว ;-)
Treb

นี่คือคำตอบที่ถูกต้องสำหรับคำถามของ OP - ฉันจะโหวตคุณอีกครั้งเพื่อลบTheถ้าฉันทำได้ :-)
BrainSlugs83

ใครบางคนคือชาวฮังการีคำตอบนี้บอกว่าพวกเขาได้รับอนุญาตให้ใช้การประชุมอื่น ๆ ?
Captain Prinny

6

ฉันมักจะชอบ PascalCase จริง ๆ ที่นี่ - แต่จากนิสัยฉันมีความผิดใน UPPER_CASE ...


6

ALL_CAPS นั้นนำมาจากวิธีการทำงานแบบ C และ C ++ ฉันเชื่อว่า บทความนี้ที่นี่อธิบายถึงวิธีการแตกต่างสไตล์มาเกี่ยวกับ

ใน IDE ใหม่ของเช่น Visual Studio มันเป็นเรื่องง่ายที่จะระบุประเภทขอบเขตและหากพวกเขามีค่าคงที่จึงไม่จำเป็นต้องเคร่งครัด

FxCopและ Microsoft StyleCopซอฟแวร์จะช่วยให้คำแนะนำและตรวจสอบรหัสของคุณเพื่อให้ทุกคนทำงานในลักษณะเดียวกัน

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