Bất kỳ lý do nào để viết từ khóa “private” trong C #?


109

Theo như tôi biết, privatelà mặc định ở khắp mọi nơi trong C # (có nghĩa là nếu tôi không ghi public, protected, internal, vv nó sẽ privatetheo mặc định). (Vui lòng sửa cho tôi nếu tôi sai.)

Vì vậy, lý do gì để viết từ khóa đó, hoặc tại sao nó thậm chí tồn tại cho các thành viên?

Ví dụ: khi một trình xử lý sự kiện được tạo tự động, nó trông giống như sau:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Nhưng tại sao nó thậm chí viết riêng tư nếu đó là ngụ ý và mặc định? Để các nhà phát triển mới làm quen (những người không biết đó là mặc định C #) biết rằng nó là riêng tư? Hoặc là có sự khác biệt cho trình biên dịch?

Hơn nữa, có trường hợp viết "private" (một mình) sẽ làm thay đổi khả năng truy cập của thành viên không?


18
internalTuy nhiên , IIRC, loại "cấp cao nhất" sẽ là theo mặc định.
Jeff Mercado

4
Mặc định cho mọi thứ không phải là riêng tư, như đã chỉ ra và theo nguyên tắc chung, tốt hơn là nên rõ ràng.
James Michael Hare


Mặc định cho mọi thứ là "càng riêng tư càng tốt." Rõ ràng là một lớp không lồng nhau không thể là riêng tư, hoặc không có gì có thể khởi tạo hoặc sử dụng nó. Nhưng các thành viên là riêng tư theo mặc định và các lớp lồng nhau là riêng tư theo mặc định. Theo mặc định, mọi thứ trong C # đều có mức độ hiển thị hạn chế nhất mà nó có thể có.
Ryan Lundy

Câu trả lời:


171

AFAIK, private là mặc định ở mọi nơi trong C # (có nghĩa là nếu tôi không viết public, protected, internal, v.v. thì nó sẽ là private theo mặc định). (xin vui lòng sửa cho tôi nếu sai).

Đây không phải là sự thật. Các kiểu được xác định trong một không gian tên (lớp, cấu trúc, giao diện, v.v.) sẽ là nội bộ theo mặc định. Ngoài ra, các thành viên trong các loại khác nhau có các khả năng truy cập mặc định khác nhau (chẳng hạn như công khai cho các thành viên giao diện). Để biết chi tiết, hãy xem Mức độ trợ năng trên MSDN.

Cũng thế,

Vậy, lý do gì để viết từ khóa đó, hoặc tại sao nó lại tồn tại?

Việc chỉ định điều này một cách rõ ràng giúp biểu thị ý định của bạn để đặt kiểu riêng tư, rất rõ ràng. Điều này giúp bảo trì mã của bạn theo thời gian. Điều này có thể giúp các nhà phát triển khác (hoặc chính bạn) biết liệu một thành viên là riêng tư theo mặc định hay cố ý, v.v.


1
@Wayne: anh ấy có một câu trả lời với số điểm cao hơn Jon Skeet nhưng anh ấy không xứng đáng với nó ... Câu trả lời Jon chính xác hơn rất nhiều.
aleroot

2
Đây là một sự khác biệt vô nghĩa. Các loại trong không gian tên là nội bộ theo mặc định vì chúng không thể là riêng tư theo mặc định; nếu không thì không có gì có thể sử dụng chúng. Theo mặc định, chúng vẫn bị hạn chế hết mức có thể.
Ryan Lundy

1
Khả năng truy cập thành viên mặc định cho các lớp inisde và cấu trúc là riêng tư. Kiểm tra tại đây: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca

Nhưng các phần tử bên trong không gian tên không được private.
Shimmy Weitzhandler

Ngoài ra, getsetmặc định là khả năng truy cập của chính thuộc tính
AustinWBryan

119

AFAIK, riêng tư là mặc định ở mọi nơi trong C #

Không hoàn toàn - mặc định là "quyền truy cập hạn chế nhất có sẵn cho khai báo này". Vì vậy, ví dụ, với một loại cấp cao nhất, mặc định là internal; đối với kiểu lồng nhau, giá trị mặc định là private.

Vậy, lý do gì để viết từ khóa đó, hoặc tại sao nó lại tồn tại?

Nó làm cho nó rõ ràng, điều này tốt vì hai lý do:

  • Nó làm cho nó rõ ràng hơn cho những người không biết các mặc định, theo câu hỏi của bạn (cá nhân tôi chưa bao giờ thích lập luận này, nhưng tôi thấy nó đáng được đề cập)
  • Nó tạo ấn tượng rằng bạn đã cố tình quyết định đặt nó ở chế độ riêng tư, thay vì chỉ sử dụng mặc định.

Về phần cuối cùng của bạn:

Hơn nữa có trường hợp viết "private" (một mình) sẽ làm thay đổi khả năng truy cập của thành viên không?

Có, để làm cho một nửa thuộc tính hạn chế hơn phần còn lại:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

Tôi đã từng sử dụng mặc định ở mọi nơi tôi có thể, nhưng tôi đã bị thuyết phục (một phần bởi Eric Lippert) rằng việc nói rõ rằng bạn đã nghĩ về nó và quyết định đặt một cái gì đó riêng tư là một ý kiến ​​hay.

Cá nhân tôi ước có một cách làm điều đó cho các khai báo kiểu niêm phong / không niêm phong - thậm chí thể không mặc định. Tôi nghi ngờ rằng nhiều nhà phát triển (bao gồm cả bản thân tôi nếu tôi không cẩn thận) để lại các lớp chưa được niêm phong chỉ vì nó ít tốn công sức hơn là làm cho chúng được niêm phong.


+1. Sử dụng các từ khóa không liên quan để báo hiệu ý định ngữ nghĩa là hữu ích, mặc dù nền tảng Java của tôi làm cho việc sử dụng finalmột ví dụ điển hình hơn.
jprete 12/12/11

1
@minitech: Vòng theo cách khác cũng hoạt động, nhưng ít hữu ích hơn. Điều này đã được tất cả giới thiệu trong C # 2.
Jon Skeet

20
Tôi chắc chắn ước không có mặc định nào cả và trình biên dịch chỉ báo lỗi nếu công cụ sửa đổi truy cập bị thiếu. Tôi không nghĩ rằng hầu hết mọi người đều biết các giá trị mặc định là gì cho mọi tình huống, điều này dẫn đến các lỗi ngoài ý muốn.

+1 "đối với loại lồng nhau, mặc định là riêng tư" - Tôi chỉ biết về điều này khi tôi đọc câu trả lời của bạn. Cảm ơn!
Nordin

5
@Phong, đối với C # có một quy tắc đơn giản: Theo mặc định, mọi thứ đều riêng tư hết mức có thể. Các mục trong không gian tên chẳng hạn như các lớp không lồng nhau không thể là riêng tư, vì không có gì có thể sử dụng chúng. Họ chỉ có thể là nội bộ hoặc công khai; nên theo mặc định, chúng là nội bộ. Những thứ bên trong của những thứ khác (enums trong một lớp; các lớp lồng nhau; thuộc tính; trường; phương thức ...) là riêng tư theo mặc định.
Ryan Lundy

11

privatethêm hình ảnh lộn xộn. Đối với những người khăng khăng rằng nó làm cho mọi thứ rõ ràng, tôi sẽ hỏi: Bạn có làm điều này với toán học không? Ví dụ:

var answer = a + b / c;

Bạn có thấy rằng không rõ ràng nếu không có dấu ngoặc đơn thừa xung quanh b / c?

Quy tắc trong C # rất đơn giản: Theo mặc định, mọi thứ càng gần với chế độ riêng tư càng tốt. Vì vậy, nếu bạn cần một cái gì đó để được nhiều hơn có thể nhìn thấy hơn so với mặc định, thêm một modifier. Nếu không, đừng thêm các từ khóa không cần thiết vào mã của bạn.


1
Tôi đã từng đồng ý với quyền này trước khi đặt câu hỏi. Tuy nhiên, một số người viết VB, một số C ++, một số thậm chí F # (đến từ các ngôn ngữ chức năng khác chẳng hạn như Haskell?), Tốt hơn họ làm trên C #. Vì vậy, đối với họ (và đối với chúng tôi nếu chúng tôi quên nó sau 2 năm không có c # ing) sẽ tốt hơn nếu người truy cập rõ ràng. Đừng đánh giá thấp tác động của việc học dễ dàng đối với một dự án, nhiều nhà phát triển đến từ nền tảng có thể không phản ánh công cụ được lựa chọn và họ cần hỗ trợ học tập, ngay cả trong mã sản xuất, điều này không tệ chút nào (và chúng tôi biết nhiều mã C # rất tệ, vì vậy một số trợ giúp cũng giúp chúng tôi).
Camilo Martin

3
Vâng, chắc chắn, trong VB, mặc định là rất tệ. Tôi nghĩ rằng khả năng hiển thị mặc định là Frienddành cho các thành viên, chẳng hạn. C # thực hiện mặc định khả năng hiển thị của nó: Mọi thứ được đặt thành khả năng hiển thị ít nhất có thể trừ khi chúng bị thay đổi. Từ những gì tôi có thể tìm thấy, có vẻ như điều này cũng đúng với C ++ (ngoại trừ cấu trúc). (Nó không xuất hiện đến mức khó tin đối với F #.)
Ryan Lundy

6
Thật kỳ lạ đối với tôi khi có rất nhiều người ủng hộ var, bởi vì nó giảm bớt sự lộn xộn về mặt hình ảnh, tuy nhiên rất nhiều người lại ủng hộ việc gõ phím vô nghĩa private.
Ryan Lundy

2
Tôi thậm chí sẽ đi xa như vậy để cho rằng hỗn loạn thị giác ức chế khả năng đọc!
binki

1
upvoted mặc dù tôi làm thích sử dụng dấu ngoặc đơn trong trường hợp ví dụ toán học của bạn.
Marc.2377

7

Theo như tôi biết, riêng tư là mặc định ở mọi nơi trong C #

Khai báo rõ ràng là riêng tư , có nghĩa là bạn biết nó là riêng tư. Không chỉ nghĩ rằng nó là như vậy, bởi vì theo như bạn biết, nó là mặc định. Nó cũng có nghĩa là người khác nhìn vào mã sẽ biết nó là gì.

Không có "Tôi nghĩ rằng nó là", "Tôi khá chắc chắn là như vậy", v.v. Nó chỉ là . Và mọi người đều ở trên cùng một trang.

Tôi không phải là nhà phát triển C # . Nếu tôi phải làm việc với một số mã không được khai báo rõ ràng là riêng tư , tôi có thể sẽ cho rằng nó là nội bộ .

Tôi không thích khi mọi thứ được sắp đặt ngầm. Nó không bao giờ rõ ràng như khi chúng được thiết lập rõ ràng.


Nghe có vẻ hợp lý, tôi thậm chí còn quên những điều cơ bản về ngôn ngữ mà tôi từng biết rõ hơn.
Camilo Martin

6

Khả năng đọc - Không phải ai cũng có thể biết rằng riêng tư là hành vi mặc định.

Mục đích - Cung cấp dấu hiệu rõ ràng rằng bạn đã khai báo cụ thể tài sản là riêng tư (vì bất kỳ lý do gì).


5

Khả năng đọc, thể hiện ý định là hai lý do tuyệt vời mà tôi có thể nghĩ đến.


Đã đồng ý. Ví dụ: nếu bạn đang làm việc với các nhà phát triển khác về một chút mã, việc đặt nội dung nào đó thành riêng tư sẽ giúp cho biết ý định của bạn. Nó cũng hữu ích khi bạn quay lại mã của mình sau một vài năm và IDE của bạn có thể cho bạn biết phương thức nào nên có thể truy cập công khai cho lớp đó.
Aaron Newton

3

Một lý do chính đáng để chỉ định rõ ràng khả năng hiển thị là để bạn không phải suy nghĩ về đâu là mặc định cho ngữ cảnh bạn đang ở.

Một lý do tốt khác là vì FxCop yêu cầu bạn làm điều đó.


+1, Tôi vừa nhận thấy về việc FxCop phàn nàn về việc tôi xóa công cụ sửa đổi riêng tư ngay bây giờ khi tôi xây dựng với thay đổi.
Camilo Martin

2

Rất nhiều người (những người như tôi!) Thường xuyên lập trình bằng một số ngôn ngữ khác nhau. Rõ ràng với những thứ như thế này khiến tôi không cần phải nhớ tất cả các chi tiết phức tạp của tất cả các ngôn ngữ mà tôi lập trình.


1
Tôi sẽ không nói "công cụ sửa đổi truy cập mặc định là private" là một chi tiết phức tạp ... Nhưng tôi hiểu vấn đề. Hôm trước, tôi đã khó nhớ lại cách thức hoạt động của khuôn khổ tôi đã sử dụng tuần trước ( MEF ).
Camilo Martin,

0

Tôi muốn nói vì sự nhất quán với khả năng đọc được của phạm vi của phần còn lại của lớp.


4
Bạn đang nghĩ về C ++. Trong C #, ngay cả trong cấu trúc, các thành viên mặc định là riêng tư.

3
Các cấu trúc không có khả năng truy cập công khai theo mặc định - xem: msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed Copsey
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.