Để gạch dưới hoặc không gạch dưới, đó là câu hỏi


130

Có bất kỳ vấn đề nào khi không thêm tiền tố vào các trường riêng với dấu gạch dưới trong C # nếu phiên bản nhị phân sẽ bị các ngôn ngữ khung khác sử dụng không? Ví dụ: vì C # phân biệt chữ hoa chữ thường, bạn có thể gọi một trường "foo" và thuộc tính công khai là "Foo" và nó hoạt động tốt.

Điều này sẽ có bất kỳ ảnh hưởng đến một ngôn ngữ case-insensitive như VB.NET, sẽ có bởi bất kỳ CLS tuân thủ (hoặc khác) vấn đề nếu những cái tên chỉ phân biệt bởi vỏ?


18
Điểm của tiền tố gạch dưới, BTW, không phải là để giải quyết các vấn đề trường hợp. Đó là để có thể dễ dàng và trực quan phân biệt các trường và người dân địa phương khi đọc mã. Tôi sẽ sử dụng nó trong C # và VB như nhau.
Neil Hewitt

2
@NeilHewitt: Chà, nó cũng ngăn các tham số hàm xung đột với các biến thành viên, yêu cầu phải chuẩn bị trước mỗi một trong số chúng this, điều này thật tệ. EDIT: Tôi vừa trả lời một bình luận bốn năm tuổi ...
Ed S.

Để rõ ràng, tiêu chuẩn chính thức là _camelCase(được ưa chuộng chỉ đọc) github.com/dotnet/corefx/blob/master/Documentation/ Lỗi
Chris Marisic

Tôi thích _camelCase cho các cửa hàng sao lưu riêng. tức là: tệp riêng giữ dữ liệu được gán và truy cập thông qua một thuộc tính. Tôi không thích các thuộc tính tự động vì chúng không thể được khởi tạo thành một giá trị đã biết trong định nghĩa lớp và nếu tôi muốn có hiệu ứng phụ trong setter, tôi cần một cửa hàng sao lưu được khai báo rõ ràng. Thật không may, điều này được tái cấu trúc khi tôi sử dụng ^ R ^ E trong trình chỉnh sửa c #, vì vậy tôi phải thêm lại vào ... mỗi lần.
TomXP411

Câu trả lời:


46

Nó sẽ không có hiệu lực.

Một phần trong các khuyến nghị để viết thư viện tuân thủ CLS là KHÔNG có hai thực thể công khai / được bảo vệ chỉ khác nhau theo từng trường hợp, ví dụ như bạn KHÔNG nên có

public void foo() {...}

public void Foo() {...}

những gì bạn mô tả không phải là vấn đề vì mục riêng tư không có sẵn cho người dùng thư viện


1
Mặc dù sẽ không có hiệu lực, nhưng đó vẫn là một quy ước mà tôi không thoải mái - vì đó là một công thức cho sự nhầm lẫn nếu chúng chỉ khác nhau tùy theo từng trường hợp. Thật quá dễ để đọc sai hoặc gõ sai nếu sự khác biệt duy nhất là vốn ban đầu.
ChrisA

2
PS Cá nhân, tôi không gạch dưới trong C #. Đối với tôi đó là một sở thích cá nhân, không phải là một niềm tin tôn giáo
Binary Worrier

1
Tôi đã thực hiện cả hai cách và tôi muốn làm cho tâm trí của mình, một và tất cả, dựa trên kiến ​​thức: P
TheCodeJunkie

46
Tôi đang sử dụng dấu gạch dưới. Việc phân biệt chúng với các đối số và các biến cục bộ sẽ dễ dàng hơn.
Rinat Abdullin

4
Tôi chỉ sử dụng _ cho các trường riêng tư, tuy nhiên tôi hầu như không bao giờ có các trường riêng do thuộc tính tự động 3.5. Nói chung, lần duy nhất tôi có một lĩnh vực riêng là nếu tôi thực hiện tải lười biếng trên các loại không nguyên thủy.
Chris Marisic

278

CẬP NHẬT QUAN TRỌNG (ngày 12 tháng 4 năm 2016):

Chúng tôi đã nhận thấy rằng tiêu chuẩn nội bộ của nhóm .NET CoreFX khăng khăng sử dụng ký hiệu gạch dưới mà không đưa ra bất kỳ hiểu biết nào về lý do tại sao. Tuy nhiên, nếu chúng ta nhìn kỹ vào quy tắc # 3 nó trở nên rõ ràng rằng có một hệ thống _, t_, s_tiền tố cho thấy lý do tại sao _được chọn ở nơi đầu tiên.

  1. Chúng tôi sử dụng _camelCasecho các lĩnh vực nội bộ và tư nhân và sử dụng chỉ đọc khi có thể. Các trường tiền tố với _, các trường tĩnh với s_và các trường tĩnh của luồng với t_. Khi được sử dụng trên các trường tĩnh, readonlynên đến sau static(tức là static readonlykhông readonly static).
  2. Chúng tôi tránh this.trừ khi thực sự cần thiết.

Vì vậy, nếu bạn giống như nhóm .NET CoreFX làm việc với một số mã cấp độ hệ thống quan trọng, đa luồng, cấp độ hệ thống , thì đó chính là BỀN VỮNG mà bạn:

  • tuân thủ các tiêu chuẩn mã hóa của họ và
  • sử dụng ký hiệu gạch dưới và
  • đừng đọc câu trả lời này nữa

Nếu không xin vui lòng đọc trên ...

CÂU TRẢ LỜI GỐC:

Trước tiên hãy đồng ý về những gì chúng ta đang nói về. Câu hỏi là làm thế nào chúng ta truy cập các thành viên thể hiện từ bên trong các phương thức và hàm tạo không tĩnh của một lớp / lớp con nếu các bộ điều chỉnh mức độ hiển thị cho phép làm như vậy.

Ký hiệu gạch dưới

  • đề nghị bạn sử dụng tiền tố "_" trong tên của các trường riêng
  • nó cũng nói rằng bạn không bao giờ nên sử dụng "cái này" trừ khi thật cần thiết

Ký hiệu này

  • đề nghị bạn chỉ luôn luôn sử dụng "này." để truy cập bất kỳ thành viên cá thể

Tại sao ký hiệu này tồn tại?

Bởi vì đây là cách bạn

  • phân biệt một tham số từ một trường khi chúng có cùng tên
  • đảm bảo bạn đang làm việc trong bối cảnh của trường hợp hiện tại

Thí dụ

public class Demo
{
   private String name;
   public Demo(String name) {
       this.name = name;
   }
}

Tại sao ký hiệu gạch dưới tồn tại?

Một số người không thích gõ "cái này", nhưng họ vẫn cần một cách để phân biệt một trường và một tham số, vì vậy họ đã đồng ý sử dụng "_" trước một trường

Thí dụ

public class Demo
{
   private String _name;
   public Demo(String name) {
      _name = name;
   }
}

Người ta có thể nghĩ rằng đó chỉ là vấn đề sở thích cá nhân và cả hai cách đều tốt / xấu như nhau. Tuy nhiên, có một số khía cạnh nhất định trong đó ký hiệu này đánh bại ký hiệu gạch dưới:

Trong trẻo

  • tên ký tự gạch dưới
  • ký hiệu này giữ nguyên tên

Tải nhận thức

  • ký hiệu gạch dưới không nhất quán, nó làm cho bạn xử lý các trường theo một cách đặc biệt, nhưng bạn không thể sử dụng nó với các thành viên khác, mỗi khi bạn cần tự hỏi liệu bạn cần một tài sản hay một lĩnh vực

  • ký hiệu này là nhất quán, bạn không cần phải suy nghĩ, bạn chỉ cần luôn sử dụng "cái này" để chỉ bất kỳ thành viên nào

CẬP NHẬT: như đã chỉ ra sau đây không phải là một điểm lợi thế

Bảo trì

  • ký hiệu gạch dưới yêu cầu bạn phải để mắt _trong khi tái cấu trúc, nói rằng biến một trường thành thuộc tính (loại bỏ _) hoặc ngược lại (thêm _)

  • ký hiệu này không có vấn đề như vậy

Tự động hoàn thành

Khi bạn cần xem danh sách các thành viên thể hiện:

  • ký hiệu gạch dưới không giúp bạn nhiều, bởi vì khi bạn gõ "_", cửa sổ bật lên tự động hoàn thành sẽ hiển thị cho bạn các trường riêng và tất cả các loại có sẵn từ các hội đồng được liên kết trộn với phần còn lại của các thành viên thể hiện
  • ký hiệu này cung cấp cho bạn một câu trả lời rõ ràng, bằng cách nhập "này" tất cả những gì bạn thấy là danh sách các thành viên và không có gì khác

Sự mơ hồ

Đôi khi bạn phải xử lý mã mà không cần sự trợ giúp của Intellisense. Ví dụ khi bạn thực hiện đánh giá mã hoặc duyệt mã nguồn trực tuyến.

  • ký hiệu gạch dưới là mơ hồ: Khi bạn thấy Something.S SomethingElse bạn không thể biết liệu Something là một lớp và SomethingElse là thuộc tính tĩnh của nó ... hoặc có thể Something là một thuộc tính hiện tại có thuộc tính riêng của SomethingElse

  • ký hiệu này là rõ ràng: Khi bạn thấy Something.S SomethingElse, nó chỉ có thể có nghĩa là một lớp có thuộc tính tĩnh và khi bạn nhìn thấy cái này. Something.S SomethingElse bạn biết rằng Something là thành viên và SomethingElse là thuộc tính của nó

Phương pháp mở rộng

Bạn không thể sử dụng các phương thức tiện ích mở rộng trên chính cá thể mà không sử dụng "this."

  • ký hiệu gạch dưới yêu cầu bạn không sử dụng "cái này", tuy nhiên với các phương thức mở rộng bạn phải
  • ký hiệu này giúp bạn tránh khỏi sự do dự, bạn luôn sử dụng "này", giai đoạn.

Hỗ trợ Visual Studio

  • ký hiệu gạch dưới không có hỗ trợ tích hợp trong Visual Studio
  • ký hiệu này được Visual Studio hỗ trợ một cách tự nhiên:

    1. "Điều này." Trình độ chuyên môn : Thích tất cả các trường không tĩnh được sử dụng trong các phương thức không tĩnh được mở đầu bằng this.C #

Khuyến nghị chính thức

Có rất nhiều hướng dẫn chính thức nói rõ ràng "không sử dụng dấu gạch dưới", đặc biệt là trong C #


22
Đây là một câu trả lời tuyệt vời. Cảm ơn đã dành thời gian để biên dịch tất cả thông tin này.
Tigran

5
Không đến từ C ++, vì trong C ++, số nhận dạng dự trữ bắt đầu bằng dấu gạch dưới cho ngôn ngữ và cách sử dụng thư viện chuẩn.
Rob G

7
Tại sao bạn phân biệt giữa hiệu suất quan trọng, đa luồng, mã cấp hệ thống và mã khác? Làm thế nào là sử dụng _camelCasesẽ giúp tôi nếu mã của tôi là hiệu suất quan trọng / mã cấp hệ thống?
Sinh ra ToCode

6
Sử dụng dấu gạch dưới không có gì để viết mã hiệu suất quan trọng, đa luồng hoặc cấp hệ thống. Đó là tính nhất quán những gì quan trọng và nhóm CoreFX chỉ là một nhóm thống nhất về một quy ước cụ thể. Đây là một câu trả lời tuyệt vời, được hỗ trợ với một phân tích rất hay so sánh các quy ước đặt tên nhưng tôi tin rằng phần được thêm vào nói rằng "dấu gạch dưới tốt hơn bởi vì nhóm CoreFX nói như vậy" thực sự làm giảm chất lượng của nó.
Şafak Gür

5
Vấn đề của tôi là tôi hiểu suy luận logic. vi.wikipedia.org/wiki/Inference Nhưng này, tôi hiểu nó không dành cho tất cả mọi người.
dùng603563

67

Lấy từ tệp Trợ giúp Microsoft StyleCop:

Loại Tên: FieldNamesMustNotBeginWithUnderscore

Kiểm tra: SA1309

Nguyên nhân: Tên trường trong C # bắt đầu bằng dấu gạch dưới.

Mô tả quy tắc:

Vi phạm quy tắc này xảy ra khi tên trường bắt đầu bằng dấu gạch dưới.

Theo mặc định, StyleCop không cho phép sử dụng dấu gạch dưới, m_, v.v., để đánh dấu các trường lớp cục bộ, có lợi cho 'cái này'. tiếp đầu ngữ. Ưu điểm của việc sử dụng 'này.' là nó áp dụng như nhau cho tất cả các loại phần tử bao gồm các phương thức, thuộc tính, v.v. và không chỉ các trường, làm cho tất cả các lệnh gọi đến các thành viên lớp có thể nhận ra ngay lập tức, bất kể trình soạn thảo nào đang được sử dụng để xem mã. Một ưu điểm khác là nó tạo ra sự khác biệt nhanh chóng, dễ nhận biết giữa các thành viên thể hiện và thành viên tĩnh, sẽ không bị tiền tố.

Nếu trường hoặc tên biến được dự định khớp với tên của một mục được liên kết với Win32 hoặc COM, và do đó cần bắt đầu bằng dấu gạch dưới, đặt trường hoặc biến trong một lớp NativeMethods đặc biệt. Một lớp NativeMethod là bất kỳ lớp nào có chứa một tên kết thúc bằng NativeMethods và được dự định là một trình giữ chỗ cho các trình bao bọc Win32 hoặc COM. StyleCop sẽ bỏ qua vi phạm này nếu mục được đặt trong lớp NativeMethods.

Một mô tả quy tắc khác chỉ ra rằng thực tiễn ưa thích ngoài việc trên là bắt đầu các trường riêng bằng chữ in thường và trường công khai bằng chữ in hoa.

Chỉnh sửa: Theo dõi, trang dự án của StyleCop được đặt tại đây: https://github.com/DotNetAnalyzers/StyleCopAnalyzers . Đọc qua tệp trợ giúp cung cấp nhiều thông tin chi tiết về lý do tại sao họ đề xuất các quy tắc phong cách khác nhau.


7
Nó chủ yếu là một loại "thực hành tốt nhất". Như quy tắc nêu rõ, tiền tố với "này" có thể được áp dụng cho bất kỳ thành viên không tĩnh nào trong khi tiền tố với bất kỳ thứ gì khác có thể không được áp dụng do quy tắc cú pháp ngôn ngữ. Từ khóa "này" làm cho đích dự định rõ ràng tầm thường.
Scott Dorman

5
Tôi cũng ủng hộ giải pháp dự định của ngôn ngữ cho vấn đề ("này") hơn các cách thức nhân tạo để giải quyết vấn đề này.
galaktor

10
Ngoài ra còn có một quy tắc trong cùng một phần mềm nói rằng bạn không nên có hai trường chỉ khác nhau trong trường hợp. Vậy bạn sẽ làm gì với một biến được bảo vệ được bao bọc bởi một tài sản công cộng?
Sông Lilith

5
Vấn đề duy nhất của tôi với điều 'không gạch dưới' là khi lập trình dựa trên Mẫu (web) hoặc như vậy, chỉ sử dụng 'cái này' không giúp tôi trong tất cả các bộ lọc xuống các trường riêng tư mà tôi đã xác định và thay vào đó chỉ cung cấp cho tôi một danh sách khổng lồ của tám triệu tài sản khác có trong đối tượng nói trên.

14
StyleCop dường như đang nói rằng, nếu tôi thường xuyên sử dụng thiskhi đề cập đến bất kỳ thành viên nào trong lớp, tôi có thể tìm thấy tất cả các cuộc gọi đến tất cả các thành viên trong lớp chỉ bằng cách tìm kiếm this. Tôi không thể tranh luận với điều đó, nhưng tôi cũng không thể nghĩ đến thời điểm mà tôi cần phải làm điều đó. Điều cuối cùng tôi muốn làm là thêm tedium vào mã hóa và xả mã của tôi với this( gần như là tiếng Hungary) để gần như không có lợi ích thực tế. Thực tế là, nếu tôi đang xem một dòng mã, bất cứ thứ gì bắt đầu bằng chữ in hoa hoặc dấu gạch dưới đều là thành viên của lớp, bất kỳ chữ thường nào đều là chữ địa phương.
devuxer

27

Vì chúng ta đang nói về một lĩnh vực riêng tư, nó không ảnh hưởng đến người dùng của lớp bạn.

Nhưng tôi khuyên bạn nên sử dụng dấu gạch dưới cho trường riêng, vì nó có thể giúp mã dễ hiểu hơn, ví dụ:

private int foo;
public void SetFoo(int foo)
{
  // you have to prefix the private field with "this."
  this.foo = foo;

  // imagine there's lots of code here,
  // so you can't see the method signature



  // when reading the following code, you can't be sure what foo is
  // is it a private field, or a method-argument (or a local variable)??
  if (foo == x)
  {
    ..
  }
}

Trong nhóm của chúng tôi, chúng tôi luôn sử dụng tiền tố gạch dưới cho các trường riêng. Do đó, khi đọc một số mã, tôi có thể rất dễ dàng xác định các trường riêng tư và phân biệt chúng với các đối số và đối số. Theo một cách nào đó, gạch dưới có thể được xem như là một phiên bản tốc ký của "cái này".


14
Chà, tôi luôn luôn có tiền tố với 'cái này' bất kể tôi đang tung ra một trường, thuộc tính hoặc phương thức.
TheCodeJunkie

9
Đối với tôi, dấu gạch dưới là một loại ký hiệu viết tắt của "cái này."
M4N

2
Trong R #, lời khuyên là không gọi tham số foo. Tại sao không gọi nó là 'giá trị' vì bạn biết nó sẽ được sử dụng để Đặt Foo?
thinkbeforecoding

17
@Martin: Vấn đề với gạch dưới là một cách viết tắt của "cái này" là nó không nhất thiết phải được áp dụng cho tất cả các thành viên trong lớp trong khi "cái này" có thể. Tôi nghĩ rằng mã đọc dễ dàng hơn / sạch hơn với từ khóa "này". Trong ví dụ của bạn, if (foo == x) sẽ luôn tham chiếu đến tham số foo.
Scott Dorman

3
@TheCodeJunkie: Đó là rất nhiều ký tự dư thừa trong cơ sở mã của bạn.
Ed S.

15

Sau khi làm việc trong một môi trường có các quy tắc phong cách rất cụ thể và rất vô nghĩa kể từ đó, tôi tiếp tục tạo ra phong cách của riêng mình. Đây là một loại mà tôi đã lật qua lật lại rất nhiều. Cuối cùng tôi đã quyết định các trường riêng sẽ luôn là _field, các biến cục bộ sẽ không bao giờ có _ và sẽ là chữ thường, tên biến cho các điều khiển sẽ lỏng lẻo theo ký hiệu Hungary và các tham số thường sẽ là camelCase.

Tôi ghê tởm this.từ khóa nó chỉ thêm quá nhiều tiếng ồn mã theo ý kiến ​​của tôi. Tôi yêu Resharper loại bỏ dư thừa này. từ khóa.

Cập nhật 6 năm: Tôi đã phân tích các phần bên trong Dictionary<TKey,T>để sử dụng cụ thể quyền truy cập đồng thời và đọc sai một trường riêng thành một biến cục bộ. Các trường riêng chắc chắn không nên là quy ước đặt tên giống như các biến cục bộ. Nếu có một dấu gạch dưới, nó sẽ cực kỳ rõ ràng.


18
Các thistừ khóa là một tài liệu tham khảo đảm bảo cho các đối tượng hiện hành. Bạn không có được điều đó với một dấu gạch dưới. Không cần phải ghê tởm this.
Jason S

15
Tại sao phát minh ra một 'tiêu chuẩn'. 'điều này.' cho bạn biết đối tượng là một biến thể hiện 'Class.' cho bạn biết đó là một lớp biến. Mọi thứ khác là một biến stack. Phần gạch dưới thuộc về cùng một đống ý tưởng tồi, nơi Ký hiệu Hungary hiện đang phân hủy.
Quarkly

4
@ DRAirey1 quá dễ bỏ lỡ điều này. khi bạn cần nó và cuối cùng bạn làm những điều kỳ lạ với trạng thái.
Chris Marisic

3
@ChrisMarisic Tất nhiên bạn hoan nghênh ý kiến ​​của bạn về việc sử dụng _, nhưng đừng đặt nó là tiêu chuẩn đã được thiết lập khi rõ ràng là không.
nghiền nát

3
Tôi đã mất bạn tại "Tôi tiếp tục tạo ra phong cách của riêng mình".
rory.ap

12

Tôi thích dấu gạch dưới, vì sau đó tôi có thể sử dụng tên chữ thường làm tham số phương thức như thế này:

public class Person
{
    string _firstName;

    public MyClass(string firstName)
    {
        _firstName = firstName;
    }

    public string FirstName
    {
        get { return _firstName; }
    }
}

39
chuỗi công khai FirstName {get; thiết lập riêng tư; }
jason

3
Bạn vẫn có thể sử dụng chữ thường làm tham số phương thức, bằng cách sử dụng thistừ khóa. Làm cho một điểm câm trong liên tục và luôn luôn gây tranh cãi "để gạch dưới hay không":public MyClass(string firstName){ this.firstName = firstName; }
mateuscb

5
Đó là tương lai, bây giờ chỉ là public string FirstName { get; }và setter vẫn có sẵn trong hàm tạo
Chris Marisic

Trong ví dụ này. thissẽ chỉ cần thiết trong các nhà xây dựng. Không cần phải sử dụng nó bất cứ nơi nào khác. Vì vậy, firstNametên trường hoạt động rất tốt.
Thomas Eyde

9

Tôi vẫn thực sự thích sử dụng dấu gạch dưới trước các trường riêng vì lý do Martin đã đề cập và cũng vì các trường riêng sau đó sẽ sắp xếp cùng nhau trong IntelliSense. Điều này là bất chấp sự xấu xa của các ký hiệu tiền tố Hungary nói chung.

Tuy nhiên, trong thời gian gần đây tôi thấy rằng việc sử dụng tiền tố gạch dưới cho các thành viên tư nhân là điều không được chấp nhận, mặc dù tôi không chắc tại sao. Có lẽ ai khác biết? Có phải nó chỉ là nguyên tắc tiền tố? Hoặc có một cái gì đó liên quan đến việc xáo trộn tên các loại chung có được dấu gạch dưới trong chúng trong các cụm lắp ráp hoặc một cái gì đó?


4
Đối với tôi, _ clutter up _words khi nhanh chóng _có thông qua mã, nó trở nên ít giống như chỉ đọc _and _more _ like phải dừng lại ở _every _ để thừa nhận nó và _realize nó _không phải là nhân vật điều khiển của một số _sort. Nó cũng phá vỡ sự thụt lề bằng cách thực tế đẩy ký tự hữu ích đầu tiên trong trường tên một cột sang phải. Tôi thường không thích C ++ vì hầu hết C ++ - lập trình viên có xu hướng viết mã cực kỳ ngắn và mã chậm đọc / mã giống như máy và tôi chỉ đơn giản là không thích điều đó trong mã C # :)
Oskar Duveborn

22
Đối với tôi, điều này. làm xáo trộn this.words khi nhanh chóng this.scanning qua mã, nó trở nên ít giống như chỉ đọc cái này. Và cái này. Hơn thế nữa. Giống như phải dừng lại và this.every này. để thừa nhận nó và điều này. Thực hiện nó là thế này. Không phải là một nhân vật kiểm soát của một số this.sort. Tôi rất muốn tìm thấy thỉnh thoảng _fieldFoohoặc _fieldBarhơn để sử dụng của tôi lộn xộn với this.fieldFoohoặc this.fieldBar. Tôi thấy this.tiền tố trở nên chói tai hơn nhiều so với dấu gạch dưới hàng đầu.
AggieEric

Tôi đã nghĩ có lẽ sự khác biệt về kinh nghiệm này có thể xuất phát từ các hệ thống tập tin cũ hoặc các giao thức truyền tệp nơi không gian không cho phép đào tạo một số người dùng xem dấu gạch dưới là không gian và do đó không làm sao lãng việc đọc của họ. Mặt khác, tôi có vấn đề với tên tệp như vậy vì tôi luôn sử dụng khoảng trắng trong tên tệp của mình từ đầu ...
Oskar Duveborn

1
@AggieEric đánh đinh vào đầu đấy. Chỉ cần đọc câu nói của anh ấy cho tôi đau đầu! Tôi đã cố gắng tuân thủ khuyến nghị của MS trong nhiều năm về vấn đề này và tôi đã rất NHANH khi đọc thisnhững từ nhỏ màu xanh ở khắp mọi nơi, tôi đã đưa ra một quyết định mọt sách ngay tại đó. Bây giờ, tôi chỉ sử dụng thisđể tham chiếu tài sản CHỈ hoặc khi tôi cần phân biệt rõ ràng giữa thisbase. Mỗi người theo ý mình, tôi đoán :-)
Riegardt Steyn

1
Tôi nghĩ rằng đó là bởi vì, cuối cùng, bắt đầu bất cứ điều gì với một ký tự dấu chấm câu làm tổn thương khả năng đọc. Nó dường như không làm phiền tất cả mọi người nhưng với tôi cảm giác rất bất thường khi đọc bất cứ điều gì bắt đầu bằng dấu câu. Mã càng giống tiếng Anh, tôi càng dễ đọc nó hơn. Và với các IDE hiện đại, thật đơn giản để nói lên sự khác biệt giữa người dân địa phương và các thành viên tư nhân bởi vì rất có thể chúng sẽ có màu khác nhau.
Tim Long

5

Đề xuất Style Cop hay không, đào sâu vào .NET Framework cho thấy rất nhiều cách sử dụng "_" cho các biến thành viên. Dù những người tạo ra Style Cop khuyên dùng gì, đó không phải là điều mà phần lớn nhân viên MS đang sử dụng. :) Vì vậy, tôi sẽ gắn bó với gạch dưới. Bởi vì cá nhân tôi đã ít mắc lỗi hơn khi sử dụng dấu gạch dưới, sau đó là điều này (ví dụ: sử dụng varName = varName thay vì this.varName = varName, nó thực sự bị mắc kẹt trong tôi)


3
Gạch cũng được đề nghị cho hướng dẫn NET phong cách cốt lõi: github.com/dotnet/corefx/wiki/Coding-style
landoncz

3

Tôi nghĩ rằng các trường cấp độ lớn là một sai lầm trong thiết kế ngôn ngữ. Tôi sẽ thích nó hơn nếu các thuộc tính của C # có phạm vi cục bộ của riêng chúng:

public int Foo
{
   private int foo;
   get
   {
      return foo;
   }
   set
   {
      foo = value;
   }
}

Điều đó sẽ làm cho nó có thể ngừng sử dụng các trường hoàn toàn.

Lần duy nhất tôi từng tiền tố một trường riêng có dấu gạch dưới là khi một thuộc tính yêu cầu một trường sao lưu riêng. Đó cũng là lần duy nhất tôi sử dụng các lĩnh vực tư nhân. (Và vì tôi không bao giờ sử dụng các trường được bảo vệ, nội bộ hoặc công khai, đó là lần duy nhất tôi sử dụng thời gian của các trường.) Theo như tôi quan tâm, nếu một biến cần có phạm vi lớp, thì đó là thuộc tính của lớp.


Nhóm C # dường như đồng ý với bạn với int foo {get; đặt;} cú pháp đường.
Dana

Ừ chắc chắn rồi; những gì tôi mô tả ở đây là hoàn toàn không thể thực hiện được nếu không có điều đó.
Robert Rossney

Những gì bạn đang mô tả là "Thuộc tính được thực hiện tự động". Thật không may, với Visual Basic.NET, điều này thực sự sử dụng biến _prefix "ẩn" đằng sau hậu trường, tức là nếu bạn có một thuộc tính được triển khai tự động "Public property Foo As Integer", thì bạn KHÔNG thể có khai báo biến thành viên "Private _foo như Số nguyên "

Không, tôi không mô tả các thuộc tính được triển khai tự động, ít nhất là trong ví dụ của tôi. Tôi đang mô tả một mức độ phạm vi không tồn tại trong C # hoặc VB. Thật đáng tiếc khi VB đã chọn một cách tầm thường như vậy để đánh lừa tên của các trường ủng hộ. Tình cờ của C # đủ xấu để bạn không bao giờ tạo ra một biến có cùng tên một cách tình cờ.
Robert Rossney

3

Ký hiệu _fieldName cho các trường riêng rất dễ bị hỏng . Sử dụng cái này." ký hiệu là không thể phá vỡ. Làm thế nào bạn sẽ phá vỡ ký hiệu _? Quan sát:

private void MyMethod()
{
  int _myInt = 1; 
  return; 
}

Có bạn đi, tôi chỉ vi phạm quy ước đặt tên của bạn nhưng nó biên dịch. Tôi muốn có một quy ước đặt tên đó là a) không phải là Lynn và b) rõ ràng. Tôi ủng hộ việc loại bỏ tên Hungary và điều này đủ điều kiện theo một cách. Thay vì loại đối tượng ở phía trước tên biến, bạn có cấp truy cập của nó.

Đối chiếu điều này với Ruby trong đó tên của biến @my_numberliên kết tên vào phạm vi và không thể phá vỡ.

chỉnh sửa: Câu trả lời này đã đi tiêu cực. Tôi không quan tâm, nó ở lại.


11
Hầu như không phải là một phê bình hợp lệ của một quy ước đặt tên để nói rằng các nhà phát triển không thể tuân theo nó.
Robert Rossney

8
Wow, định nghĩa của bạn về việc dễ dàng phá vỡ và tôi, giống như, hoàn toàn đối lập. Bạn có nghĩa là rất dễ phá vỡ một cách có chủ ý, trong khi hầu hết những người khác có thể có nghĩa là dễ dàng phá vỡ tình cờ . Tôi sẽ để nó như một bài tập cho người đọc để tìm ra cái nào phù hợp hơn bằng cách viết mã có thể đọc được
Konrad Rudolph

6
@Konrad: Bạn có vẻ tự phụ khi bạn nói "như một bài tập cho người đọc". Đây không phải là một cuốn sách giáo khoa toán học.
jcollum

3
Bây giờ ít tiêu cực hơn :) Trong khi chúng ta có thể chèo ngược với hiện tại, tôi cũng không thích quy ước gạch dưới. Theo quan điểm của tôi, nó không khác gì ký hiệu Hungary và thành thật mà nói, nó làm cho mắt tôi chảy máu (làm tổn thương khả năng đọc). Chúng tôi đã đưa ra Ký hiệu Hungary với C # và đã đến lúc phải loại bỏ di tích cuối cùng này về việc không tin tưởng vào IDE của bạn.
Tim Long

1
Tôi nghe nói rằng MS thực sự nói rằng dấu gạch dưới không được sử dụng trong hướng dẫn kiểu C # của nó. blog.msdn.microsoft.com/brada/2005/01/26/ Cách - phần 2.6 - có vẻ như Brad Abrams đồng ý với chúng tôi ít nhất!
jcollum

1

Khi bạn muốn lắp ráp của bạn tuân thủ CLS, bạn có thể sử dụng thuộc tính CLSCompliant trong tệp lắp ráp của bạn. Trình biên dịch sau đó sẽ khiếu nại khi mã của bạn chứa những thứ không tuân thủ cls.

Sau đó, khi bạn có 2 thuộc tính chỉ khác nhau trong trường hợp, trình biên dịch sẽ báo lỗi. Mặt khác, khi bạn có một lĩnh vực riêng tư và một tài sản công cộng trong cùng một lớp, sẽ không có vấn đề gì.

(Nhưng, tôi cũng luôn đặt tiền tố cho các thành viên riêng của mình bằng dấu gạch dưới. Nó cũng giúp tôi làm rõ khi tôi đọc mã của mình rằng một biến nhất định là trường thành viên).


0

Tôi thích sử dụng dấu gạch dưới trước các lĩnh vực riêng tư của tôi vì hai lý do. Một đã được đề cập, các trường nổi bật từ các thuộc tính liên quan của chúng trong mã và trong Intellisense. Lý do thứ hai là tôi có thể sử dụng các quy ước đặt tên tương tự cho dù tôi đang mã hóa bằng VB hay C #.


1
Whoah, có khôn ngoan không? Không gạch dưới có nghĩa là 'tiếp tục dòng tiếp theo' trong VB?
JBRWilkinson

1
Chỉ khi dấu gạch dưới được theo sau bởi một khoảng trắng.
Rob Windsor

Chữ cái đầu là chữ thường hoặc chữ in hoa nổi bật đối với tôi :)
ManoDestra

0

Không có ý nghĩa gì. Khi mã của bạn được biên dịch, tất cả những gì quan trọng đối với trình biên dịch là không gian tên và thuộc tính của trường / thuộc tính. Một dấu gạch dưới cũng quan trọng như bất kỳ ký tự nào khác khi đặt tên định danh. Bí quyết thực sự là sử dụng một quy ước mà bạn và những người xung quanh sẽ hiểu.

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.