2011-09-11 32 views
51

"riêng tư, được bảo vệ hoặc được bảo vệ riêng tư và nhận lỗi này " Các yếu tố được xác định trong không gian tên không được khai báo rõ ràng là riêng tư, được bảo vệ hoặc được bảo vệ bên trong "Lỗi "Các phần tử được xác định trong không gian tên không thể được khai báo rõ ràng là"

Tôi hiểu ý nghĩa của nó nhưng tôi muốn hỏi tại sao điều này không được phép? Tất cả các mô-đun truy cập không áp dụng được trên Lớp học? Tại sao tôi không thể tạo lớp học riêng tư, được bảo vệ hoặc được bảo vệ nội bộ?

Trả lời

69

Do phương tiện cá nhân có nghĩa là thành viên chỉ hiển thị trong lớp có chứa. Vì một lớp cấp cao nhất không có lớp nào chứa nó nên nó không thể là private (hoặc protected). (Nội bộ hoặc công khai là công cụ sửa đổi hợp lệ).

Bạn muốn riêng tư có ý nghĩa gì đối với lớp học hàng đầu?

Tất nhiên tất cả các công cụ sửa đổi áp dụng cho các lớp lồng nhau, tức là một lớp được xác định trong một lớp khác.

+3

Điều gì sẽ xảy ra nếu tôi muốn lớp chỉ hiển thị cho các lớp trong một không gian tên cụ thể? làm thế nào để làm điều đó, mà không cần phải di chuyển lớp bên trong một lớp khác? – Ahmed

+2

Về cơ bản bạn không thể. Đây sẽ là một tính năng kỳ lạ nếu bạn hỏi tôi, vì cùng một không gian tên có thể tồn tại trong nhiều assembly chẳng hạn. – DeCaf

+0

Cảm ơn, tôi đoán java có một cái gì đó như truy cập cấp gói hoặc tương tự, tôi sẽ xem xét nó .. – Ahmed

2

Chỉ các lớp lồng nhau mới có thể được khai báo là riêng tư. Không phải lớp lồng nhau chỉ có thể là công khai hoặc nội bộ (ẩn mà không có công cụ sửa đổi)

3

Bởi vì nó không có ý nghĩa. Không có cách nào bạn có thể truy cập các lớp được bảo vệ hoặc riêng tư được định nghĩa ở mức không gian tên, chỉ như các lớp lồng nhau.

+1

Bây giờ bạn đã nói rằng 'private' doesn ' T có ý nghĩa, cố gắng biện minh cho lý do tại sao "công khai" có ý nghĩa, mà không mâu thuẫn với chính mình. Và vì chúng tôi không thể viết 'riêng tư', vậy thì lớp học không có vòng loại truy cập là gì? Không có quý ông, ở đây, chắc chắn, đó là C# mà không có ý nghĩa. 'private' có nghĩa là chỉ hiển thị trong không gian tên này, và' internal private' có nghĩa là không gian tên này trong assembly này. Nó làm cho cảm giác hoàn hảo ngược lại. –

+0

@ v.oddou: không chắc chắn nếu đó là C# giới hạn CLR. dù sao, tôi cũng sẽ thích modifiers truy cập chi tiết hơn (như trong Scala có lẽ). nhưng thiết kế hiện tại là đủ vững chắc cho tôi và không làm phiền hoặc hạn chế tôi, không giống như nhiều C# sai sót khác. – Kostassoid

12

Bạn có thể sử dụng chỉ public hoặc internal ở mức Namespace

0

Khả năng tiếp cận mặc định các loại cấp cao nhất là internal.

Khả năng truy cập mặc định của thành viên lớp và cấu trúc là private.

Khả năng truy cập duy nhất của giao diện và thành viên enum là public.

Vì vậy, lớp học theo mặc định là private và nếu bạn muốn truy cập vào đó, bạn phải đặt public trước đó.

+1

Câu hỏi đặt ra là nói về các specifier truy cập trên * classes * (đặc biệt, các lớp cấp cao nhất), không phải * thành viên lớp *. Câu trả lời này không trả lời câu hỏi được hỏi và "một lớp là theo mặc định riêng tư" chỉ đơn giản là không chính xác. –

1

As Abatonime said, bạn chỉ có thể sử dụng public hoặc internal ở cấp Không gian tên.
private, protected hoặc protected internal chỉ có thể được sử dụng ở cấp Lớp.

này hoạt động

namespace X 
{ 
    class A 
    { 
     // class code here 

     private class B 
     { 
      // class code here 
     } 
    } 
} 

này sẽ không

namespace X 
{ 
    class A 
    { 
     // class code here 
    } 

    private class B 
    { 
     // class code here 
    } 
} 
+1

Đã thêm câu trả lời này vì chuỗi này không có ví dụ về mã. – SNag

1

Tôi có vấn đề này cùng bởi vì tôi đã tạo ra một DLL tùy chỉnh và chỉ muốn lớp học nhất định để được hiển thị cho một ứng dụng bằng cách sử dụng DLL. Vì vậy, tôi chỉ cần loại bỏ các sửa đổi hoàn toàn cho các lớp học tôi muốn được tư nhân (trong không gian tên cụ thể).Các lớp vẫn có thể truy cập đến các lớp khác trong cùng một không gian tên trong DLL nhưng không hiển thị trong Intellisense trong ứng dụng gọi. Không cần cho các lớp lồng nhau. Lời giải thích duy nhất tôi có thể nghĩ đến là thông báo lỗi nói rằng không thể "tuyên bố rõ ràng" riêng tư ... nó không nói bất cứ điều gì về ngầm.

namespace SmartCardAuthentication 
{ 
    class SmartCardIdentity : IIdentity 
    { 
    private string _firstName; 
    private string _lastName; 
    private string _middleInitial; 

     .... 
    } 
} 

Ví dụ mã ở trên, lớp "SmartCardIdentity" có sẵn cho lớp khác trong cùng một không gian tên nhưng không khả dụng cho ứng dụng gọi khi lớp này được đưa vào DLL. Tôi đã không kiểm tra nó theo cách khác (tức là khả năng hiển thị từ một lớp trong một không gian tên khác trong tệp DLL.).

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