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.
- Chúng tôi sử dụng
_camelCase
cho 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, readonly
nên đến sau static
(tức là static readonly
không readonly static
).
- 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
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 #