2016-01-14 15 views
5

Về cơ bản tôi có tệp CS xác định một lớp nội bộ, sau đó tôi sao chép vào nhiều dự án CS khác nhau. Và các hội đồng của các dự án CS này sẽ được tải trong một ứng dụng. Chương trình dường như chỉ chạy tốt.Các lớp bên trong có cùng các không gian tên nhưng trong các assembly khác nhau?

Tuy nhiên, việc có nhiều lớp có cùng tên lớp trong cùng một không gian tên khiến tôi cảm thấy khó chịu ngay cả khi chúng nằm trong mỗi assembly.

Là một lớp duy nhất được xác định thông qua tên lớp, không gian tên cũng như lắp ráp trong một AppDomain?

+1

Tại sao bạn đang sử dụng không gian tên cùng trong hội đồng khác nhau? Nghe có vẻ như nó đang hỏi rắc rối. –

+0

@NickBailey Sử dụng cùng một tên không gian tên trong các hội đồng khác nhau không phải là xấu, như 'System.Collections.Generic' trong cả hai' System.dll' và 'System.Core.dll'. –

Trả lời

8

Lớp học có được nhận dạng duy nhất thông qua tên lớp, không gian tên cũng như lắp ráp trong một AppDomain không?

Câu trả lời ngắn gọn: có.

Câu trả lời dài hơn:

Có một số điểm cần xem xét.

Trước tiên, từ quan điểm CLR, không có điều gì là "không gian tên". Tên của loại chuỗi là System.String đến mức CLR có liên quan. Vì vậy, nó là chính xác hơn để nói rằng từ quan điểm CLR, một loại được xác định duy nhất bởi tên và lắp ráp của nó.

Thứ hai, các loại có thể được lồng nhau. Vì vậy, các loại thực sự được xác định theo tên của chúng, có chứa loại (nếu có) và lắp ráp.

Thứ ba, các loại có thể là chung chung. Foo.BarFoo.Bar<T> là các loại khác nhau. Vì vậy, các loại được xác định bởi tên của chúng, có chứa loại, lắp ráp, và tính chất chung chung.

Thứ tư, và đây là điều kỳ lạ, CLR xem xét các loại trong các cụm được nạp với Load khác với các loại trong cùng một cụm được nạp với LoadFrom. Bạn có thể kết thúc với các tình huống mà CLR cho bạn biết rằng loại Foo trong Assembly Bar không tương thích với kiểu Foo trong Assembly Bar, và cậu bé, điều đó rất khó hiểu.

1

Trong khi nó làm cho mọi thứ khó hiểu tất cả các lớp bên trong của bạn chỉ tồn tại trong hội đồng tương ứng của chúng để chúng tự trị và sẽ không được nhìn thấy bởi các lớp khác trong hội đồng khác.

Nhưng từ quan điểm bảo trì và đơn giản, nên đặt ở đầu nhiệm vụ giữ nhà.

+1

vâng, nó là một hack. Và câu hỏi của tôi là nhiều hơn về khoa học máy tính chứ không phải là kĩ nghệ phần mềm. Vậy CLR sẽ không phàn nàn trong mọi tình huống? – ZZZ

1

Có, CLR sử dụng lắp ráp để xác định từng loại. Nếu bạn biên dịch một ứng dụng Hello World đơn giản và xem IL:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  13 (0xd) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldstr  "Hello world" 
    IL_0006: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_000b: nop 
    IL_000c: ret 
} // end of method Program::Main 

Bạn có thể xem cách System.Console được gọi bằng cách bao gồm tên lắp ráp, không gian tên và tên lớp. Tuy nhiên, nếu bạn đang đề cập đến một loại trong cùng một assembly, tên lắp ráp có thể được ngụ ý, ví dụ .:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  13 (0xd) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldstr  "Hello world" 
    IL_0006: call  void ConsoleApplication1.Foo::Write(string) 
    IL_000b: nop 
    IL_000c: ret 
} // end of method Program::Main 
Các vấn đề liên quan