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

原创 2017年01月13日 08:56:18

作者: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模式是两种替代抛异常的优化方式,起到优化设计性能的作用。

版权声明:本文为博主原创文章,欢迎转载,请注明 http://blog.csdn.net/daigualu

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

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

终于掌握了最基本的socket通信在.net框架下用c#语言

哈哈,努力了有10天吧。从开始学C#的语法,再学计算机网络的基本原理,然后去看别人c# socket 编程的例子。理解了,自己能写出了,完全是自己写出的。还是很有感觉的。...
  • CGGUANG
  • CGGUANG
  • 2016年11月21日 00:02
  • 1507

Accord.NET框架功能介绍

机器学习组件Accord.NET框架功能介绍 1.基本功能与介绍 Accord.NET为.NET应用程序提供了统计分析、机器学习、图像处理、计算机视觉相关的算法。 Accor...

.net框架

.net框架         .NET框架(.NET Framework) 是由微软开发,一个致力于敏捷软件开发(Agile software development)、快速应用开发(Rapi...

Microsoft.NET框架概述

2000年,微软公司向全球提供具有革命性的软件和服务平台,这对于消费者,企业和软件开发商来说,预示着个人将获得更大能力和更多商业机会新时代的到来。Microsoft.NET平台利用以互联网为基础的计算...

关于.NET框架的学习

转自:  http://www.cnblogs.com/JimmyZhang/archive/2012/11/27/2790759.html .NET框架 本书是一本讲解.NET技术的书籍...

.NET框架-string是value or reference type?

string是值类型还是引用类型,效率怎么样?

.NET框架

Microsoft.NET不仅使计算机的功能得到大幅度的提升,让计算机的操作变得简单。更重要的是,用户将完全摆脱人为硬件束缚,可以自由冲浪于因特网中,自由访问,自由查看,自由使用自己的数据,不束缚在P...

.NET框架:引用陷阱

属性值相等,对象便默认相等? 多个引用某个对象,有什么坏处? 成员返回引用变量,会有什么坏处?...

RDIFramework.NET框架Web中datagrid与treegrid控件自动生成右键菜单与列标题右键菜单

在实际应用中常可以看到数据展示控件有右键菜单的功能,对应的列标题也可以右键弹出快捷菜单设置指定列的显示与隐藏等功能。在我们的RDIFramework.NET Web框架中,只要是使用了EasyUI的D...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.NET框架-Try-Parse和Tester-Doer
举报原因:
原因补充:

(最多只允许输入30个字)