Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分部类的目的是什么?_C#_.net - Fatal编程技术网

C# 分部类的目的是什么?

C# 分部类的目的是什么?,c#,.net,C#,.net,例如,我阅读并理解在VisualStudio创建Windows窗体时使用它们的原因,但不排除这一点 在处理大型项目时,将类分散到单独的文件上 允许多个程序员同时处理它 后来我读到,我注意到大多数类都声明为分部。为什么?一个实际应用是,您可以在名称空间范围内的多个位置修改分部类。为了可读性,可以将一个类拆分为多个文件 IE: 在HelloWorld.cs中在名称空间“Bleh”中 HelloWorld2.cs中的,命名空间“Bleh”中的 声明的两个类实际上代表相同的东西,但目的是将类拆分为文件

例如,我阅读并理解在VisualStudio创建Windows窗体时使用它们的原因,但不排除这一点

在处理大型项目时,将类分散到单独的文件上 允许多个程序员同时处理它


后来我读到,我注意到大多数类都声明为分部。为什么?

一个实际应用是,您可以在名称空间范围内的多个位置修改分部类。为了可读性,可以将一个类拆分为多个文件

IE:
在HelloWorld.cs中在名称空间“Bleh”中

HelloWorld2.cs中的,命名空间“Bleh”中的

声明的两个类实际上代表相同的东西,但目的是将类拆分为文件。两者结合起来实际上看起来像:

public partial class testClass {
  private int intAnotherInt; // Our int from HelloWorld2.cs
  public string stringAnotherString; // Our string from HelloWorld2.cs
  private int intMember; // Our int from HelloWorld.cs
  public string stringMember; // Our string from HelloWorld.cs
}

更多信息。

当类由工具(如VS)自动生成,并且您希望能够扩展该类的功能,并且在工具需要重新生成其代码时不会丢失代码时,可以使用分部类。例如,当您使用Visual Studio实体数据模型设计器时,实体(类)将作为部分生成。

如果您有一个较大的类,则在多个源文件中拆分定义会很有帮助

此外,如果要扩展由T4模板或ORM生成的类,或者在不能或不应该修改原始源文件的任何情况下,可以使用附加的部分类定义添加新功能,这些功能在模板或ORM重新生成原始类时不会被删除

编辑

只是一个观察,但你的引用:

在处理大型项目时,将类分散到单独的文件上 允许多个程序员同时处理它


虽然来自MSDN,但对我来说不是很好。如果您使用的是一个像样的源代码管理系统(比如TFS甚至svn),那么在源文件中合并(每个开发人员使用的是不同的方法)处理得非常好。说使用分部类使多个开发人员更容易在同一个类上工作可能(我敢打赌,可能是这样)会鼓励人们将解决方案中每个类中的每个方法和属性拆分为单独的源文件。那太糟糕了。真糟糕。如中所述,在与新员工协商工资时,应提前披露

正如您发布的链接所述,这意味着您可以将单个类拆分为多个文件,并在编译时将其重新组合为单个类

至于你发布的另一个链接…部分类是这样标记的,因为标记(aspx)有一个设计器生成的类,它让你可以访问标记中定义的东西,我相信

因此,有三个文件…productlist.aspx、productlist.cs和productlist.designer.cs

productlist.aspx是标记

productlist.cs是从标记文件中引用并包含代码的分部类


productlist.designer.cs是生成的分部类,它与上面的.cs文件相结合

分部类允许代码不仅添加到生成的类中,而且还实现可选功能

例如,可能会生成执行属性验证的代码(通过IDataErrorInfo),但无法在生成时确定每个属性的验证,分部类允许开发人员在以后指定验证

生成的文件:

public partial class MyClass : IDataErrorInfo
{
    partial void ValidateMyProperty(ref string error);

    public string this[string propertyName]
    {
        get
        {
            string error = String.Empty;
            if (propertyName == "MyProperty")
                ValidateMyProperty(ref error);

            return error;
        }
    }

    public string Error { get { return String.Empty; } }

    public int MyProperty { get; set; }
}
开发人员实现的文件:

public partial class MyClass
{
    partial void ValidateMyProperty(ref string error)
    {
        if (MyProperty < 0)
            error = "MyProperty cannot be negative.";
    }
}
公共部分类MyClass
{
部分无效ValidateMyProperty(参考字符串错误)
{
如果(MyProperty<0)
error=“MyProperty不能为负。”;
}
}

正如您在Winforms/WPF中所注意到的,其中一个用途是将机器生成的部分与手工编码的部分分开。沿着这些思路,如果您可以对类的函数进行类似的逻辑分隔,这可能会很有用。您必须询问编写它们的人。如果您只是想知道一般情况,请搜索。至少有五个文件具有五种不同的部分类/接口声明:
ProductBLL
class in ProductBL.cs文件,Product.cs文件中的
Product
类,IProductService.cs文件中的
IProductService
接口,ProductDal.cs文件中的
ProductDal
类,ProductService.cs文件中的
ProductService
类。这些是完全不同的类,彼此无关。我已经在上下文中解释了这个概念。partial是一个非常简单的概念…它只是意味着…单个类可以扩展到多个文件。就这样。没有什么比这更需要理解的了。
public partial class MyClass : IDataErrorInfo
{
    partial void ValidateMyProperty(ref string error);

    public string this[string propertyName]
    {
        get
        {
            string error = String.Empty;
            if (propertyName == "MyProperty")
                ValidateMyProperty(ref error);

            return error;
        }
    }

    public string Error { get { return String.Empty; } }

    public int MyProperty { get; set; }
}
public partial class MyClass
{
    partial void ValidateMyProperty(ref string error)
    {
        if (MyProperty < 0)
            error = "MyProperty cannot be negative.";
    }
}