2011-10-17 37 views
6

Tôi nghĩ điều sau đây có ý nghĩa nhưng không thể xảy ra và sẽ xảy ra lỗi: The namespace 'foo' already contains a definition for 'bar'.Không gian tên có cùng tên với tên lớp

namespace foo 
{ 
    public class bar { ... } 
} 

namespace foo.bar 
{ 
    public class baz : EventArgs { ... } 
} 

Cách đặt tên không gian tên thích hợp cho trường hợp như thế này là gì?

+3

Nếu không có ví dụ thực tế, các đề xuất sẽ phải đưa ra các dự đoán được giáo dục, bao gồm tất cả các cơ sở tiềm năng hoặc không có câu trả lời hay; theo quy tắc của ngón tay cái, một không gian tên là một thể loại, hoặc tổng quát, và một lớp học một tiện ích cụ thể - đặt tên nên phản ánh điều này. Ví dụ, không gian tên 'System.Collections' và các lớp, chẳng hạn như' System.Collections.CollectionBase'. Nếu có một yêu cầu cho một lớp có tên là 'Bộ sưu tập' trong không gian tên này thì cái gì khác là sai. –

+0

Đó là nhiều hơn hoặc ít hơn một ví dụ thực tế. Tôi muốn sử dụng một kiểu tùy chỉnh dựa trên 'EventArgs', trong lớp' bar'. Tôi có nên đặt loại tùy chỉnh trong cùng một không gian tên như 'thanh' không? – Stijn

Trả lời

4

Điều này thực sự phụ thuộc vào những gì bạn đang cố gắng để đạt được. Nếu bạn thực sự muốn baz ngồi dưới namespace foo.bar bởi vì nó phụ thuộc/liên kết chặt chẽ bạn thanh có thể làm cho nó một lớp con của thanh:

namespace foo 
{ 
    public class bar 
    { 
     public class baz : EventArgs { ... } 
    } 
} 

Bây giờ bạn có thể tạo một đối tượng mới như:

var test = new foo.bar.baz(); 
+0

Điều này trông giống như những gì tôi muốn đạt được. Sẽ chấp nhận một khi tôi được phép. – Stijn

4

Bạn phải tìm một tên khác cho không gian tên hoặc tên lớp. Không có cách nào xung quanh nó.

Tìm cách đặt tên phù hợp là khó nhưng có thể thực hiện được.

1

Trong cùng một không gian tên, không thể có cùng một tên lớp. Nếu không gian tên của bạn trông rất giống nhau, bạn có thể muốn chúng trong cùng một không gian tên. Nếu đây không phải là trường hợp bạn có thể cần phải xem xét lại việc phân loại hợp lý các lớp của bạn trong các không gian tên.

+1

Đồng ý, '.' trong một không gian tên bị ràng buộc gây ra sự nhầm lẫn xa hơn xuống dòng. – christofr

0

có thể

namespace foo_bar 
{ 
    public class baz : EventArgs { ... } 
} 

Nếu nó chỉ đơn giản là không thể

7

Bạn phải hiểu rằng trong ngữ cảnh của CLR, không có điều gì như một không gian tên. Không gian tên hoàn toàn là một tính năng ngôn ngữ chỉ tồn tại để đơn giản hóa mã để chúng tôi không phải luôn luôn đọc tên lớp đầy đủ.

Trong ví dụ của bạn,

namespace foo 
{ 
    public class bar { ... } 
} 



namespace foo.bar 
{ 
    public class baz : EventArgs { ... } 
} 

khi sourcecode này được biên dịch, các IL là không hề biết rằng có hai không gian tên - foo và foo.bar. Thay vào đó, nó chỉ biết về các định nghĩa lớp. Trong trường hợp này, khi nó đi qua thanh lớp, nó biết rằng bạn có một lớp được gọi là foo.bar

Khi nói đến lớp baz, nó giải quyết tên đầy đủ của lớp là foo.bar. baz

Nhưng nếu trường hợp này xảy ra, baz phải được khai báo đúng trong định nghĩa lớp của thanh chứ không phải trong không gian tên riêng biệt như bạn đã làm ở đây.

+0

+1 cho giải thích kỹ thuật đằng sau điều này. – Stijn

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