Quy ước đặt tên C # cho hằng số?


419
private const int THE_ANSWER = 42;

hoặc là

private const int theAnswer = 42;

Cá nhân tôi nghĩ rằng với các IDE hiện đại, chúng ta nên sử dụng camelCase vì ALL_CAPS trông lạ. Bạn nghĩ sao?


4
@mmiika: "the" trong ví dụ này có nghĩa là gì? Có phải như trong "Hướng dẫn về thiên hà của Hitchhiker" hay nó được chuyển sang từ một số tiêu chuẩn mã hóa C ++? (Ví dụ: khung C ++ cũ cho Macintosh, THINK C [và sau đó, Symantec C ++], đã sử dụng tiền tố "của nó" cho các thành viên con trỏ / tham chiếu và "the" cho các thành viên vô hướng.)
Peter Mortensen

5
@Peter, vì giá trị của hằng số là 42, tôi tin tưởng mạnh mẽ rằng nó có liên quan đến Hướng dẫn về thiên hà của Hitchhiker .
Albireo

@PeterMortensen Thật sáng tạo! Nhưng những cái tên như ItsEmployee và ItsCostumer nghe có vẻ như có thể gây hiểu nhầm.
Camilo Martin


Tôi thích theAnswer. Trước đây là một người hâm mộ ký hiệu Hungary, nhưng kể từ khi tôi học cách không sử dụng nó, tôi thích tuyệt đối tránh bất kỳ dấu hiệu meta nào trong việc đặt tên. Tương tự với các giao diện như IInterface. Tôi thích Interfacable. Nhưng khi làm việc trong một nhóm, tôi phải tuân thủ các quy tắc :(
nawfal

Câu trả lời:


484

Quy ước đặt tên và viết hoa được đề xuất là sử dụng P ascal C asing cho các hằng số (Microsoft có một công cụ có tên StyleCop để ghi lại tất cả các quy ước ưa thích và có thể kiểm tra nguồn của bạn để tuân thủ - mặc dù nó hơi quá an toàn đối với nhiều thị hiếu của mọi người) . ví dụ

private const int TheAnswer = 42;

Quy ước viết hoa Pascal cũng được ghi lại trong Nguyên tắc thiết kế khung của Microsoft .


51
Trên thực tế, StyleCop "không phải là sản phẩm của Microsoft" mà là "một công cụ được phát triển bởi một nhà phát triển rất đam mê tại Microsoft (vào buổi tối và cuối tuần)." (Xem blog.msdn.com/sourceanalysis/archive/2008/07/20/ trênblog.msdn.com/bharry/archive/2008/07/19/ gợi ý ) để biết chi tiết. ước sử dụng vỏ Pascal cho hằng số, vì vậy công cụ này chỉ đang thực thi các tiêu chuẩn mà Microsoft không công bố và chứng thực.
bdukes

12
@bdukes - Tôi không nói đó là sản phẩm của Microsoft, tuy nhiên nó có khá nhiều cách sử dụng và hỗ trợ trong toàn tổ chức (với tư cách là một nhân viên cũ, tôi đã sử dụng nó nhiều năm trước khi bất kỳ ai ngoài Microsoft nắm lấy nó, vì vậy Tôi biết rõ về di sản của nó).
Greg Beech

8
Tôi không thích điều này, bởi vì chữ cái đầu tiên thường được sử dụng để cho biết liệu một biến có thể nhìn thấy bên ngoài hay không. Trong mã, TheAnswer trông giống như một tài sản công cộng, không phải là một tài sản riêng tư đối với tôi. Tôi thực sự thích đi với một tiền tố như constTheAnswer và ConstTheAnswer.
Efrain

52
Tôi sẽ sử dụng ký hiệu TheAnswer trừ khi giá trị là 42, trong trường hợp đó tôi chắc chắn sẽ gắn bó với phương pháp ALL_CAPS.
Benoittr

4
Không phải là một lĩnh vực tư nhân được đặt vỏ lạc đà, sự kiện nếu nó là?
Markus Meyer

70

Trực quan, trường hợp trên là con đường để đi. Nó rất dễ nhận ra theo cách đó. Vì mục đích duy nhất và không có cơ hội đoán, tôi bỏ phiếu cho UPPER_CASE!

const int THE_ANSWER = 42;

Lưu ý : Chữ hoa sẽ hữu ích khi các hằng số được sử dụng trong cùng một tệp ở đầu trang và cho các mục đích quan trọng; tuy nhiên, nếu chúng được chuyển sang một lớp độc lập, sử dụng Upper Case sẽ không tạo ra nhiều khác biệt, như một ví dụ:

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
Tôi cũng vậy, thích điều này vì vỏ Pascal có thể dễ dàng bị nhầm lẫn với một tham chiếu thuộc tính.
bc3tech

8
Bất kể các khuyến nghị ở trên, tôi cũng thích UPPER_CASE cho các hằng số, vì nó giúp chúng dễ dàng xác định hơn nhiều so với bất kỳ trường hợp nào khác.
dub stylee

23
@usiouslyBee "SNAKE_CASE" không được khuyến khích mạnh mẽ trong C #; Câu trả lời này là sai. Trường hợp chính xác cho consts trong C # là "TitleCase".
BrainSlugs83

13
@ BrainSlugs83, tôi không nghĩ có đúng hay sai ở đây; nó tùy thuộc vào sở thích và những gì làm cho mã rõ ràng hơn.
hữu íchBee

2
@usiouslyBee Đồng ý. Nhưng nó vẫn tốt để đánh dấu cách viết đồng thuận là gì . Gần đây tôi đã thực hiện vô số mã Ruby và tôi nghĩ rằng SCREAMING_SNAKE_CASE có ý nghĩa: rất rõ ràng rằng nó có gì đó đặc biệt và thậm chí bạn không cần phải di chuột / Đi đến Định nghĩa để tìm hiểu về nó. Bạn biết điều đó ngay lập tức.
Per Lundberg

69

Thực sự nó là

private const int TheAnswer = 42;

Ít nhất nếu bạn nhìn vào thư viện .NET, IMO nào là cách tốt nhất để quyết định các quy ước đặt tên - vì vậy mã của bạn không bị sai lệch.


23

Tôi vẫn đi với chữ hoa cho các giá trị const, nhưng điều này là thói quen nhiều hơn bất kỳ lý do cụ thể.

Tất nhiên nó làm cho nó dễ dàng để thấy ngay lập tức rằng một cái gì đó là một const. Câu hỏi với tôi là: Chúng ta có thực sự cần thông tin này không? Nó có giúp chúng ta trong mọi cách để tránh lỗi không? Nếu tôi gán một giá trị cho const, trình biên dịch sẽ cho tôi biết tôi đã làm điều gì đó ngớ ngẩn.

Kết luận của tôi: Đi với vỏ lạc đà. Có lẽ tôi cũng sẽ thay đổi phong cách của mình ;-)

Biên tập:

Rằng một cái gì đó có mùi của Lynn không thực sự là một đối số hợp lệ, IMO. Câu hỏi nên luôn luôn là: Nó có giúp ích gì không, hay nó có đau không?

Có những trường hợp khi giúp đỡ. Không nhiều như ngày nay, nhưng chúng vẫn tồn tại.


30
Mã được đọc thường xuyên hơn nhiều so với nó được viết. Chắc chắn, khi bạn viết mã, trình biên dịch sẽ ngăn bạn gán một hằng số. Nhưng những gì về anh chàng phải duy trì mã của bạn hai năm kể từ bây giờ? Thật tuyệt khi có thể nhận ra một hằng số ngay lập tức.
Greg Hewgill

2
Các IDE ngày nay nắm bắt được rất nhiều vấn đề trước khi biên dịch. Tôi không nghĩ việc nhận ra hằng số theo tên là quan trọng, nếu không bạn cũng không nên thêm một số tên đặc biệt cho các biến chỉ đọc?
mmiika

5
Nếu bạn nghĩ về nó, híp chữ hoa có lẽ đến từ các macro tiền xử lý chứ không phải là hằng số (Tôi chưa bao giờ sử dụng mũ khối cho các hằng thực sự). Trong bối cảnh đó, sẽ hợp lý khi phân biệt các macro với mã thực tế bởi vì macro thực sự có thể là một biểu thức và không phải là một giá trị không đổi, việc mở rộng của nó có thể gây ra tác dụng phụ, v.v. Vì vậy, bạn cần biết khi nào bạn đang sử dụng macro và khi nào bạn đang sử dụng const. Cá nhân tôi rất vui khi thấy mặt sau của các macro tiền xử lý, chúng có rất nhiều tiềm năng để làm cho mã khó đọc.
Tim Long

7
@Tim: Tôi đồng ý, cuối cùng các macro tiền xử lý mang lại nhiều tác hại hơn là tốt. Macro PP yêu thích nhất của tôi: "#DEFINE Private Public" ;-)
Treb

1
@ Tim: C ++ chuẩn Tempate Thư viện đã thông qua chữ thường cho các hằng số ví dụ std :: string :: NPO ( cplusplus.com/reference/string/string/npos ). Vì vậy, ALL_CAPS chỉ dành cho các macro và các chỉ thị tiền xử lý - làm cho nó trông thậm chí còn tuyệt vời hơn trong C #.
Richard Đinhwall

16

Đầu tiên, Ký hiệu Hungary là cách sử dụng tiền tố để hiển thị loại dữ liệu của tham số hoặc mục đích sử dụng. Các quy ước đặt tên của Microsoft đã nói không với Ký hiệu Hungary http://en.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/l Library / ms229045.aspx

Việc sử dụng UPPERCASE không được khuyến khích như đã nêu ở đây: Trường hợp Pascal là quy ước được chấp nhận và CAPSAMING. http://en.wikibooks.org/wiki/C_Sharp_Programming/ Naming

Microsoft cũng tuyên bố ở đây rằng UPPERCASE có thể được sử dụng nếu nó được thực hiện để phù hợp với sơ đồ tồn tại. http://msdn.microsoft.com/en-us/l Library / x2dbyw72.aspx

Điều này khá nhiều tổng hợp nó lên.


3
Vâng, ký hiệu Hungary không phải là tất cả các mũ.
snibbets

13

Trong bài viết Hằng số (Hướng dẫn lập trình C #) , Microsoft đưa ra ví dụ sau:

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;
}

Vì vậy, đối với các hằng số, có vẻ như Microsoft đang khuyến nghị sử dụng camelCasing. Nhưng lưu ý rằng các hằng số này được xác định cục bộ .

Có thể cho rằng, việc đặt tên các hằng số nhìn thấy bên ngoài được quan tâm nhiều hơn. Trong thực tế, Microsoft ghi lại các hằng số công khai của nó trong thư viện lớp .NET dưới dạng các trường . Dưới đây là một số ví dụ:

Hai cái đầu tiên là ví dụ về PascalCasing. Phần thứ ba dường như tuân theo các Công ước viết hoa của Microsoft cho một từ viết tắt gồm hai chữ cái (mặc dù pi không phải là một từ viết tắt ). Và cái thứ tư dường như gợi ý rằng quy tắc cho một từ viết tắt hai chữ cái mở rộng thành một từ viết tắt hoặc một từ định danh, chẳng hạn như E(đại diện cho hằng số toán học e ).

Hơn nữa, trong tài liệu ước vốn hoá của mình, Microsoft rất trực tiếp khẳng định rằng tên vùng nên được đặt tên qua PascalCasingvà đưa ra các ví dụ sau đây cho MessageQueue.InfiniteTimeoutUInt32.Min :

public class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}

Kết luận: Sử dụng PascalCasingcho các hằng công cộng (được ghi lại dưới dạng consthoặc static readonlycác trường).

Cuối cùng, theo như tôi biết, Microsoft không ủng hộ các quy ước đặt tên hoặc viết hoa cụ thể cho các định danh riêng như trong các ví dụ được trình bày trong câu hỏi.


Nhà phát triển đã viết bài báo đó rõ ràng không tuân theo các quy ước về kiểu dáng được đề xuất của Microsoft cho C #.
BrainSlugs83

2
Bài báo chỉ ra bởi câu trả lời này đã thay đổi. Các hằng số hiện đang công khai và đã được PascalCasing. Với cả hai thay đổi đó, điều này không giúp trả lời các hằng số riêng nên là PascalCasing hay camelCase.
Metalogic

12

Để lại Hungary cho người Hungary.

Trong ví dụ tôi thậm chí bỏ qua bài viết dứt khoát và chỉ cần đi với

private const int Answer = 42;

Đó là câu trả lời hay đó là câu trả lời?

* Thực hiện chỉnh sửa khi Pascal hoàn toàn chính xác, tuy nhiên tôi đã nghĩ rằng câu hỏi đang tìm kiếm thêm một câu trả lời cho cuộc sống, vũ trụ và mọi thứ .


2
Trong trường hợp cụ thể này, nó là những câu trả lời. Nhưng chỉ vì tôi thích đọc D.Adams rất nhiều.
Treb

Vâng, nhưng câu hỏi là gì? và đừng cho tôi xin lỗi vì sự bất tiện này;)
dove

2
Ah, nhưng vì bạn đã biết câu trả lời, bạn không thể biết câu hỏi. Họ là loại trừ lẫn nhau. (Đặt cược bạn đã biết điều đó ;-)
Treb

Đây là câu trả lời chính xác cho câu hỏi của OP. - Tôi sẽ nâng cấp bạn hai lần để loại bỏ Thenếu tôi có thể. :-)
BrainSlugs83

Ai đó là người Hungary, câu trả lời này có nói rằng họ được phép sử dụng quy ước khác không?
Thuyền trưởng Prinny

6

Tôi thực sự có xu hướng thích PascalCase ở đây - nhưng theo thói quen, tôi có tội với UPPER_CASE ...


6

Tôi tin rằng ALL_CAPS được lấy từ cách làm việc của C và C ++. Bài viết này ở đây giải thích làm thế nào sự khác biệt phong cách đến.

Trong các IDE mới như Visual Studio, thật dễ dàng để xác định các loại, phạm vi và nếu chúng không đổi nên không thực sự cần thiết.

Phần mềm FxCop và Microsoft StyleCop sẽ giúp cung cấp cho bạn các hướng dẫn và kiểm tra mã của bạn để mọi người làm việc theo cùng một cách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.