什么时候应该使用 Partial 关键字?

问题描述 投票:0回答:5

我正在阅读关于 Partial 关键字的 MSDN 文章,这部分引起了我的注意:

partial 关键字表示类、结构体的其他部分、 或接口可以在命名空间中定义。所有零件必须使用 部分关键字。所有部分必须在编译时可用 形成最终类型。所有零件必须具有相同的 可访问性,例如公共、私人等。

[...]

指定基类的所有部分必须一致,但指定基类的部分必须一致 省略基类仍然继承基类型。 零件可指定 不同的基本接口,最终类型实现了所有 所有部分声明列出的接口。任何类、结构、 或在部分定义中声明的接口成员可用于 所有其他部分。 最终类型是所有类型的组合 编译时的部分。

我对这个概念有两个问题:

  • 首先,这似乎是一种绕过 C# 中缺乏多重继承的方法(当然,除了接口之外)。除了正常的多重继承问题(例如钻石问题)之外,这样做还会有任何影响吗?基本上,仅仅因为我可以,就意味着我应该吗?

  • 其次,我到底什么时候应该分割文件?通过阅读本文,感觉我应该能够在自己的文件中声明一个嵌套类,并将其与包含的类一起部分化,从而提高可读性。这就是Partial的意义所在吗,还是只能按照上面文章中描述的方式使用?

c# multiple-inheritance partial-classes
5个回答
8
投票

首先,这与C#中的多重继承无关。它只是允许您在文件之间拆分类的实现。 C# 中的常规类也可以实现多个接口,因此使用部分类不会获得任何好处。

其次,当类的部分实现是由某种工具生成而另一部分由开发人员编写时,分部类是最有用的。这允许您重新生成代码的生成部分,而不会丢失实现的手工编码部分。


2
投票

部分类与多重继承无关。使用它们的唯一很好的理由是当类的一部分被生成而另一个是你自己的时。


2
投票

不,它提到了基接口,而不是具体类型,因此多重继承仍然是不可能的。对于第二点,主要原因是允许生成工具创建一个部分,该部分隐藏了开发人员编辑的部分的许多实现细节。


1
投票

首先,这似乎是一种绕过 C# 中缺乏多重继承的方法(当然,除了接口之外)。除了正常的多重继承问题(例如钻石问题)之外,这样做还会有任何影响吗?基本上,仅仅因为我可以,就意味着我应该吗?

它不进行多重继承。它实际上更邪恶,因为它暴露了私有变量——但同时它没有引入钻石。尝试以下代码看看我的意思:

public class Test0
{
    protected int bar;

    public void Unexpected() { Console.WriteLine("3. {0}", bar); }
}

public partial class Test1
{
    private int foo;

    public void Foo() { Console.WriteLine("1. {0}", foo); bar = 1; }
}

public partial class Test1 : Test0
{
    public void Bar() { Console.WriteLine("2. {0}", foo); foo = 1; }
}

class Driver
{
    public static void Main()
    {
        var t1 = new Test1();
        t1.Bar();
        t1.Foo();
        t1.Unexpected();
        Console.ReadLine();
    }
} 

换句话说,你应该非常小心变量。

其次,我到底什么时候应该分割文件?通过阅读本文,感觉我应该能够在自己的文件中声明一个嵌套类,并将其与包含的类一起部分化,从而提高可读性。这就是 Partial 的意义吗,还是只能按照上面文章中描述的方式使用?

代码生成是一个众所周知的例子。我个人在处理 Facade 模式时经常使用分部类(这在创建 WCF/SOAP 服务时非常有用)。在大多数情况下,由于上述原因,我会尽量避免它。


0
投票
public partial class Employee
{
    public void DoWork()
    {
    }
}

public partial class Employee
{
    public void GoToLunch()
    {
    }
}

partial 关键字用于分割类定义。

参考https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods

© www.soinside.com 2019 - 2024. All rights reserved.