.NET框架-Try-Parse和Tester-Doer

标签: C#-net Parse TryParse Tester Doer
1222人阅读 评论(0) 收藏 举报
分类:

作者:vuefine
文献: msdn library
平台:.NET 2.0+


Parse和TryParse

  DateTime中Parse(string s)和TryParse(string s, out datetime)都是用来将字符型的日期时间转化为等效的System.DateTime。那么,他们之间有没有区别呢,除了函数的参数不同外。先看下代码:

            string dateTimeStr = "";
            DateTime dt = DateTime.Parse(dateTimeStr);           

  运行空字符串,将其转化为日期时间型,显然不能转化,并且Parse()会抛出一个异常: System.FormatException: s 中不包含日期和时间的有效字符串表示形式。但是,运行TryParse这个转化方法:

            string dateTimeStr = "";       
            DateTime dt2; //dt2未经初始化,就被传递给函数TryParse()
            bool sucflag = DateTime.TryParse(dateTimeStr, out dt2);

  转化首先是不抛出异常的,dt2被赋值为日期时间的最小值,sucflag为false。看下对函数的注释:

当此方法返回时,如果转换成功,则包含与 s 中包含的日期和时间等效的 System.DateTime 值;如果转换失败,则为 System.DateTime.MinValue。如果s 参数为 null,是空字符串 (“”) 或者不包含日期和时间的有效字符串表示形式,则转换失败。*该参数未经初始化即被传递。这个函数是不会抛出任何异常的。

Try-Parse

  看到他们的不同后,进一步来讲,parse()抛出异常必然影响性能,TryParse()未抛出任何异常,这是一种优化异常性能的设计模式,称为Try-Parse Pattern。以下是微软的官方解释:

For extremely performance-sensitive APIs, an even faster pattern than the Tester-Doer Pattern described in the previous section should be used. The pattern calls for adjusting the member name to make a well-defined test case a part of the member semantics. For example, DateTime defines a Parse method that throws an exception if parsing of a string fails. It also defines a corresponding TryParse method that attempts to parse, but returns false if parsing is unsuccessful and returns the result of a successful parsing using an out parameter.

Tester-Doer

  在解释Try-Parse模式时,微软提出了另外一种模式:Tester-Doer模式,什么是Tester-Doer模式呢? 函数中写入异常,会降低性能,微软给出了这种模式来减小异常带来的副作用。
 
  如下代码:

ICollection<int> numbers = 省略获取数据的逻辑
numbers.Add(1);//Add此处不做可写性检查

  以上缺陷:假如集合是只读的,方法Add会抛出异常。调用这个方法的地方会经常抛出异常,因此会影响系统的性能。为了避免这个设计缺陷,微软提出: Sometimes performance of an exception-throwing member can be improved by breaking the member into two.

  将Add()分解为:

ICollection<int> numbers = 省略获取数据的逻辑
if(!numbers.IsReadOnly) //Tester
{
    numbers.Add(1); //Doer
}

  Tester-Doer模式 总结:

The member used to test a condition, which in our example is the property IsReadOnly, is referred to as the tester. The member used to perform a potentially throwing operation, the Add method in our example, is referred to as the doer.

   分解后,先做只读性检测,这样会减少Add抛出只读性异常的次数,提升性能。

总结
  Try-Parse Pattern和Tester-Doer模式是两种替代抛异常的优化方式,起到优化设计性能的作用。

查看评论

.NET框架-Try-Parse和Tester-Doer

您知道.net框架中为什么提供Parse()和TryParse()这两个转化吗? Try-Parse模式是什么模式? Tester-Doer模式是什么?用在何处呢?...
  • daigualu
  • daigualu
  • 2017-01-13 08:56:18
  • 1222

.NET框架- 异常设计原则

前沿异常设计准则,参考微软msdn,结合自己的理解和过去的开发中对异常错误的处理,总结下软件开发架构,如何更好地设计一套异常错误准则。...
  • daigualu
  • daigualu
  • 2017-01-12 17:24:26
  • 523

建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内 如果需要在循环中引发异常,你需要特别注意,应为抛出异常是一个相当影响性能的过程。应该尽量在循环当中对异常发生的一

建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内  如果需要在循环中引发异常,你需要特别注意,应为抛出异常是一个相当影响性能的过程。应该尽量在循环当中对异常发生...
  • houwc
  • houwc
  • 2016-09-07 10:46:35
  • 426

.NET Framework有哪些版本?

  • 2013年04月15日 15:48
  • 996B
  • 下载

关于项目中异常处理的一些总结(转)

这两天新的项目设计工作快完毕了,我要出一份新项目中的异常书写规则.在msdn上查找了些资料,发现里面很多都是程序员常犯的错误.总结出来,希望对大家有所提高. 异常引发准则: 不要返回错误代...
  • liuluyan
  • liuluyan
  • 2014-05-12 15:28:27
  • 552

.NET设计规范(六) 异常

第6章       异常    设计异常的唯一目的是报告错误。6.1.   抛出异常   û不要返回错误码。    ü要通过抛出异常的方式来报告操作失败。    ü考虑通过调用System.Envir...
  • richnaly
  • richnaly
  • 2011-04-27 21:24:00
  • 638

net框架程序设计

  • 2011年09月19日 12:15
  • 20.21MB
  • 下载

.Net CAB 框架

  • 2010年09月07日 11:37
  • 879KB
  • 下载

.NET框架- in ,out, ref , paras的使用总结

C#.net 提供的4个关键字,in,out,ref,paras开发中会经常用到,那么它们3个如何使用呢,又有什么区别?...
  • daigualu
  • daigualu
  • 2017-02-04 09:42:44
  • 757

理解.NET中的异常(二)

 上一篇中讨论了异常的优点、异常的本质、异常的机制这里将讨论FCL中预定义的异常类,自定义异常类,正确的使用异常(抛出、捕获、封装),最后给出性能方面的建议。4、System. Exception及其...
  • wang102010
  • wang102010
  • 2007-05-05 15:43:00
  • 450
    算法channel

    交流思想,注重分析,实例阐述,通俗易懂,包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来!

    算法与人工智能交流群:646901659

    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 33万+
    积分: 7782
    排名: 3390
    博客专栏