C#解释中的部分方法

时间:2016-04-11 20:05:20

标签: c#

我很难理解部分方法的用法。

你能提供一个与linq或那种数据库事物无关的例子吗?

部分方法是否与我们在winforms中进行编码并在其后面进行编码相同,如果我们使用它编译的方法,但如果我们不这样做,那么编译器会删除它是正确的吗?

4 个答案:

答案 0 :(得分:18)

当您有一个部分类时,您可以在一个文件中定义方法的签名,并在另一个文件中实现该实现。这是一种局部方法。

所以在一个文件中你有:

partial class Foo
{
    partial void Bar();  // no implementation

    public void DoSomething()
    {
        // do some stuff...
        Bar();    // this will be removed if Bar isn't implemented in another partial class
        // do something else...
    }
}

而在另一个你有

partial class Foo
{
    partial void Bar()
    {
        // do something...
    }
}

这使得第一个文件可以调用Bar而无需担心Bar是否已实现。如果Bar未在某处实施,则会删除对其的调用(来自here):

  

部分方法使类的一部分的实现者能够定义类似于事件的方法。类的其他部分的实现者可以决定是否实现该方法。如果未实现该方法,则编译器将删除方法签名以及对该方法的所有调用。对方法的调用(包括在调用中对参数求值时发生的任何结果)在运行时无效。因此,即使未提供实现,分部类中的任何代码也可以自由地使用部分方法。如果调用该方法但未实现该方法,则不会产生编译时或运行时错误。

与部分类一样,主要用途是使用生成的代码:

  

部分方法作为自定义生成代码的方法特别有用。它们允许保留方法名称和签名,以便生成的代码可以调用该方法,但开发人员可以决定是否实现该方法。与部分类非常相似,部分方法使代码生成器创建的代码和人类开发人员创建的代码能够在没有运行时成本的情况下协同工作。

因此,您可能生成了调用部分方法的代码(在生成的代码中没有实现定义),并且您可以自由扩展该分部类并在需要时实现该部分方法。

答案 1 :(得分:3)

这是我在自己的编程中使用的一个示例...作为一名老师,我经常向同学们提供代码示例。但是,我希望他们一次实现一个编码项目,随着时间的流逝,它变得越来越复杂。更具体地说,假设我为他们提供了运行菜单来测试和驱动他们需要实现的类的代码。在步骤1,菜单很简单。然后,在每个新步骤中,都会添加更多菜单项来测试越来越多的类功能。因此,最初,我为他们提供一个简单的菜单文件,然后随着他们向一个完整的解决方案发展,我为他们提供了更多文件来驱动和检查他们的新编程。可以这样进行:

// --- File MenuStep1.cs ---
partial class Menu
{
    // This array is populated with more and more items at every new steps
    readonly List<MenuItem> MenuItems = new List<MenuItem>();

    public void Show()
    {
        // Code to show menu here
    }

    // Suppose we have a Main here, but that's not necessary
    public static void Main()
    {
        new Menu().Show();   
    }

    // These are hooking methods to add menu items later
    partial void InitStep2();
    partial void InitStep3();
    partial void InitStep4();

    public Menu()
    {
        InitStep1();
        InitStep2();
        InitStep3();
        InitStep4();
    }

    void InitStep1()
    {
        // Code that adds menu items, but only for step 1
    }
}

请注意,由于尚未定义部分方法InitStep2、3和4,因此将不会调用它们(甚至不会将其编译进去)。后来,我为他们提供了自动扩展菜单的文件,如下所示:

// --- File MenuStep2.cs ---
partial class Menu
{
    partial void InitStep2()
    {
        // Code that adds more menu items
    }
}

// --- File MenuStep3.cs ---
partial class Menu
{
    partial void InitStep3()
    {
        // Code that adds more menu items
    }
}

等等。

答案 2 :(得分:1)

在这里您可以找到有关部分方法Part 63 Partial methods in c#

的非常简单且完整的教程

答案 3 :(得分:-1)

除了该答案的注释中的Matt Burlands个答案Johnsons后续问题之外,

我从来没有自己创建过它们,但是我想到的很少是小用途了:

  • 使用局部方法创建类似于抽象类或接口的东西。基本上,以这种方式拥有“可选方法”将是可能的,这使得它能够删除方法实现,而不必删除它们各自的调用并最终重新实现它。
  • 使用局部方法能够在同一基础上构建具有不同实现的多个项目。您可能有一个构建过程,可以让您在不同的实现中进行选择,这些实现体现在不同的部分类中。 “基类”将具有方法签名,并且不同的“实现量”,“ implementA.cs”和“ implementB.cs”将具有不同的实现。这样,您可以例如创建Develop-Test-和Release实施或User1- User2和User3实施。酷的事情是,您不必在运行时取消这些内容。取而代之的是,您可以分发已指定该程度的“干净”版本。

我还将指出差异,这可能是您尝试使用部分方法实现的另一种选择。

  • 事件-可以像事件一样使用部分方法。如果未实现,则将忽略它们(即使在编译结果中也不存在)。但是事件有所不同。虽然可以为一个事件提供多重处理程序,但只能实现部分方法ONCE!
  • 抽象类和接口-局部类/方法可以像抽象类一样使用,而无需实现方法并将其留空。如果您知道在给定的抽象类中经常会发生这种情况(首先先检查您的体系结构,这可能是有缺陷的),则可以改用部分方法

另一种用途是为某人提供基本功能。您可以按照我所谓的“自下而上”的方式进行操作,这意味着您将某物摇摇晃晃,人们将其作为基础,在其之上构建,并像工具一样使用它。或者,您可以“自上而下”提供它。意思是,您已经实现了组件协同工作的方式,但是其他人可能会定义这些组件在内部进行的确切操作,例如我想建立一个桌子,我已经实现了它有四个腿的盘子,但是我让用户选择腿有什么形状。这通常与生成的代码一起使用,以将生成的和semf编写的代码写在一个类中,但写在不同的.cs文件中。

注意

所有这些,这些可能不是实现这些目标的最佳方法。有多种方法可以完成那些不需要局部方法的事情,并且可能更适合您想做的事情。但是也许这些使您对如何使用部分方法有了一个想法。 这实际上取决于您需要执行的操作,但是了解将来的部分类工作可能会很有用。