2013-05-11 28 views
11

Tôi đã nhìn thấy một số mã C# khai báo một lớp học với một modifier internal, với một constructor public:gì một constructor cộng đồng về một lớp học nội nghĩa

internal class SomeClass 
{ 
    public SomeClass() 
    { 
    } 
} 

điểm của việc có một nhà xây dựng cộng đồng là gì , nếu khả năng hiển thị của toàn bộ lớp là nội bộ, do đó nó có thể được nhìn thấy chỉ trong hội đồng định nghĩa?

Ngoài ra, điều này có ý nghĩa gì trong trường hợp SomeClass là một lớp lồng nhau không?

+2

Nếu bạn tạo một UserControl nội bộ với một hàm tạo nội bộ, trình thiết kế Win Forms sẽ hoạt động không đúng. – DaveShaw

+1

Hãy suy nghĩ về công cụ sửa đổi truy cập trên lớp như là một loại "công tắc tổng thể", thiết lập khả năng truy cập * tối đa * của tất cả các thành viên của lớp. –

+0

@ChrisMcGrath. Phần lớn tôi sẽ đồng ý, mặc dù câu hỏi này cũng hỏi về việc lồng ghép các lớp (và tôi đã bỏ lỡ điều đó trong lần đọc đầu tiên của mình, vì vậy tôi đã giải quyết nó trong một bản chỉnh sửa cho câu trả lời của tôi). –

Trả lời

14

Phạm vi internal class đè phạm vi constructor public MyClass(), làm cho các nhà xây dựng internal.

Sử dụng public trên hàm tạo để dễ dàng cập nhật lớp học lên public sau đó, nhưng gây nhầm lẫn. Tôi không làm.

Chỉnh sửa 3: Tôi đã bỏ lỡ một phần câu hỏi của bạn. Nó vẫn là tốt để làm điều đó nếu lớp của bạn được lồng nhau. Làm tổ không thể tạo ra bất kỳ sự khác biệt nào, ngay cả khi nó được lồng trong một lớp riêng tư trong một lớp công khai trong một ... (xem C# language specification - 3.5.2 Accessibility domains).

EDIT: Và, nếu tôi nhớ lại, nếu ctor là internal, nó không thể được sử dụng như một kiểu generic, nơi có một hạn chế đòi hỏi where T : new(), điều này sẽ đòi hỏi một public constructor (. Ref C# language specification (version 4.0) - 4.4.3 Bound and unbound types) .

Chỉnh sửa 2: mẫu mã thể hiện trên

class Program 
{ 
    internal class InternalClass { 
     internal InternalClass() { } 
    } 
    internal class InternalClassPublicCtor { 
     public InternalClassPublicCtor() { }   
    } 
    internal class GenericClass<T> 
     where T : new() {} 

    static void Main(string[] args) { 
     GenericClass<InternalClass> doesNotCompile = new GenericClass<InternalClass>(); 
     GenericClass<InternalClassPublicCtor> doesCompile = new GenericClass<InternalClassPublicCtor>(); 
    } 
} 
+0

i am của cùng một tâm trí về ý định khó hiểu, trừ khi bạn có rất nhiều nhà xây dựng nó không phải là quá khó khăn để thay đổi các nhà thầu của bạn cho công chúng sau khi cập nhật và nhiều công cụ tái cấu trúc sẽ đề nghị này là tốt –

0

Từ khóa nội bộ là công cụ sửa đổi truy cập cho các loại và nhập thành viên. Các thành viên nội bộ chỉ có thể truy cập trong các tệp trong cùng một assembly.

Ví dụ: Microsoft internal modifier

+0

Nhưng câu hỏi đã không hỏi những gì bộ sửa đổi nội bộ không ...? –

6

Từ MSDN - Access Modifiers (C# Programming Guide):

Thông thường, khả năng tiếp cận của một thành viên là không lớn hơn khả năng tiếp cận của các loại có chứa nó. Tuy nhiên, một thành viên công khai của một lớp bên trong có thể truy cập từ bên ngoài assembly nếu thành viên thực hiện các phương thức giao diện hoặc ghi đè các phương thức ảo được định nghĩa trong một lớp cơ sở công khai.

Vì vậy, nếu, ví dụ, bạn có triển khai nội bộ giao diện công khai, bạn vẫn có thể hiển thị một số thành viên nhất định ở chế độ công khai.

Ngoài ra, giả sử bạn đột nhiên muốn lớp học nội bộ của bạn được công khai. Việc thay đổi bộ sửa đổi truy cập trên lớp dễ dàng hơn rất nhiều so với tất cả các thành viên.

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