部分类在不同的命名空间
我可以在不同的命名空间中创build部分类吗? 它会正常工作吗? 例如:
将Class1.cs
namespace name1 { public partial class Foo { Bar1(){ return 10; } } }
class2.cs
namespace name1.name2 { public partial class Foo { Bar2(){ return 100; } } }
main.cs
using name1; using name1.name2; namespace mainClass { public class mainClass { Foo classFoo = new Foo(); int Count = classFoo.Bar1() + classFoo.Bar2(); // Will Count = 110? } }
我该怎么做才能使它工作? (如果我的例子不正确)
一个类的名字包括它的名字空间,所以name1.Foo
和name1.name2.Foo
是两个完全独立的types。 所以你的问题的简短答案是:不。
为什么你需要做这样的事情?
部分类只能在相同的名称空间和相同的程序集中使用。
命名空间可以在两个不同的程序集中,但部分类不能。
在实现部分类时需要考虑以下几点:
-
在部分类的每个部分使用partial关键字。
-
部分类的每个部分的名称应该相同,但部分类的每个部分的源文件名可以不同。
-
部分类的所有部分应该位于相同的命名空间中。
-
部分类的每个部分应该位于同一个程序集或DLL中,换句话说,不能在不同的类库项目的源文件中创build部分类。
-
部分类的每个部分都具有相同的可访问性。 (如私人,公共或受保护)
-
如果您inheritance了部分类的类或接口,则它将inheritance部分类的所有部分。
-
如果部分class级的一部分被封闭,那么整个class级将被封闭。
-
如果部分类的一部分是抽象的,那么整个类将被视为一个抽象类。
这是行不通的。 编译器会给你一个Foo classFoo = new Foo();
的模糊名字错误Foo classFoo = new Foo();
线。 对于部分类来说,它们必须位于相同的名称空间中,因为名称空间实际上是该types的完全限定名称的一部分。
此外,对于静态类,您可以使用静态特性在新的C#6.0的帮助下实现这样的事情。
考虑:
namespace SomeLogic1 { public static class Util { public static int Bar1() { return 1; } } } namespace SomeLogic2 { public static class Util { public static int Bar2() { return 2; } } } namespace GeneralStuff { using SomeLogic1; using SomeLogic2; public class MainClass { public MainClass() { // Error CS0104 // 'Util' is an ambiguous reference between 'SomeLogic1.Util' and 'SomeLogic2.Util' var result = Util.Bar1() + Util.Bar2(); } } }
没错,没有编译,错误信息很清楚。 为了解决这个问题,你可以直接指定命名空间(但是我不明白这一点)
namespace GeneralStuff { public class MainClass { public MainClass() { var result = SomeLogic1.Util.Bar1() + SomeLogic2.Util.Bar2(); } } }
或者你可以这样使用静态特征来应用:
namespace GeneralStuff { using static SomeLogic1.Util; using static SomeLogic2.Util; public class MainClass { public MainClass() { var result = Bar1() + Bar2(); } } }
对于一些helper / utils类也许可以这样做。 但是其他人已经注意到,部分class不是这样。
MSDN中对部分类和方法的限制https://msdn.microsoft.com/zh-cn/library/wa80x488.aspx