我很难理解部分方法的用法。
你能提供一个与linq或那种数据库事物无关的例子吗?
部分方法是否与我们在winforms中进行编码并在其后面进行编码相同,如果我们使用它编译的方法,但如果我们不这样做,那么编译器会删除它是正确的吗?
答案 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后续问题之外,
我从来没有自己创建过它们,但是我想到的很少是小用途了:
我还将指出差异,这可能是您尝试使用部分方法实现的另一种选择。
另一种用途是为某人提供基本功能。您可以按照我所谓的“自下而上”的方式进行操作,这意味着您将某物摇摇晃晃,人们将其作为基础,在其之上构建,并像工具一样使用它。或者,您可以“自上而下”提供它。意思是,您已经实现了组件协同工作的方式,但是其他人可能会定义这些组件在内部进行的确切操作,例如我想建立一个桌子,我已经实现了它有四个腿的盘子,但是我让用户选择腿有什么形状。这通常与生成的代码一起使用,以将生成的和semf编写的代码写在一个类中,但写在不同的.cs文件中。
注意
所有这些,这些可能不是实现这些目标的最佳方法。有多种方法可以完成那些不需要局部方法的事情,并且可能更适合您想做的事情。但是也许这些使您对如何使用部分方法有了一个想法。 这实际上取决于您需要执行的操作,但是了解将来的部分类工作可能会很有用。