nội bộ so với công khai trong c #


92

Tôi muốn biết sự khác biệt giữa công cụ sửa đổi khả năng hiển thị publicvà internalkhả năng hiển thị.

Khi nào chúng ta nên sử dụng internaltrên một lớp và khi publicnào? Tôi bối rối với khi một phương pháp nên là publichoặc internal.

Tôi đọc rằng internalcó thể được truy cập thông qua Assembly, trong khi publiccũng có thể được sử dụng thông qua assembly, nơi có sự khác biệt.

Câu trả lời:


101

public có thể nhìn thấy từ bất cứ đâu.

internal chỉ hiển thị trong một hội đồng

Bạn có xu hướng chỉ sử dụng nội bộ để bảo vệ các API nội bộ. Ví dụ: bạn có thể hiển thị một số quá tải của một phương thức:

public int Add(int x, int y)
public int Add(int x,int y, int z)

Cả hai đều gọi phương thức nội bộ

internal int Add(int[] numbers)

Sau đó, bạn có thể đặt rất nhiều sự phức tạp vào một phương thức, nhưng hãy "bảo vệ" nó bằng cách sử dụng các phương thức mặt tiền có thể giúp lập trình viên gọi phương thức một cách chính xác. (Ví dụ: phương thức triển khai với tham số mảng có thể có giới hạn giá trị tùy ý.)

Cũng cần lưu ý rằng sử dụng Reflection, bất kỳ và tất cả các phương thức đều có thể gọi được bất kể khả năng hiển thị của chúng. Một "hack" khác để kiểm soát / giành quyền truy cập vào các API ẩn bên trong.


5
trong một lớp nội bộ tôi có thể khai báo các phương thức công khai ..?
— NoviceToDotNet,

Không, vì điều này sẽ gây ra xung đột. Trình biên dịch sẽ cho bạn biết điều này và không biên dịch được.
— Chương trình. X

14
@ Program.X: Trên thực tế, bạn có thể và trình biên dịch không cho bạn biết bất cứ điều gì.
— HOẶC Người lập bản đồ

Trên thực tế, tôi đến đây googling cho dù đây có thực sự là một tính năng hay không. Hãy tưởng tượng tạo ra lớp internalvà tất cả các phương thức public. Nếu bạn cần khả năng hiển thị cao hơn, bạn có thể đặt lại cả lớp public. Nhưng tôi không chắc, liệu nó có được sử dụng theo cách này hay không. Vì vậy, tôi tiếp tục googling ... chỉnh sửa Et voilà, cùng chủ đề: stackoverflow.com/questions/9302236/…
— ecth

31

internalrất hữu ích khi bạn muốn khai báo một thành viên hoặc nhập bên trong một DLL, chứ không phải bên ngoài đó ...
thông thường, khi bạn khai báo một thành viên, Publicbạn có thể truy cập nó từ các DLL khác. nhưng, nếu bạn cần khai báo một cái gì đó là công khai ngay trong thư viện lớp của mình, bạn có thể khai báo nó là Internal.
trong sự đào thải chính thức: các thành viên nội bộ có thể nhìn thấy ngay bên trong hội đồng hiện tại ...


11

internalcũng hữu ích khi viết các bài kiểm tra đơn vị. Các InternalsVisibleTothuộc tính phép thử nghiệm của bạn truy cập, lắp ráp phương pháp nội bộ trong mã của bạn lắp ráp. Tức là bạn có thể kiểm tra các phương pháp có vẻ riêng tư với thế giới bên ngoài mà không cần sử dụng phản xạ.


6

Public cũng có thể được truy cập bên ngoài assembly. Vì vậy, khi bạn có một lớp không nên được truy cập mọi lớp trong hợp ngữ đều có thể truy cập nó, thì nội bộ là điều phù hợp. Nếu bạn cần truy cập bên ngoài, hãy sử dụng công khai.


4

Ngoài ra, các thuộc tính được đánh dấu là internalsẽ ném ra BindingExpression path errornếu được sử dụng cho DataBinding trong WPF. Vì vậy, chúng phải publichoạt động bình thường, ngay cả khi DataBinding diễn ra trong cùng một assembly.


-3

Nếu bạn có thể Tham chiếu tập hợp từ bên ngoài, bạn có phạm vi các lớp Nội bộ và công khai

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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.