2013-09-11 71 views
51

Tôi đang tổ chức một dự án thư viện và tôi có một lớp người quản lý trung tâm có tên là Scenegraph và một nhóm toàn bộ các lớp khác sống trong không gian tên Scenegraph.Không gian tên và lớp học có cùng tên?

Điều tôi thực sự thích là cho scenegraph là và các lớp khác là MyLib.Scenegraph.*, nhưng dường như cách duy nhất để làm điều đó là làm cho tất cả các lớp bên trong khác là Scenegraph trong Scenegraph. tệp cs và điều đó quá khó sử dụng. Thay vào đó, tôi đã tổ chức nó là Mylib.Scenegraph.ScenegraphMyLib.Scenegraph.*, loại công việc nào nhưng tôi thấy Visual Studio bị nhầm lẫn trong một số điều kiện là liệu tôi đang tham chiếu đến lớp hay không gian tên.

Có cách nào tốt để tổ chức gói này để thuận tiện cho người dùng mà không cần phải kết hợp tất cả mã của tôi với nhau trong một mớ hỗn độn không thể duy trì?

Trả lời

64

Tôi không khuyên bạn đặt tên cho một lớp như không gian tên của nó, xem this.

The Framework Design Guidelines say in section 3.4 “do not use the same name for a namespace and a type in that namespace”. That is:

namespace MyContainers.List 
{ 
    public class List { … } 
} 

Why is this badness? Oh, let me count the ways.

You can get yourself into situations where you think you are referring to one thing but in fact are referring to something else. Suppose you end up in this unfortunate situation: you are writing Blah.DLL and importing Foo.DLL and Bar.DLL, which, unfortunately, both have a type called Foo:

// Foo.DLL: 
namespace Foo { public class Foo { } } 

// Bar.DLL: 
namespace Bar { public class Foo { } } 

// Blah.DLL: 
namespace Blah 
{ 
using Foo; 
using Bar; 
class C { Foo foo; } 
} 

The compiler gives an error. “Foo” is ambiguous between Foo.Foo and Bar.Foo. Bummer. I guess I’ll fix that by fully qualifying the name:

class C { Foo.Foo foo; } 

This now gives the ambiguity error “Foo in Foo.Foo is ambiguous between Foo.Foo and Bar.Foo”. We still don’t know what the first Foo refers to, and until we can figure that out, we don’t even bother to try to figure out what the second one refers to.

+3

Điểm thú vị của nó. Im stil lcogitating trên đó. Cảm ơn. Tôi phải là các đối số trung thực bắt đầu bằng "Hướng dẫn kiểu nói" không gây ấn tượng với tôi. Tôi đã nhìn thấy rất nhiều crap vô lý trong hướng dẫn phong cách. Nhưng bạn thực hiện một đối số thực tế tốt ở trên. Đáng suy nghĩ về, anyway. – user430788

+0

Cảm ơn bạn đã giải thích điều này ... Tôi sắp sửa tức giận ở .NET cho đến khi bạn giải thích lý do hoàn toàn hợp lý, nó hoạt động theo cách này. – levininja

+3

Câu trả lời cho biết "không nên làm gì". Trong khi một số người dùng ngăn xếp tìm kiếm "cần làm gì". Có ai đề nghị Ant_222 trả lời? – fantastory

3

CA1724: Type Names Should Not Match Namespaces ...

Về cơ bản, nếu bạn làm theo Phân tích Mã cho thích hợp mã hóa quy tắc này cho biết để không làm wha bạn đang cố gắng làm. Phân tích mã là rất hữu ích trong việc giúp bạn tìm thấy khả năng xảy ra sự cố.

4

Tôi khuyên bạn nên làm theo lời khuyên tôi nhận được trên microsoft.public.dotnet.languages.csharp để sử dụng MyLib.ScenegraphUtil.ScenegraphMyLib.ScenegraphUtil.*.

1

Chỉ cần thêm 2 của tôi cent:

tôi đã có lớp sau:

namespace Foo { 
    public struct Bar { 
    } 
    public class Foo { 
     //no method or member named "Bar" 
    } 
} 

Các khách hàng đã được viết như thế này:

using Foo; 

public class Blah { 
    public void GetFoo(out Foo.Bar[] barArray) { 
    } 
} 

Tha thứ cho những lỗi getFoo không trở về đầu ra thay vì sử dụng tham số ngoài, trình biên dịch không thể giải quyết kiểu dữ liệu Foo.Bar []. Nó đã trả lại lỗi: không thể tìm thấy loại hoặc không gian tên Foo.Bar.

Dường như khi nó cố gắng biên dịch nó đã giải quyết Foo là lớp và không tìm thấy một lớp học được nhúng trong Bar trong lớp Foo. Nó cũng không thể tìm thấy một không gian tên gọi là Foo.Bar. Nó không tìm được một thanh hạng trong không gian tên Foo. Các dấu chấm trong một không gian tên KHÔNG phải là cú pháp. Toàn bộ chuỗi là một mã thông báo, không phải là các từ được phân tách bằng dấu chấm.

Hành vi này đã được trưng bày bởi VS 2015 chạy Net 4.6

0

Giving cùng tên với namespace và các lớp có thể gây nhầm lẫn cho trình biên dịch như những người khác đã nói.

Làm cách nào để đặt tên cho nó?

Nếu không gian tên có nhiều lớp thì hãy tìm tên xác định tất cả các lớp đó.

Nếu namespace có chỉ là một lớp (và do đó sự cám dỗ để cho nó cùng tên) tên namespace ClassName NS. Đây là cách Microsoft đặt tên cho không gian tên của họ ít nhất.