分部方法 partial

时间:2023-03-10 05:35:44
分部方法 partial

  当有如下这样类似的情况出现的时候,可以有更好的优化方式来处理,那就是分部方法

     class PartOld
{
string name; public virtual void OnChangeName(string str)
{
} public string Name
{
set
{
//如果该方法没有实现的话,生成的IL 代码也会有调用这样的一个虚方法 callvirt, 造成性能上不必要的损失
OnChangeName(value.ToUpper());
name = value;
}
}
}

  以上的方式生成如下的IL代码,这里会无谓的去调用一个没有实现的方法,没有意义的:

分部方法 partial

优化方式:分部方法

     sealed partial class Part
{
string name; /// <summary>
/// 分部方法
/// </summary>
/// <param name="str"></param>
partial void OnChangeName(string str); public string Name
{
set
{
OnChangeName(value.ToUpper());//如果分部方法没有实现,那么生成的 IL 中不会调用该方法
name = value;
}
}
}
sealed partial class Part
{
/// <summary>
/// 实现分部方法
/// </summary>
/// <param name="str"></param>
partial void OnChangeName(string str)
{
if(string.IsNullOrEmpty(str))
{
throw new ArgumentException(str);
}
}
}

改进后的IL 代码实现如下:

1. 没有实现分部方法的时候:

分部方法 partial

2. 实现了分部方法的时候:

分部方法 partial

  通过这样的方式优化后,更加灵活和性能更佳!

  关于分部方法,需要注意的是:

1. 只能在分部类或者结构中声明

2. 分部方法返回值始终是 void, 参数不能使用 out 修饰符,这是由于改方法的实现是不确定的,所以不允许有变量接收此返回值,同时out 参数也需要在方法内部初始化,但是方法不一定存在

3. 分部方法默认是private,也只能是private,不需要显示声明

......