Làm thế nào để bạn đặt tên biến riêng tư của bạn trong C #? [đóng cửa]


25

Thực tiễn tốt nhất, quy ước đặt tên được chấp nhận phổ biến nhất cho các biến riêng tư trong C # là gì?

  1. private int myInteger;
  2. private int MyInteger;
  3. private int mMyInteger;
  4. private int _myInteger;
  5. private int _MyInteger;
  6. Tùy chọn khác bí ẩn

Bạn sử dụng cái nào và tại sao? (Công ty của tôi khá mới đối với C # và tôi muốn chọn phương thức "được chấp nhận trong ngành" nhất để thử và đi vào tiêu chuẩn mã hóa của chúng tôi.)


Tại sao không sử dụng Thuộc tính tự động triển khai? msdn.microsoft.com/en-us/l Library / bb384054.aspx
Kyle Ballard

1
C # có các tiêu chuẩn cho việc này, xem stackoverflow.com/questions/14967/ từ
Tamara Wijsman

7
Thật không hay khi nói về các biến riêng tư ở nơi công cộng. Xin lỗi, chỉ cần có.
Đánh dấu C

Tôi sử dụng giống như azheglov (m_someVariable) ngoại trừ tôi chỉ sử dụng _someVariable trong phạm vi cục bộ cho một phương thức.
chúa tể-fu

7
@Mark Tôi nghĩ rằng nó nên là "thành viên riêng" để được gợi ý.
EpsilonVector

Câu trả lời:


44

Hướng dẫn thiết kế lớp MSDN http://msdn.microsoft.com/en-us/l Library / rt31s3bc.aspx khuyến nghị tùy chọn 1 - myInteger.

Tôi đã luôn luôn sử dụng phong cách này. Tôi không thích cá nhân cho nhân vật _


1
Tôi đã không thích ký tự _ cho đến khi chia sẻ lại thêm chuỗi giữa phù hợp với sự không rõ ràng. Bây giờ tôi có thể gõ myIntegervà nó sẽ phù hợp trên _myInteger. Nhưng tôi không biết rằng MSDS nói không sử dụng _
Vaccano

4
Nếu bạn sử dụng tùy chọn 1, làm thế nào tôi có thể biết nếu myIntegerlà một biến cục bộ cho một phương thức, hoặc một thành viên lớp riêng?
Wizard79

4
@Lorenzo this.myInteger;)
TWith2Sugars

12
Nhưng nhưng ... "đây" là 4 ký tự và "_" chỉ là một! Trên thực tế, hướng dẫn đó có rất nhiều ý nghĩa nhưng tại văn phòng của tôi, mọi người đều thích gạch dưới và ghét nhìn thấy "this.Foo", vì bất kỳ lý do gì. Đôi khi những hướng dẫn duy nhất quan trọng là những thứ mà nơi làm việc của bạn buộc bạn.
CodexArcanum

2
Đối số về số lượng nhân vật là tranh cãi. Bạn không phải gõ thismỗi lần, chỉ trong các phương thức có biến cục bộ có cùng tên. Tuy nhiên, bạn được yêu cầu viết thêm một ký hiệu mỗi lần nếu bạn sử dụng dấu gạch dưới. Với những gì tôi đồng ý là việc tuân thủ thỏa thuận kiểu mã địa phương của bạn luôn luôn quan trọng.
Malcolm

25

Tôi sử dụng tùy chọn # 4 ở trên:

private int _myInteger;

Tôi muốn có một số dấu hiệu của phạm vi trong tên biến của mình và dấu gạch dưới là đủ cho mục đích đó. Nó cũng khá dễ đọc.


5
Tôi không đồng ý rằng nó rất dễ đọc, đặc biệt nếu bạn phải thao tác với một vài biến.
Restuta

15

Tôi sử dụng sơ đồ đặt tên sau:

  • 1st (myInteger) cho các biến phạm vi cục bộ
  • Thứ 2 (MyInteger) cho các tài sản công cộng
  • Thứ 4 (_myInteger) cho các biến riêng tư

14

Tôi nghĩ rằng tùy chọn 4 thực sự là tùy chọn dễ đọc nhất. Nó giúp bạn khỏi phải làm điều này:

public Person(string name, int age) 
{
    this.name = name;
    this.age = age;
}

Nó cũng làm cho tất cả các thành viên tư nhân đáng chú ý hơn. Trong ví dụ sau, cái quái đó ageđến từ đâu? Nếu không có thisvòng loại thì khó nói hơn.

private void Method()
{
    var x = 2;
    var y = age + x;
}

Đây là cách dễ hiểu hơn:

private void Method()
{
    var x = 2;
    var y = _age + x;
}

1
Tôi đã từng thề với ví dụ đầu tiên của bạn, nhưng sau khi thử tùy chọn # 4 trong một thời gian, tôi thích sử dụng dấu gạch dưới làm tiền tố cho các trường riêng.
Jeremy Wiebe

2
Tôi nói, sử dụng 1 cho các biến riêng tư, sử dụng 4 cho các biến riêng được sử dụng trong các thuộc tính.
Evan Plaice

2
Tôi phải không đồng ý với ChaosPandoin. Đối với tôi, cả hai cách triển khai Phương thức () đều dễ đọc. Ngay khi tôi thấy biến tuổi (hoặc _age) và nhận thấy rằng nó không được khai báo trong phương thức, tôi nhận ra nó phải được khai báo ở nơi khác trong lớp. Vòng loại này là khủng khiếp nhưng ít nhất nó chỉ giới hạn trong phương thức xây dựng.
David Kennedy

10

Trước hết, PascalCasing thường được dành riêng cho các thuộc tính công cộng, hằng, phương thức, v.v. của lớp. Vì vậy, tôi sẽ bỏ qua 2 và 5.

Thứ hai, ký hiệu tiếng Đức không được khuyến khích trong thế giới .NET, vì vậy (uh, tôi nghĩ) 3 là đúng. Giả sử đó là những gì đang xảy ra với 3.

Điều đó rời đi với camelCasing và _camelCasing. Tôi thường sử dụng _camelCasing cho các biến lớp và camelCasing cũ đơn giản cho các biến nằm trong phạm vi của một phương thức hoặc hẹp hơn. Vỏ lạc đà là tiêu chuẩn được chấp nhận được sử dụng cho các đối số phương thức, tên biến được bảo vệ / riêng và các biến trong phạm vi phương thức hoặc phạm vi hẹp hơn.

Tôi cũng muốn trả trước với dấu gạch dưới để các biến riêng tư của tôi được nhóm trong intellisense của tôi. Tuy nhiên, tôi chỉ làm điều này cho các biến trong phạm vi một loại. Các biến được khai báo trong một phương thức hoặc phạm vi hẹp hơn tôi bỏ dấu gạch dưới. Làm cho nó dễ dàng để giữ chúng tách biệt và giữ các biến ít được sử dụng cùng nhau.


2
Tôi không hiểu tại sao bạn lại sử dụng _camelCasing cho các biến lớp, vì thông thường chúng là các biến lớp.
thay thế

1
@math không, nó không rõ ràng trong intellisense. Hãy nhớ rằng, các trường (biến trong phạm vi lớp) có (gần như) biểu tượng giống như biến trong phạm vi phương thức, vì vậy chúng trông giống hệt nhau nếu bạn không nhìn kỹ. Gạch dưới giúp phân biệt chúng một cách trực quan và giữ chúng được nhóm lại với nhau, điều này giúp nếu bạn không sử dụng chúng thường xuyên (mà bạn không nên coi là kẻ thù của lập trình không có lỗi).
Ripped Off

Tôi chưa bao giờ nói bất cứ điều gì về Intellisense. Tôi đang nói về sự khác biệt giữa Color.ClassMethod () và myColor.InstanceMethod (), cụ thể là rõ ràng vì Color là một lớp, ClassMethod () là một phương thức lớp.
thay thế

@math you before: I don't understand why you would use _camelCasing for class variables you after: I'm talking about the difference between Color.ClassMethod() and myColor.InstanceMethod()Xin lỗi tôi trong khi tôi bối rối. Nghe này, tôi hiếm khi sử dụng các biến lớp, vì vậy thật tuyệt khi được nhắc lại tên của họ bằng cách nhấn _ và để tất cả chúng bật lên trong intellisense đẹp và được nhóm lại.
Tách ra

2
@mathepic: Khi Will nói "biến lớp", anh ta có nghĩa là các trường đối tượng (riêng tư). Bạn dường như đã giải thích những gì anh ấy nói có nghĩa là thành viên tĩnh; nhưng đó không phải là những gì anh ấy nói.
Dan Tao

4

private int integer

Nếu bạn bị lẫn lộn giữa các biến thành viên và biến cục bộ trong phạm vi phương thức thì có lẽ bạn cần phải cấu trúc lại.


+1: đó là những gì tôi tin là điểm chính. BTW: Tôi thấy nguồn của nó, nhưng tên integercó thể được điều chỉnh lại tốt hơn, có thể value?
Sói

2

Tôi tin rằng cách tốt nhất để làm điều đó (trong C # /. Dù sao đi nữa) là sự kết hợp của 2 và 6:

private int MyInteger { get; set; }

Về mặt lý thuyết không có biến nào ở đây, nhưng nó trông và hoạt động như một biến cá thể. Nếu chúng ta cần thêm một số logic kinh doanh vào giá trị đó (đó là một giá trị hoàn toàn bên trong, vì vậy chúng ta có thể làm bất cứ điều gì chúng ta muốn với nó) thì đó đã là "tài sản" cho chúng ta. Một chén hấp nóng của chiến thắng!


2

Tôi thực hiện tùy chọn số 4 vì đó là giao diện của SSCLI, nhưng thực lòng tôi không quan tâm lắm đến việc đặt tên biến riêng. Công chúng là một câu chuyện khác nhau.

BTW bạn đã quên m_MyInteger


2

Tôi sẽ không gọi nó là "của tôi" bất cứ điều gì!

Nhưng tôi muốn nói

class C
{
     int VariableName { get; set; }
}

khá thường xuyên điều này là tốt hơn so với có các biến rõ ràng. Nếu tôi có một biến riêng rõ ràng tôi sẽ gọi nóint _variableName;


1

Trong C ++, tôi có xu hướng sử dụng _ vì tôi chuyển đổi các trình soạn thảo rất nhiều, điều đó không cho phép tôi xem nó có riêng tư không.

Đối với C #, tôi có xu hướng rời khỏi _ vì Visual Studio cho phép tôi xem nó có riêng tư không.

Tôi có xu hướng sử dụng cách Camel Case để làm điều này.


1

Tôi sử dụng 4 ( private int _myInteger;) vì:

private int myInteger;

Đây là cách tôi đặt tên cho các biến cục bộ của mình.

private int MyInteger;

Đây là cách tôi đặt tên hằng.

private int mMyInteger;

Đây không phải là phong cách C #.

private int _MyInteger;

Điều này có vẻ lạ.


1

với dấu gạch dưới.

Bill Wagner giải thích tại sao trong C # hiệu quả . Nhưng tôi sẽ không bao giờ đặt tên cho một số nguyên Số nguyên của mình , tốt hơn là _age hoặc _length. Bao gồm TypeName trong tên ví dụ là một thực tế khủng khiếp. Tên phải tự giải thích và vì C # là Loại an toàn có thể được tìm thấy mọi lúc.


1
Vâng, đó là một ví dụ mặc dù.
Vaccano

1

Bạn cần đưa ra một ví dụ cụ thể hơn, nhưng:

private int count, private int badFileCount,private static readonly int ReconnectAttemptsLimit

Nhân tiện, bạn nhận được tất cả MIỄN PHÍ này khi bạn cài đặt và bắt đầu sử dụng mới nhất và tốt nhất MSFT Stylecop.


0

Tôi đi theo tùy chọn 5: private int _MyFoo

Tôi không thấy bất kỳ lợi thế cạnh tranh thực sự nào so với _myFoo.


0

Sử dụng camelCasing cho các biến riêng tư như myInteger

Xem xét trước _nếu biến là một bản sao lưu cho một thuộc tính để giảm sự nhầm lẫn -
Biến _myPropertycho thuộc tínhMyProperty


0

Tôi có tên ReSharper, các biến của tôi, không chỉ của tôi mà mọi người khác cũng làm điều này. Có một số lượng lớn nhất quán máng dự án.


0

Tiêu chuẩn mã hóa C # của Juval Lowy khá phổ biến. Tiêu chuẩn này khuyến nghị tiền tố các biến thành viên riêng với "m_" (Tùy chọn 6). Đó là những gì chúng tôi làm trong nhóm của chúng tôi.

private int m_myInteger;

Tùy chọn 4 ( _myInteger) là một biến thể chấp nhận được của tiêu chuẩn này.

Tôi không thích đề xuất MSDN ( myInteger), vì điều đó gây khó khăn khi nói với một thành viên tư nhân từ một biến cục bộ. Tất nhiên, đề nghị của họ giải quyết vấn đề này bằng cách đủ điều kiện cho các thành viên tư nhân với this, điều này dường như là dư thừa đối với tôi.

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.