不同命名空间中的部分类

RAM*_*Me0 59 c# silverlight class partial

我可以在不同的命名空间中创建部分类吗?它会正常工作吗?例如:

将Class1.cs

namespace name1
{
    public partial class Foo
    {
        Bar1(){
            return 10;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

class2.cs

namespace name1.name2
{
    public partial class Foo
    {
        Bar2(){
            return 100;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能让它发挥作用?(如果我的例子不正确)

Cod*_*lla 87

类的名称包含它的命名空间,所以name1.Fooname1.name2.Foo是两个完全不同的类型.所以对你的问题的简短回答是:不.

为什么你需要做这样的事情?

  • 好吧,我建议两种可能性.第一个是在`name1.name2.Foo`中为`name1.Foo`创建一个子类.第二种方法是使用扩展方法(http://msdn.microsoft.com/en-us/library/bb383977.aspx),这是向你无法控制的类"添加"功能的好方法,或者用于无论什么原因,不想修改. (8认同)
  • @ RAMe0:部分类在编译时解析,.NET中没有部分类型的语言构造.它允许类的_source code_在编译期间出现在多个源文件中. (3认同)

Abd*_*oor 27

部分类只能在相同的命名空间和相同的程序集中使用.

命名空间可以在两个不同的程序集中,但是部分类不能.


Far*_* S. 12

在实现部分类时,需要考虑以下几点: -

  • 在部分类的每个部分中使用partial关键字.

  • 部分类的每个部分的名称应该相同,但是部分类的每个部分的源文件名可以是不同的.

  • 部分类的所有部分都应位于同一名称空间中.

  • 部分类的每个部分应该在同一个程序集或DLL中,换句话说,您不能在不同类库项目的源文件中创建部分类.

  • 部分类的每个部分都具有相同的可访问性.(如私人,公共或受保护)

  • 如果在部分类上继承类或接口,则它将在部分类的所有部分上继承.

  • 如果部分类的一部分被密封,则整个类将被密封.

  • 如果部分类的一部分是抽象的,则整个类将被视为抽象类.


Har*_*ber 7

这不行.编译器会Foo classFoo = new Foo();在行上给出一个模糊的名称错误.要使部分类起作用,它们必须位于同一名称空间中,因为名称空间实际上是该类型的完全限定名称的一部分.


psf*_*aki 5

另外,对于静态类,您可以在新的 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(); 
        }
    }
}  
Run Code Online (Sandbox Code Playgroud)

没错,就是编译不通过,错误信息很清楚。要解决这种情况,您可以直接指定名称空间(但据我了解,您不希望这样做):

namespace GeneralStuff
{
    public class MainClass
    {
        public MainClass()
        {
            var result = SomeLogic1.Util.Bar1() + SomeLogic2.Util.Bar2(); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以通过以下方式应用静态功能:

namespace GeneralStuff
{
    using static SomeLogic1.Util;
    using static SomeLogic2.Util;

    public class MainClass
    {
        public MainClass()
        {
            var result = Bar1() + Bar2(); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

也许对某些帮助器/实用程序类执行此操作是可以的。但正如其他人所注意到的那样,部分类并不是正确的方法。