2009-04-02 26 views
78
internal class Foo 
{ 
    public void Fee() 
    { 
    Debug.WriteLine("Fee"); 
    } 

    internal void Fi() 
    { 
    Debug.WriteLine("Fi"); 
    } 
} 

Tôi nghĩ rằng phí() và Fi() đều có thể truy cập được vì toàn bộ lớp đã ở trong. Tôi có nhìn cái gì không? Có lý do nào để chọn công khai hoặc nội bộ cho các phương pháp trong trường hợp như thế này không?phương thức công cộng so với nội bộ trên một lớp nội bộ

+1

@EricLippert đã viết blog ý kiến ​​của anh ấy hôm nay. http://ericlippert.com/2014/09/15/internal-or-public/#more-2353 – ScottS

Trả lời

94

Tuyên bố internal class Foo sẽ ghi đè khả năng truy cập của phương thức public void Fee(), làm cho nội bộ trở nên hữu hiệu.

Trong trường hợp này, việc sử dụng nội bộ và công khai trên các phương pháp sẽ có cùng tác dụng. Lý do duy nhất tôi chọn phương pháp công cộng so với phương pháp nội bộ trong trường hợp như thế này là dễ dàng chuyển sang lớp công khai trong phiên bản tương lai, nếu bạn chọn làm như vậy.

+2

+1 Suy nghĩ của tôi chính xác! – si618

2

Theo số msdn documentation lớp Foo của bạn sẽ không bị tấn công bên ngoài hội đồng của bạn, do đó, nó không tạo sự khác biệt nào để đánh dấu các phương thức là nội bộ hoặc công khai; thậm chí nó không tạo sự khác biệt bằng cách sử dụng Thuộc tính InternalsVisibleTo

6

Bạn nói đúng, cả Phí và Fi đều có thể truy cập như nhau.

Từ CSharp Language Specification 3.0, dưới 3.5.2:

Tên miền truy cập của một viên lồng M tuyên bố trong một loại T trong một chương trình P được định nghĩa như sau (lưu ý rằng M thân thể có thể một loại):

• Nếu tuyên bố năng tiếp cận của M là công khai, tên miền năng tiếp cận của M là miền năng tiếp cận của T.

Vì vậy, ngay cả khi Phí được khai báo là công khai, nó sẽ có thể truy cập được như Foo (tức là nội bộ).

25

Thực ra - có sự khác biệt lớn nếu bạn đang sử dụng sự phản chiếu; đặc biệt, Silverlight có thể rất khó chịu nếu bạn thử và truy cập các phương thức nội bộ thông qua sự phản chiếu, ngay cả khi bạn đã có quyền truy cập. Tôi đã nhìn thấy những dịp khi tôi đã phải thực hiện một phương pháp công khai để làm cho mã làm việc trên Silverlight, mặc dù nó hoạt động trên NET thường xuyên.

Bạn có thể thấy tương tự với niềm tin một phần trong .NET thông thường.

+3

Đây là loại chi tiết bẩn mà tôi luôn quan tâm. Mặc dù, nói chung nếu ai đó đang sử dụng sự phản chiếu để truy cập các thành viên ẩn trong lớp học của tôi, tôi sẽ không lo lắng nếu nó khó khăn cho họ. – ScottS

+1

@ScottS - đôi khi bạn phản ánh các loại * sở hữu * của mình - tức là nơi bạn thường có quyền truy cập vào phương thức nội bộ, nhưng đột nhiên bạn không. –

32

Điều duy nhất còn thiếu ở đây trong câu trả lời là tại sao bạn làm điều này?

Một số thư viện có nhiều lớp không dành cho người tiêu dùng thư viện chạm vào nhưng phải kế thừa giao diện được đánh dấu là công khai. Ví dụ tôi có một thư viện với một lớp kế thừa giao diện IComparer nhưng nó chỉ được sử dụng trong nội bộ và tôi không muốn làm lộn xộn khía cạnh công cộng của thư viện của mình. Nếu tôi đánh dấu các chức năng so sánh thực hiện như nội bộ trình biên dịch phàn nàn rằng tôi không implant IComparer giao diện.

Vậy làm cách nào để triển khai thành công giao diện và đồng thời ngăn không cho nó có thể truy cập được ở khía cạnh công khai của thư viện của tôi? Đánh dấu lớp là nội bộ nhưng hàm được triển khai là công khai.

0

Tôi sẽ chỉ sử dụng các phương thức nội bộ nếu một lớp là nội bộ. trong trường hợp bạn thay đổi ý định của bạn và làm cho lớp công khai bạn chỉ có thể làm một văn bản thay thế và bạn đã hoàn tất.

7

Nó sẽ tạo sự khác biệt khi bạn muốn lớp nội bộ của bạn triển khai giao diện. Phương pháp thực hiện một số giao diện sẽ phải là Công khai.

Các vấn đề liên quan