【问题标题】:What is the purpose of partial classes?部分类的目的是什么?
【发布时间】:2012-02-27 23:05:06
【问题描述】:

我阅读了about partial classes,例如,我了解在 Visual Studio 创建 Windows 窗体时使用它们的原因,但不排除这种情况

在处理大型项目时,将类分散到单独的文件中 使多个程序员可以同时工作

.

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

【问题讨论】:

  • 您在 Winforms/WPF 中注意到的一种用途是将机器生成的部分与手工编码的部分分开的机制。按照这些思路,如果您可以对类的功能进行类似的逻辑分离,它可能会很有用。
  • 你得问问写它们的人。
  • 如果您只是想大致了解,请搜索like this

标签: c# .net


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    例如,可能会生成执行属性验证的代码(通过 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.";
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您有一个大型类,将定义拆分到多个源文件中会很有帮助。

      此外,如果您想扩展生成的类(例如,从 T4 模板或 ORM 生成),或者在您不能或不应该修改原始源文件的任何情况下,您可以使用额外的部分类定义,用于添加新功能,在模板或 ORM 重新生成原始类时不会被删除。

      编辑

      只是一个观察,但你的报价:

      在处理大型项目时,将类分散到单独的文件中 使多个程序员可以同时工作

      尽管来自 MSDN,但对我来说不是很好。如果您使用的是体面的源代码控制系统(例如 TFS 甚至 svn),那么在源文件中合并每个开发人员都在处理不同的方法的处理得很好。说使用部分类使多个开发人员更容易在同一个类上工作可能(而且,我敢打赌,可能已经)鼓励那里的人将解决方案中每个类中的每个方法和属性拆分为单独的源文件。那很糟。特别糟糕。就像在与新员工谈判时,应该提前披露薪水不好。

      【讨论】:

        【解决方案4】:

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

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

        public partial class testClass {
          private int intMember;
          public string stringMember;
        }
        

        在 HelloWorld2.cs 中在命名空间“Bleh”中

        public partial class testClass {
          private int intAnotherInt;
          public string stringAnotherString;
        }
        

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

        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
        }
        

        更多信息here

        【讨论】:

          【解决方案5】:

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

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

          所以,有三个文件...productlist.aspx、productlist.cs 和 productlist.designer.cs

          productlist.aspx 是标记

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

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

          【讨论】:

          • 至少有五个文件具有五个不同的部分类/接口声明:ProductBL.cs 文件中的ProductBLL 类,Product 中的Product 类。 cs 文件,IProductService.cs 文件中的IProductService 接口,ProductDal.cs 文件中的ProductDal 类,ProductService 中的ProductService 类.cs 文件。
          • 这些是完全不同的类,彼此无关。我已经在上下文中解释了这个概念。
          • partial 是一个非常简单的概念......它只是意味着......一个类可以扩展到多个文件。就是这样。没什么好理解的了。
          猜你喜欢
          • 2012-07-09
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 2021-07-29
          • 2018-02-18
          • 2010-10-01
          • 1970-01-01
          相关资源
          最近更新 更多