【More Effective C#】Partial Class是怎樣煉成的?

(R,线性回归)R语言里的模型诊断图(Residuals vs Fitted,Normal QQ , Scale-Location ,Residuals Leverage) 线性回归,是概率统计学里最重要的统计方法,也是机器学习中一类非常重要的算法。线性模型简单理解非常容易,但是内涵是非常深奥的。尤其是线性回归模型中的Diagnostics plot的阅读与理解一直被认为是线性回归中的一个难点。 在任何线性模型中,能够直接“lm”(模型有意义),既要考虑各个参数的t-test所得出的p-value,也要考虑总体模型F-检验得出的p-value。在这之后,还要清楚一个... 阅读详情

什么是部分类(Partial Class)?

C#中.我们可以利用部分类,将一个类分散到多个类文件中,这样我们就可以多个开发者同时开发某个类库,或者是扩展其他开发者发布的类库.甚至是代码生成器生成的代码,例如LINQ2SQL,ADO.NET EF等,以获取更高效的开发.

Re:Class和Class File的区别.这里的类是我们平时所说的普通类-Class,如抽象类,基类,子类等等.而类文件-Class File则是我们平时编写类时所用到的文件,如C#的.cs,VB的.vb.

虽然部分类很好的解决了多个开发者同时开发而互不影响的问题,但其约束十分严格.开发者之间不能/很难彼此沟通,并且无法/很难修改对方的代码.这意味着需要为对方提供很多挂钩.这些挂钩应该以部分方法的方式实现.而另一方的开发者可以选择实现或不实现.

扩展现有类

实体框架的出现,大大的减轻了我们的工作量,使我们把更多的重心放在逻辑实现上,而减少对于数据访问的关注.例如我们可以使用LINQ2SQL,LINQ2SQL是一个轻型的实体框架.它生成了我们对数据层的访问.但.有些时候,我们需要扩展些自己的内容,如方法/属性等等.除了直接在生成的类文件中添加修改意外,我们还可以利用部分类扩展我们所需的功能,前者当每次我们跟新实体时.你所扩展的内容都会消失.而部分类依然能很好的为你服务.

提供部分方法

为部分类提供最有效的钩子就是部分方法.它和接口的方法声明很相似.

关键字partial+void+方法名+方法参数.

partial void ReportValueChanging(RequestChange args);

由于部分方法可能成为类的一部分(实现),也可能不成为类的一部分(不实现),所以C#本身对于部分方法给出了一些限制.

1.返回类型必须为void.

2.部分方法不能为抽象/虚方法.

3.部分方法不能用来实现接口.

4.参数列表不能包含任何out参数,因为编译器无法初始化这些out参数.

我们利用部分方法来让用户件事或修改类的行为:修改方法,事件处理程序及构造函数.

修改方法

修改方法是指那些将要修改类中对外可见的状态的方法.我们可以将其理解为任何状态的变化,由于另一个类文件的部分类实现依然是类的一部分.所以我们可以完全控制到该类的所有内部状态.

一般而言,修改方法应该为类提供两个部分方法.第一个在修改前调用,用来让另一方(另一开发者)能够进行合法性验证等等.第二个方法应该在修改状态后调用,用来让另一方相应这个状态的变化.

public partial class GeneratedStuff
    {
        private struct ReportChange
        {
            public readonly int OldValue;
            public readonly int NewValue;

            public ReportChange(int oldValue, int newValue)
            {
                this.OldValue = oldValue;
                this.NewValue = newValue;
            }
        }

        private class RequestChange
        {
            public ReportChange Values
            {
                get;
                set;
            }
            public bool Cancel
            {
                get;
                set;
            }
        }

        partial void ReportValueChanging(RequestChange args);
        partial void ReportValueChanged(ReportChange values);

        private int storage = 0;

        public void UpdateValue(int newValue)
        {
            RequestChange updateArgs = new RequestChange
            {
                Values = new ReportChange(storage, newValue)
            };
            ReportValueChanging(updateArgs);
            if (!updateArgs.Cancel)
            {
                storage = newValue;
                ReportValueChanged(new ReportChange(storage, newValue));
            }
        }
    }

如果另一个部分类没有提供两个部分方法的实现,那么C#编译器将移除该调用.生成方法如下

public void UpdateValue(int newValue)
        {
            RequestChange updateArgs = new RequestChange 
            {
                Values = new ReportChange(this.storage, newValue)
            };
            if (!updateArgs.Cancel)
            {
                this.storage = newValue;
            }
        }

并且,两个部分方法也一并移除了.

我们可以实现挂钩如下

public partial class GeneratedStuff
        {
            partial void ReportValueChanging(GeneratedStuff.RequestChange args)
            {
                if (args.Values.NewValue < 0)
                {
                    //dosomething...
                }
                else
                {
                    //dosomething...
                }
            }

            partial void ReportValueChanged(GeneratedStuff.ReportChange values)
            {
                //dosomething...
            }
        }

这里,我们通过一个取消标记来让开发者可以取消某个修改动作,你也可以通过抛出异常得到同样的效果.但.推荐使用布尔型的取消标记,因为这样更加轻量一些

事件处理程序

实际上,事件的处理程序和上面的方法修改并无多大的区别.你所需要做的.仅仅只是添加一个委托事件而已.实现了类似控件的事件机制.

构造函数扩展

无论是生成的代码,还是我们手工编写的代码.我们都无法预计调用类时外部将会调用哪个构造函数.所以.我们只能在内部做一些手脚.例如

public partial class GeneratedStuff
        {
            partial void Initialize();
            public GeneratedStuff()
                : this(0)
            { }

            public GeneratedStuff(int someValue)
            {
                this.storage = someValue;
                Initialize();
            }
        }

注意!Initialize在最后调用,这样就有了一次检查当前对象状态的机会,可以进行必要的修改,或是对于不符合要求时抛出异常等等.实际上.这种构造函数重载也有效的提升你的代码质量(对于不同的构造函数,结果IL都会生成不同的函数块.而这种重构法最后其实真正生成的函数块只有一个)

尾声

经过以上的阐述,相信我们已经更了解部分类是怎样炼成的了.只有更好的了解其背后的一系列"小动作",才有助于我们更好的提升,写出更有质量的代码


转自:http://www.dotblogs.com.tw/kongyiyun/archive/2010/10/28/18633.aspx

飞牛NAS新增虚拟机功能,如果使用虚拟机网卡直通安装ikuai软路由(如何解决OVS网桥绑定失败以及打开ovs后无法访问飞牛nas等问题) 飞牛NAS新增虚拟机功能,如果使用虚拟机网卡直通安装ikuai软路由 阅读详情

相关推荐

论文解析-sciPENN

用这2个CITE-seq共有的protein作为训练集,分别将他们特有的protein作为测试集,评估sciPENN对CITE-seq数据集中缺失的protein丰度预测准确度。来自Seurat 4 的PBMC数据集,样本被注射水疱性口炎病毒 (VSV) 载体 HIV 疫苗,数据集包含每个样本注射疫苗0天、3天、7天的CITE-seq数据。PBMCs作为训练集,MALT作为测试集,利用scRNA-seq测试17个蛋白质表达水平。Monocyte:随机取4个样本作为训练集,剩余4个样本作为测试集。

weixin_46065198的博客 1022

C#中的partial class(部分类)

C# 2.0 以上的版本可以将类、结构或接口的定义拆分到两个或多个源文件中,在类声明前添加partial关键字即可。例如:下面的PartialTest类class PartialTest{string Str_FieldTest;int Int_FieldTest;public void DoTest(){Debug.Print("Test");

enginetanmary的专栏 2392

C#实战:如何用HslCommunication快速搞定三菱FX5U PLC通讯(附完整代码)

本文详细介绍了如何利用HslCommunication库在C#环境中快速实现与三菱FX5U PLC的通讯。通过实战代码演示,从环境搭建、建立连接、核心数据读写到构建健壮的监控服务,系统讲解了如何高效完成数据采集与交互,大幅提升工业自动化项目的开发效率。

s4t5u6v的博客 1202

分部类(partial class)和分部方法

分部类类的声明可以分割成几个分部类的声明。●每个分部类的声明都含有一些类成员的声明。●类的分部类声明可以在同一文件中也可以在不同文件中。●每个局部声明必须被标为partial class,而不是单独的关键字class,分部类声明看起来和普通类声明相同,除了那个附加类型修饰符partial。分部方法分部方法是声明在分部类中不同部分的方法。分部方法的不同部分可以声明在不同分部类中,也可以声明在同一个类...

LUOCHENLONG的专栏 5817

uniapp开发AndroidAPP集成支付宝支付及问题处理(商家订单参数异常等),集成微信小程序支付及问题处理(运行真机调试白屏)

2、选择支付宝支付,调用支付接口唤起支付宝支付。

qq_16785561的博客 3486

维纳(Wiener)复原滤波器的三种推导形式及其在图像处理中的应用

本文深入解析了维纳(Wiener)复原滤波器的三种核心推导形式:卷积形式、矩阵向量形式和频域形式,并重点阐述了其基于线性最小均方误差(LMMSE)估计的核心思想。通过Python实战演示,展示了频域形式如何高效地在图像去模糊与噪声抑制之间取得平衡,是图像复原领域的经典且实用的工具。

net55的博客 577

C# 面试问题大全:009.什么是部分类(Partial Class)?

部分类(partial class):允许将一个类的定义拆分到多个文件中,适用于大型项目、自动生成代码以及团队协作。特点必须使用partial关键字。同一命名空间内的相同类名。成员自动合并为一个完整的类。应用场景自动生成的代码(如设计器生成的代码)与手动编写的代码分离。大型类的模块化管理,便于团队协作和代码维护。部分方法允许在类的一个部分中声明方法,在另一个部分中实现该方法。

caifox的博客 1152

Opencv相机校准之棋盘格标定

Reference: https://yq.aliyun.com/articles/62472

y459541195的博客 3万+

浅谈partial class的理解

.net 2.0中,有了个partial这样的关键字,最初接触它是在asp.net2.0中的codeFile中见到的。 总给人一种不爽的感觉,默认生成那样的代码。所以项目中一直并不用它,包括我接触的人当中,也鲜有人关注过它,个人觉得还是失败的,这样的一个功能点。 partial,部分之义,partial class,顾名思义为 部分类,msdn上称之为 分布类,是更贴切一些的,意思即...

diaosoudi0255的博客 527

【Qt】Qt6系列教程汇总_qt6教程

简介:QT相关电子书、建议和相关参考网址。

2401_87556657的博客 1185

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

10.28华为OD机试真题 新系统 - 社交网络消息转发 (Java/Py/C/C++/Js/Go)

算法大师! 421

C# 分部类和方法 (partial)

可以将类、结构、接口和方法的定义拆分到多个源文件中。每个源文件包含类型或方法的部分定义,在编译时,这些部分会被组合起来。   1.Partial Classes 在以下几种情况需要拆分类定义: 对于大型项目,将一个类分部为多个独立文件可以让多个程序员同时对该类进行处理。 使用自定生成的源文件时,不用修改文件就可以将代码添加到类中。Visual Studio 在创建 Window

无聊的豆奶 6410

使用AI预测彩票的架构思路

彩票是随机的数字游戏,不要过度依赖AI,本文仅供娱乐研究

淘淘小窝 9408

【More Effective C#】Partial Class是怎样炼成的?

什么是部分类(Partial Class)? C#中.我们可以利用部分类,将一个类分散到多个类文件中,这样我们就可以多个开发者同时开发某个类库,或者是扩展其他开发者发布的类库.甚至是代码生成器生成的代码,例如LINQ2SQL,ADO.NET EF等,以获取更高效的开发. Re:Class和Class File的区别.这里的类是我们平时所说的普通类-Class,如抽象类,基类,子类等等.而...

weixin_30487701的博客 142

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

1.3.8 局部类(partial class)

partial class 可以用于class ,struct,方法,interface,而且这些类、结构等等不局限于一个文件中。 假如您想对由工具生成的类,而不是自己写的类进行添加内容,但是又不能重新运行该工具产生类,因为会把之前改的丢失掉,那么这时候您只需要将类改为partial class。再使用代码生成工具添加该类的内容就可以了。 如果一下两个局部类,在编译的时候就会把两个方法放到同一个...

黄海几吹夏 1510

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

partial classes(局部类型)

partial classes的定义      c#2.0引入了局部类型的概念。局部类型允许我们将一个类、接口或结构分成好几个部分,分别实现在几个不同的.cs文件中。 局部类型适用于以下情况:   (1)类型特别大,不宜放在一个文件中实现。   (2)一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。   (3)需要多人合作编写一个类。

newforestsky的专栏 556

C#13、什么是部分类

不常用。在 C# 中,是指一个类的定义可以,编译时 C# 编译器会自动将它们合并成一个完整的类。这是通过partial关键字实现的,主要用于等场景。

m0_52276169的博客 592

c# partial 分部类和分部方法

一、partial  它是一个关键字修饰符。可以将类或结构、接口或方法的定义拆分到两个或更多个源文件中。 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。修饰符不可用于委托或枚举声明中。   二、分部类 在以下几种情况下需要拆分类定义: 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。 使用自动生成的源时,无需重新创建源文件...

勤学 1166

partial class:扩展功能新思路

开闭原则:“对修改封闭,对扩展开放”。在面向对象的系统中,通过类的继承实现扩展。.net中提供的partial class提供了扩展类的新思路。一、应用场景可以使用partial class的场景很多。这里分析一个ORM的例子。系统中有一个Cat类,属性ID、Age、Weight都需要存储到数据库中,一个信息系统中常见的需求。通过读取数据库的结构,可以用工具生成Cat类的代码。并且ORM框架支持了

软件开发资料汇总 465

C# 中partial 关键字详解

我们新建一个Windows Form时,后台代码都会自动添加如下代码: 1 public partial class Form1 : Form 2 { 3     public Form1() 4      { 5          InitializeComponent(); 6      } 7 }     为什么新建立的Winows Form的类定义成了一个部分类。我

zhanghui962623727的博客 1564

[C#] 部分类 (Partial Classes)

一般C#是一个类一个.cs 文件,但有时会将一个类拆成两个不同名的.cs 文件,然后编译器会将这两个半个类合并成一个完整的类,使用partial关键字, 想到使用这个方法的原因之一是,如果一个类太大,可以使用这个方法将类的实现进行拆分,一个文件完成一部分,避免某个文件太长太长。 // partial1.cs: namespace CodeSamples { public partial ...

学习笔记 5422

C#中分部类和分部方法(partial)

分部类(Partial Class) 允许你将一个类的定义拆分到多个不同的 .cs 文件中。编译器在编译时会自动将这些碎片“缝合”成一个完整的类型

龟速船长 662

C# 基础系列--类一(partial 部分类和部分方法)

  类,开始学面向对象的时候,我们就开始学这个。按道理来说,应该没有什么好的。其实这里面还是有很多可以挖掘的知识点。这篇重点阐述部分类partial。   部分类的关键字partial ,它只能声明在class struct,interface之前。先来个简单的例子:新建类库:AssemblyLibrary并建PulClass类文件 public partial c...

weixin_30457551的博客 857

C#学习—分部类(Partial)

分部类: ①使用关键字Partial修饰,必须放在Class前,且Partial后只能紧跟“Class”、“Struct”、“Interface”、“Void”! ②分部类必须在同一命名空间内! using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Th...

二胖的博客 590
上一篇: 关于Generating user instances in SQL Server is disabled. Use sp_configure 'user instances enabled' to generate user instances的错误
下一篇: The Connection String Reference 挺全面的数据库连接字符串
Csdbfans
博客等级 码龄18年 73粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值