我有一个带有多个命名空间的结构,并且在每个命名空间中我有一个静态类,它在该命名空间的网络中是一个小的小蜘蛛。就像部门主管一样。
我们举两个名称空间Foo.Bar.Baz
和Foo.Bar.Quux
的示例。
我有一个看起来像这样的文件:
namespace Foo.Bar.Baz
{
static class Baz
{
public static void DoSomething()
{
Console.Writeline("Doing something...");
}
}
}
然后是第二个文件:
using Foo.Bar.Baz
namespace Foo.Bar.Quux
{
static class Quux
{
public static void GetToWork()
{
Baz.DoSomething();
}
}
}
现在,当我尝试编译时,我在第二个文件中出现错误,因为它认为Baz是命名空间而不是类。但是因为我有一行using Foo.Bar.Baz
,所以可以使用该命名空间内的任何类,而不需要在命名空间的名称前加上它,对吧?我可以正确使用该命名空间中的其他内容,但不能使用同名的类。
有点像编译器秘密地将此行添加到每个文件:using Foo.Bar
。
另外,我不能将静态Baz
类放在Foo.Bar
命名空间中,因为那时我会得到错误,说Foo.Bar.Baz
不是命名空间(因为我有其他东西)命名空间并拥有使用该命名空间的文件。然后似乎编译器看到静态类并确定Foo.Bar.Baz
是静态类而不是命名空间。
当然,我可以将静态类重命名为Manager,但我仍然需要在需要从两个名称空间访问内容的文件中拼出完整的Baz.Manager.SomeMethod
和Quux.Manager.SomeMethod
。这感觉相当笨拙,我宁愿把它变成Baz.SomeMethod
和Quuz.SomeMethod
。
有什么想法吗?
答案 0 :(得分:1)
也许这会有所帮助:
using Baz = Foo.Bar.Baz.Baz;
答案 1 :(得分:0)
由于Baz
是静态类,因此它不能包含实例成员。因此,DoSomething()
必须声明为静态方法。
一旦你有了这个,你可以这样做:
using Foo.Bar.Baz;
public void GetToWork()
{
Baz.Baz.DoSomething();
}
或者这个:
using baz = Foo.Bar.Baz.Baz;
public void GetToWork()
{
baz.DoSomething();
}
但是,我同意你的问题中的注释,即对命名空间使用相同的名称(一组类的逻辑容器)及其包含的类(封装数据和行为)可能会导致可读性/可维护性问题。 / p>