IFormatProvider、ICustomFormatter、IFormattable的区别和使用

IFormatProvider、ICustomFormatter、IFormattable的区别和使用前言对于某些类的对象 我们需要格式化输出 一般重写 ToString 方法就足够了

大家好,欢迎来到IT知识分享网。

前言

对于某些类的对象,我们需要格式化输出,一般重写ToString()方法就足够了。但也有一些类的对象,需要提供多种多样的格式化输出,最典型的就是DateTime类,它的ToString()方法可以接受不同参数进行格式化输出,如下图所示。
在这里插入图片描述

三个接口的区别

1、IFormatProvider(格式化器提供者)

在这里插入图片描述
IFormatProvider接口中只有一个方法GetFormat,它的主要作用是:对需要格式化对象的类型进行判断,并提供相应的格式化器。为什么会有格式化器呢?因为假如一个ToString()方法的内部格式化形式不是我们想要的,我们就可以自己提供一个格式化器给ToString()方法,让它格式化成我们想要的形式。所以IFormatProvider类的含义就是 格式化器的提供者

ICustomFormatter(格式化器)

在这里插入图片描述

一般而言,格式化器是需要实现ICustomFormatter接口的,该接口也只包含一个接受三个参数的方法,其中第二个参数arg是被格式化对象,而第一个参数format是可以指定arg被格式化成什么样子的标识符,第三个参数formatProvider是格式化器提供者,暗指可以在指定一个格式化器。该方法的返回值就是一个格式化好的字符串对象。

3、IFormattable(可格式化对象)

在这里插入图片描述
不言而喻,实现IFormattable接口的对象就表明它可以利用格式化器进行格式化。该接口也只提供一个接受两个参数ToString()方法。第一个参数format是可以指定当前对象被格式化成什么样子的标识符,第二个参数formatProvider是格式化器提供者。

代码分析

讲明白三个接口之间的关系,我们直接看代码!

//格式化器类 //一般而言,格式化器类不仅需要实现ICustomFormatter接口,也要实现IFormatProvider接口 //为什么?微软案例就这样写的,按我理解 GetFormat的目的不就是 判断对象类型并返回格式化器  //我MyFormater自己判断类型,自己返回自己,怎么啦!怎么啦!你有什么问题吗? public class MyFormater:ICustomFormatter,IFormatProvider { 
    public object GetFormat(Type format) { 
    //判断format类型,如果是FormattableObject类,并返回相应格式化器 if (format == typeof(FormattableObject)) return this; return null; } public string Format(string format, object arg, IFormatProvider provider) { 
    //如果格式化标识符为null if (format == null) { 
    //如果arg是实现IFormattable的对象 if (arg is IFormattable) return ((IFormattable)arg).ToString(format, provider); return arg.ToString(); } else { 
    if (format == "MyFormater") { 
    return "" + arg.ToString(); } else { 
    if (arg is IFormattable) return ((IFormattable)arg).ToString(format, provider); return arg.ToString(); } } } } public class FormattableObject : IFormattable { 
    public string ToString(string format, IFormatProvider formatProvider) { 
    //TODO 写代码进行格式化输出(懒得自己编了) } } 

完结撒花!!!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/142168.html

(0)
上一篇 2025-05-12 13:45
下一篇 2025-05-12 14:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信