2012-03-10 38 views
12

thể trùng lặp:
What is the difference between 'protected' and 'protected internal'?
What is the difference between Public, Private, Protected, and Nothing?Lẫn lộn: nội bộ, bảo vệ và bảo vệ nội bộ

Mã là như đã đề cập dưới đây:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace testanotherlib 
{ 
    public class A 
    { 
     internal void InternalDisplay() 
     { 
      Console.WriteLine("Internal Display Method."); 
     } 

     protected void ProtectedDisplay() 
     { 
      Console.WriteLine("Protected Display Method."); 
     } 

     protected internal void ProtectedInternalDisplay() 
     { 
      Console.WriteLine("ProtectedInternal Display Method."); 
     } 

     public void PublicDisplay() 
     { 
      Console.WriteLine("Public Display Method."); 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace testanotherlib 
{ 
    public class B : A 
    { 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using testanotherlib; 
namespace testlib 
{ 
    public class C:A 
    { 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using testlib; 
using testanotherlib; 

namespace testapp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      B objB = new B(); 
      C objC = new C(); 
     } 
    } 
} 

Tôi cố gắng để hiểu sự khác biệt giữa Trong ternal, bảo vệ và bảo vệ nội bộ. Đối với điều đó tôi đã tạo ra một ví dụ bằng cách sử dụng mã ở trên.

Trong một dự án thư viện lớp testanotherlib Tôi có lớp A & lớp B. Trong một dự án thư viện lớp testlib tôi có lớp C. Lớp chương trình nằm trong một ứng dụng bàn điều khiển riêng biệt. Bên trong phương thức chính của lớp Program, tôi đã tạo đối tượng cho lớp B (objB) và lớp C (objC). Đối với objB và objC, chỉ có thể truy cập phương thức công khai của lớp A. Tôi đã được mong đợi cho lớp B tất cả các phương pháp của lớp A sẽ có thể truy cập được. Vui lòng giúp tôi hiểu điều này. Nếu bạn cần bất kỳ thông tin nào khác về dự án, vui lòng hỏi tôi.

Kính trọng, Priyank

+0

Bạn mong đợi ở đâu để có thể truy cập tất cả các phương pháp của lớp A, tham chiếu đến lớp A? Mã của bạn không bao giờ cố gắng * sử dụng * các thành viên, mà làm cho nó khó để nói về ... –

+0

@ JonSkeet: Tôi đã mong đợi để có thể truy cập tất cả các phương thức nếu lớp A, với tham chiếu objB. –

+1

@PriyankThakkar: Từ 'testApp'? * Tại sao * bạn mong đợi điều đó? Mã trong 'testApp' không nằm trong cùng một assembly như' A' vì vậy bất kỳ thành viên bên trong nào cũng không nhìn thấy được, ví dụ. –

Trả lời

12

Có thể chỉ định năm mức truy cập sau bằng cách sử dụng công cụ sửa đổi truy cập:

công khai: Truy cập không bị giới hạn.

được bảo vệ: Quyền truy cập bị giới hạn ở lớp chứa hoặc loại có nguồn gốc từ lớp chứa.

Nội bộ: Quyền truy cập được giới hạn trong hội đồng hiện tại.

nội bộ được bảo vệ: Quyền truy cập bị giới hạn ở phiên bản hiện tại hoặc các loại có nguồn gốc từ lớp chứa.

riêng tư: Quyền truy cập được giới hạn ở loại có chứa.

Taken directly from Microsoft's MSDN library.

+0

Định nghĩa bạn đưa ra cho 'nội bộ được bảo vệ' có vẻ không chính xác vì 'hoặc'. Bạn có chắc chắn rằng nó không phải là 'và'? – ciuncan

+5

Bạn có thể đúng. Vui lòng thông báo cho Microsoft ngay lập tức !! –

+0

Ồ, tôi không chú ý đến liên kết, và lười biếng tìm kiếm. Lấy làm tiếc. Và vẫn có vẻ khá hợp lý. – ciuncan

5

internal

Chỉ có thể nhìn thấy trong các hội đồng hiện tại và thân thiện.

protected

Chỉ có thể nhìn thấy bên trong lớp kế thừa A.

protected internal

Visible trong lớp kế thừa A. Và cũng có thể nhìn thấy trong các hội đồng hiện tại và thân thiện.

+0

hey simon .. thanks for the help :) –

+0

bảo vệ nội bộ phương tiện bảo vệ HOẶC nội bộ; bạn đã mô tả nó là bảo vệ và nội bộ. – Tuan

4

protected phương pháp và thành viên chỉ có thể được truy cập từ một Lớp khác có nguồn gốc từ lớp khai báo phương pháp đã mua.

class A 
{ 
    protected void Method() {} 
} 

class B : A 
{ 
    public void Foo() 
    { 
     Method(); // works! 
    } 
} 

class C 
{ 
    public void Foo() 
    { 
     Method(); // won't work, obviously 

     var tmp = new A(); 
     tmp.Method(); // won't work either because its protected 
    } 
} 

internal làm cho phương thức chỉ hiển thị trong cùng một cụm. Đối với các lớp trong cùng một assembly, phương thức này có thể được sử dụng như là public. cho các lớp học bên ngoài của bạn assebmly hiện tại của nó như tư nhân.

Bây giờ kết hợp được bảo vệ và nội bộ làm cho một phương thức có thể sử dụng trong cùng một assembly cho tất cả các lớp trong assembly đó. Và bảo vệ làm cho phương thức có thể sử dụng được trong tất cả các lớp dẫn xuất không có vấn đề gì trong việc lắp ráp.

+0

Bạn đã được bảo vệ nội bộ sai, xem câu trả lời của tôi hoặc Chris 'cho rằng vấn đề. – Terkel

+0

@SimonBangTerkildsen Oh bạn nói đúng. tôi đã sửa chữa câu trả lời của mình. Không biết điều đó. Vâng, không bao giờ sử dụng nó bản thân mình. Vì vậy, nội bộ effectivly sẽ ghi đè từ khóa được bảo vệ. Và nội bộ bị bỏ qua khi có nguồn gốc. Không biết điều đó, và trong thực tế không thích nó :) Nhưng phải có một lý do chính đáng cho việc này. – dowhilefor

+0

@dowhilefor: cảm ơn vì đã giải thích nó bằng ví dụ tuyệt vời :) :) –

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