关闭

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

标签: C#-netParseTryParseTesterDoer
1171人阅读 评论(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模式是两种替代抛异常的优化方式,起到优化设计性能的作用。

1
0
查看评论

各种.NET的关系及.NET框架结构及与C#关系

刚一进入C#的世界,就被各种.NET和.NET框架搞得头晕目眩。 经CSDN高人指点,在此澄清一下(注意.net不区分大小写)   .net: 广义来说.NET泛指使用托管语言(VB.NET C#)和框架类库(WinForms ASP.NET WCF&...
  • wozaixiaoximen
  • wozaixiaoximen
  • 2013-01-09 16:58
  • 1315

深入.NET平台和C#编程_深入.NET框架

深入.NET框架 一.Microsoft.NET框架概述 1.Microsoft.NET介绍 .NET的战略目标是在任何时候(when),任何地方(where),任何使用工具(what)都能通过.NET的服务获得网络上的任何信息, 享受网络带给人们的便捷和快乐。 2..NET框架的魅力 (1).提供...
  • hacker_A
  • hacker_A
  • 2017-12-30 08:53
  • 62

.NET框架基本原理

1.1  将源代码编译为托管模块    在.NET框架里,正如前言里说的“编译器编译面向.NET框架的源代码产生CIL,只有到了运行时,CLR才将CIL翻译为CPU指令”。1、程序员先用任何支持CLR从编程语言来编写代码,然后用相应的语言编译器来做语法检查和源...
  • doong
  • doong
  • 2006-02-16 16:40
  • 1620

J2EE与.NET技术架构的比较

一、J2EE简介 J2EE体系结构图:                          1.组件-容器模型 J2EE是一个基于组件-容器模型的系统平台,其核心概念是容器。容器是指为特定组件提供服务的一个标准化的运行时环境,Java虚拟机就是一个典型的容器。组件是一个可以部署的程序单元,它以某种方...
  • kanglix1an
  • kanglix1an
  • 2014-06-04 19:36
  • 8260

.net和.net框架有什么区别?

<br />转:http://www.cnblogs.com/wantingqiang/articles/1156973.html<br /> <br />1.net是开发平台,.net framework是这个开发平台的基础类库 <br />...
  • jiang891203
  • jiang891203
  • 2011-04-06 22:51
  • 3823

.NET框架及常用语详解

.NET框架 转载自:http://www.tracefact.net/CLR-and-Framework/DotNet-Framework.aspx 三年前写的《.NET之美》的第六章,现在书名改为了《.NET专题解析》。 本书是一本讲解.NET技术的书籍,目标读者群也是在.NET框...
  • zhangyubishoulin
  • zhangyubishoulin
  • 2015-04-13 11:23
  • 1384

浅谈框架以及类库

框架和类库等概念的出现都是源于人们对复用的渴望。“不要重复发明轮子”,成了软件界的一句经典名言。从最初的单个函数源代码的复用,到面向对象中类的复用(通常以类库的形式体现),再到基于组件编程中二进制组件(.NET中是以IL程序集形式存在的)的复用,人们复用软件的抽象层次越来越高。现在,框架复用是抽象层...
  • tianyeming
  • tianyeming
  • 2015-12-16 15:20
  • 1652

.Net AOP 各种IoC框架下实现AOP

.Net AOP(五) 各种IoC框架下实现AOP 首先介绍几种笔者常见的IOC框架 Unity:微软patterns&practicest团队开发的IOC依赖注入框架,支持AOP横切关注点。 MEF(Managed Extensibility Framework):是一个用来扩展...
  • u013123046
  • u013123046
  • 2017-08-07 14:38
  • 258

.net 和 j2ee的区别

.net 和 j2ee的区别关于.NET技术与Sun公司的Java2企业版(J2EETM)相比较,许多客户都想了解Microsoft公司的观点。由于以下的几个原因,.NET和JEE的比较有点棘手:1)   一般来说,Windows .NET Fram...
  • tyouvivi
  • tyouvivi
  • 2007-04-24 09:27
  • 1270

如何让.Net 程序脱离.net framework框架运行

Net 框架目前逐步在普及了,仍然有很多人在寻找如何让.NET程序脱离.NET框架的方法。现成的工具有 Xenocode 的postbuidle或者vas,还有 Salamander .NET Linker。     另外还有 MaxToCode 作者以前做的 fram...
  • demo1573
  • demo1573
  • 2015-09-15 17:00
  • 702
    算法channel

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

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

    个人资料
    • 访问:319420次
    • 积分:7589
    • 等级:
    • 排名:第3380名
    • 原创:350篇
    • 转载:1篇
    • 译文:0篇
    • 评论:58条
    博客专栏