分部方法 partial

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

 1     class PartOld
 2     {
 3         string name;
 4 
 5         public virtual void OnChangeName(string str)
 6         {
 7         }
 8 
 9         public string Name
10         {
11             set
12             {
13                 //如果该方法没有实现的话,生成的IL 代码也会有调用这样的一个虚方法  callvirt, 造成性能上不必要的损失
14                 OnChangeName(value.ToUpper());
15                 name = value;
16             }
17         }
18     }

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

 

优化方式:分部方法

 1     sealed partial class Part
 2     {
 3         string name;
 4 
 5         /// <summary>
 6         /// 分部方法
 7         /// </summary>
 8         /// <param name="str"></param>
 9         partial void OnChangeName(string str);
10 
11         public string Name
12         {
13             set
14             {
15                 OnChangeName(value.ToUpper());//如果分部方法没有实现,那么生成的 IL 中不会调用该方法
16                 name = value;
17             }
18         }
19     }
20     sealed partial class Part
21     {
22         /// <summary>
23         /// 实现分部方法
24         /// </summary>
25         /// <param name="str"></param>
26         partial void OnChangeName(string str)
27         {
28             if(string.IsNullOrEmpty(str))
29             {
30                 throw new ArgumentException(str);
31             }
32         }
33     }

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

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

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

 

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

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

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

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

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

......

 

转载于:https://www.cnblogs.com/yougmi/p/5689183.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值