C#解释中的部分方法

Joh*_*son 12 c#

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

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

部分方法是相同的事情,比如当我们处于winforms并在其后面编码时,如果我们使用它被编译的方法但是如果我们不这样,那么它被编译器删除是正确的吗?

Mat*_*and 20

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

所以在一个文件中你有:

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

在另一个你有

partial class Foo
{
    partial void Bar()
    {
        // do something...
    }
}
Run Code Online (Sandbox Code Playgroud)

这允许第一个文件调用Bar而不用担心是否Bar实现.如果Bar没有在某处实现,则删除对它的调用(从这里):

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

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

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

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


Fre*_*ric 5

这是我在自己的编程中使用的一个例子......作为一名老师,我经常向我的同学提供代码示例。然而,我希望他们一步一步地实现他们的编码项目,随着时间的推移,它会变得越来越复杂。更具体地说,假设我为他们提供了代码来运行菜单来测试和驱动他们需要实现的类。在第 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

,

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

等等。