您不能不知的ToString()方法

1.1.1 摘要

     相信大家对ToString()方法再熟悉不过了,由于该方法是.NET程序中最常用的方法之一,我们除了可以直接调用ToString()方法之外,.NET中的某些方法也隐式调用ToString()方法(WPF,Windows Form和Silverlight等)。

1.1.2 正文

      首先让我们了解一下ToString()的由来,它是由Object类提供一个虚的方法,ToString()方法返回一个字符串显示调用该方法对象的类型,Object类中实现如下。

 

      现在我们知道Object类提供的是一个虚的ToString()方法,表明.NET也提供我们重写ToString()方法,接来下让我们定义一个Customer类,然后再使用Console.WriteLine()方法隐式调用Customer类的ToString()方法输出,注意我们现在还没有重写ToString方法,所以我们调用的是Object类的ToString()方法。

 


图1输出类型字符串

重新ToString()方法

    

     通过上图我们可以很明确的说明了在没有重新ToString()方法时,我们调用的是父类Object的ToString()方法。不但它的输出不怎么make sence,而且它并没有输出我们需要的值,那么接下来让我们重写ToString()方法。

 

 

 

    上面我们重写了ToString()方法返回Name,Revenuehe和Tel属性,接着我们使用WriteLine()方法隐式调用ToString()方法(.NET提供显式和隐式调用ToString()的方法,如:Console.WriteLine、String.Format和.NET控件等)。

    虽然简单的ToString()方法很多时候已经可以满足我们的需求,但有时候我们还需要功能更强的方法来格式化输出字符串。(如:电话号码,日期和邮编等格式)

    要实现上述格式,我们可以通过实现IFormattable 接口来解决这个问题。 IFormattable 接口包含了一个重载的ToString()方法,它允许我们为类型指定某种格式信息。当我们需要为类型创建不同形式的字符串输出时,实现这个接口就显得很有用了。

  1. 实现IFormattable接口

     

        现在我们修改一下我们的Customer类,让它实现IFormattable接口,然后重写ToString()方法,实现如下:

     



tostring3

图2 IFormattable的实现

使我们设计符合OCP

    现在我们的Customer类实现了IFormattable接口,然后重写了ToString()方法,接着提供三种格式化类型输出,OK现在我们的输出字符串有更好的自定义格式了,但用户需求的格式是在不断的变化,我们无法估计和预知用户需求的输出格式,难道每当遇到不符合用户要求的格式我们都要在switch中添加吗?我们的确可以这样做,这种做法看上去是直截了当,但这不符合设计模式的OCP原则。幸运的是.NET提供了符合OCP原则的实现方法,通过实现IFormattable接口使得实现该接口的类对StringFomat()修改关闭,当实现ICustomFormatter接口的类对StringFomat()扩展开放。

“Software entities (classes, modules, functions, etc.) should be open for extension, 

but closed for modification [Martin, p.99]”

    现在我们添加自定义类CustomFormatProvider,通过它可以扩展Customer的输出字符串的格式类型,而且避免了对Customer类的修改遵守了OCP,然后再实现接口IFormatProvider和ICustomFormatter,在Format()方法中实现字符串输出格式。

 

图4自定义字符串格式

 

图5自定义格式实现框架

    上面的GetFormat()方法创建一个实现ICustomFormatter接口的对象,而且通过重写Format()方法来自定义输出字符串格式,通过传递不同format参数以便指定不同格式选项。

1.1.3 总结

     不管一个类是否实现了IFormattable接口,我们都可以为其创建 IFormatProvider 和 ICustomFormatter 的实现类。因此即使一个类的原来没有提供合理的ToString()行为,我们仍然可以为其提供格式化支持。当然,作为一个类的外部访问者,我们只能通过访问其中的公有属性和数据成员来构造字符串。虽然编写格式提供者类(分别实现IFormatProvider 和 ICustomFormatter)需要很多工作,且其目的仅仅是为了得到一个字符串。但是,一旦使用了这种方式来实现我们自己定义的字符串输出,它们将在.NET 框架的各个地方得到支持。

    现在,再让我们回到类这一角色上来。重写 Object.ToString()是为类提供字符串表示的最简单方式。每当我们创建一个类型时,都要提供该方法。它应该是我们的类型最明显、最常用的一种表示。而且只有在一些比较少的情况下,当我们期望为类型提供更复杂的输出格式时,才应该实现IFormattable 接口。它为“类型的用户定制类型的字符 串输出”提供了一种标准的方式。如果我们没有做这些工作,用户就要自己来实现自定义格式化器。那样的做法需要更多的代码,因为用户处于类外,无法访问对象 的内部状态。

转载于:https://www.cnblogs.com/rush/archive/2011/05/22/ToString_NET.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信转账一次显示两个_微信为啥分红包和转账两大功能?这4个区别你要知道,望相互转告...

众所周知,自从移动支付普及之后,支付宝、微信就已经成为人们手机中必备的APP,其中微信更是具备社交、支付等一系列功能,所以在国内吸引了超十一亿用户的使用!当我们节假日、过年时,很多用户都喜欢给亲朋好友…

java 正则提取及替换字符串

2019独角兽企业重金招聘Python工程师标准>>> <% page import"java.util.regex.Pattern" %><% page import"java.util.regex.Matcher" %><% page import"java.util.List" %><% page import"java.util.Array…

使用R语言绘制中国地图

R语言环境 R3.1.1 Windows8.1 需要安装的packages: maptools,gp 绘图所需要的数据 中国地图的GIS数据 &#xff08;可以此下面的网址下载) http://cos.name/wp-content/uploads/2009/07/chinaprovinceborderdata_tar_gz.zip 是一个压缩包&#xff0c;完全解压后包含三个文件&am…

ASP.NET MVC 5 学习教程:控制器传递数据给视图

起飞网 ASP.NET MVC 5 学习教程目录&#xff1a; 添加控制器添加视图修改视图和布局页控制器传递数据给视图添加模型创建连接字符串通过控制器访问模型的数据生成的代码详解使用 SQL Server LocalDBEdit方法和Edit视图详解添加查询Entity Framework 数据迁移之添加字段添加验证…

如何将ListT转换相应的Html(xsl动态转换)(二)

一、前言 紧跟着上一篇随笔&#xff0c;本文主要涉及到如何将xml与xsl动态转换成html&#xff0c;这个才是最关键的地方&#xff0c;所有的内容都是围绕这个主题来进行开展的。根据指定的xsl样式将List<T>转换相应的Html&#xff0c;相关的随笔如下&#xff1a; &#xf…

win10大文件无法移动到U盘

想着把自己的一些文件整理整理&#xff0c;发现稍微大点的文件竟然不能copy到U盘&#xff0c;百度了一番&#xff08;不好意思&#xff0c;最近百度犯错查的正狠^_^&#xff09;,发现因为U盘的格式不是NTFS,只要把U盘格式改为NTFS就可以copy大文件了。 方法一&#xff1a;用命令…

为多孔介质的当量直径_新型纳米多孔碳材料在催化剂载体方面的应用

成分&#xff1a;基本成分为碳91-95%&#xff0c;氧4-8%&#xff0c;氢1%&#xff0c;具有良好的导电性&#xff08;2-10 S/cm&#xff09;和优良的化学稳定性。 结构&#xff1a;内部是三维贯通的纳米孔道结构&#xff0c;每个孔与周围12个孔相连&#xff0c;孔道结构有序&…

替换空格

题目描述&#xff1a; 请实现一个函数&#xff0c;将一个字符串中的空格替换成“%20”。例如&#xff0c;当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 时间复杂度o(n)的算法 先遍历一次字符串统计出空格的总数&#xff0c;计算出替换之后的字符串的总长…

备份数据 宝塔linux_宝塔面板旧版本升级教程汇总—升级宝塔面板

往期教程&#xff1a;宝塔面板教程&#xff08;1&#xff09;基于云服务器搭建宝塔面板教程最全详解宝塔面板教程&#xff08;2&#xff09;宝塔面板添加WordPress站点详细图文教程宝塔面板教程&#xff08;3&#xff09;基于宝塔面板成功配置网站SSL安全证书宝塔面板教程&…

Swift面向对象基础(上)——Swift中的类和结构体(下)

学习来自《极客学院》1 import Foundation2 3 class User {4 var name:String5 var age:Int6 init(name:String,age:Int){7 self.age age8 self.name name9 } 10 } 11 var u1 User(name:"何杨",age:23) 12 var u2 User(name:&qu…

ultraedit26 运行的是试用模式_如何并行运行你的自动化测试?

点击上方蓝色字关注我们~在自动化测试过程中的某些时刻&#xff0c;你将遇到一个共同的问题&#xff0c;那就是&#xff1a;需要花费很长时间去执行大量的UI自动化测试用例。最为有效地加速用例执行的方式就是并行地运行自动化测试。不幸地是&#xff0c;使各个自动化测试用例并…

在统计学中参数的含义是指_期刊论文中科研统计学缺陷分析及解决路径

中华医学科研管理杂志, 2018,31(5) 张策, 陈淑良, 王晓桐, 等摘要目的从期刊论文统计方法缺陷方面进行分析&#xff0c;并提出解决方案。方法资料采用中国知网文献数据库中的"基础科学"及"医药卫生科技"数据库的全部文献作为抽样源&#xff0c;限定时间为…

【转载】在C#中运用SQLDMO备份和恢复Microsoft SQL Server数据库

在C#中运用SQLDMO备份和恢复Microsoft SQL Server数据库 SQLDMO(SQL Distributed Management Objects&#xff0c;SQL分布式管理对象)封装了Microsoft SQL Server数据库中的对象。SQLDMO是Microsoft SQL Server中企业管理器所使用的应用程序接口&#xff0c;所以它可以执行很多…

雨棚板弹性法计算简图_钢结构工程量计算、报价要点

第一部分图纸一、图纸&#xff1a;根据图纸目录&#xff0c;清理核对图纸数量&#xff0c;检查是否有遗漏。二、建筑施工图1. 设计总说明&#xff08;1&#xff09; 建筑面积、结构形式、柱距、跨度、结构布置情况&#xff1b;&#xff08;2&#xff09; 工程量计算的范围&…

ubuntu制作usb启动盘

准备&#xff1a; u盘iso镜像文件--ubuntu-12.04.2-desktop-amd64.iso烧盘软件--unetbootin-linux-583步骤&#xff1a; 格式化u盘 查看u盘信息 #mount/dev/sdb1 on /media/KINGSTON type vfat (rw,nosuid,nodev,uid1000,gid1000,shortnamemixed,dmask0077,utf81,showexec,flus…

十分钟理解线性代数的本质_数学对于编程来说到底有多重要?来看看编程大佬眼里的线性代数!...

本文提出了一种观点&#xff1a;从应用的角度&#xff0c;我们可以把线性代数视为一门特定领域的程序语言。我们一起来看看&#xff01;文章有点偏理论讨论&#xff0c;可能比较枯燥&#xff0c;对于一名程序员&#xff0c;你如果看下去&#xff0c;你将会有不一样的收获&#…

Linux Socket学习--套接口的类型和协议

我们首先来说一下PF_INET和AF_INET&#xff0c;虽然标准提倡在指定demain参数的时候&#xff0c;优先使用PF_INET&#xff0c;但是大量已经编写的c代码遵循旧的协议。目前情况是AF_UNIXPF_UNIX&#xff0c;AF_INETPF_INET。但是将来是不是这样不好说啊。 不同于socketpari函数的…

8266串口调试助手_200行Python代码实现串口调试助手(2) 界面构建

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是串口调试工具pzh-py-com诞生之界面构建。一个软件的UI界面是非常重要的&#xff0c;这是软件与用户交互的接口&#xff0c;软件功能即使再强大&#xff0c;但如果没有清晰的UI界面&#…

权限访问控制设计

一、前言 之前的博客一直都还没写到框架的实现及权限系统&#xff0c;今天开始写我的权限系统&#xff0c;我以前做过的项目基本上都有权限管理这个模块&#xff0c;但各个系统都会有一些不太一样&#xff0c;有些简单点&#xff0c;有些稍微复杂一点&#xff0c;一句话&#x…

卸载失败_Windows 10可能的新功能-自动卸载失败的补丁更新

Windows 10作为Windows最新报告&#xff0c;微软正在向Windows 10添加一项新的恢复功能&#xff0c;该功能旨在自动检测更新安装后启动失败的时间。在用户不必做任何事情的情况下&#xff0c;将卸载违规更新&#xff0c;这个操作可以引导系统再次运行。根据在线发布的支持文档&…