格式化输出字符串之Format、IFormattable、IFormatProvider、ICustomFormatter

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PanPen120/article/details/48145929

简述

将对象格式化输出为String类型

一、String.Format();

简述

string类自带的静态方法

Code

'剖析一下下面三种结果一样的写法区别在哪里'
var test1 = string.Format("测试1:{0} 中午吃了{1}",name,food);
var test2 = "测试2:" + name + "中午吃了" + food;
var test3 = string.Format("测试1:" + name + "中午吃了" + food);

Code剖析

推荐第一种方式!
- test2、test3中因有 +号,降低了性能,String虽然是引用类型,.Net的特殊处理,String是值类型一样,在每次值的改变,修改内存;
- test1中用的 {},已经定义的方法,本质是StringBuilder,分配缓存……简单的说就是每次值改变,不会重新分配内存;

二、To.String();

简述

重写ToString();

重写无参的ToString();

Code

public override string ToString()
{   return ……;}

重写有参的ToString();

简述

继承接口IFormattable,重写有参ToString();

Code

'继承该接口'
class A :  IFormattable
{
    public string Name { get; set; }
'接口方法ToString()'
    public string ToString(string format, IFormatProvider formatProvider)
    {
        var nameArray = Name.Split('#');
        if("0" == format)
            return "姓名:" + nameArray[0];
         if("1" == format)
            return "武功:" + nameArray[1];
        return null;
    }
}

Code结果

这里写图片描述

其他

如果你想像用常规的ToString()的方法一样,一个参数,可以在上面代码中加入

public string ToString(string format)
{   return ToString(format, null);  }   

及时你写了这么多ToString(),但仍然想要常规的将19.5转为String,不影响的

IFormatProvider与ICustomFormatter的使用

简述

  1. 使用方式:这两个接口是连着使用的,类似于工厂模式(下面Code解释)
  2. 使用目的:上面重写ToString()是为了将对象格式化的输出,但如果有A类、B类、香蕉类,都需要格式化输出,连着各使用一次上面的这两个接口,就无需一个一个继承IFormattable

Code

1.Build一个Class,来继承ICustomFormatter,实现方法Format(),格式化的内容;

class FromatClass : Exception, ICustomFormatter
{
   public string Format(string format, object arg, IFormatProvider formatProvider)
    {   return "啦啦啦德玛西亚,";   }
}

2.Build一个Class,来继承IFormatProvider,实现方法GetFormat(), 分发者;

class FromatProvider:IFormatProvider
{
    public object GetFormat(Type formatType)
    {  return new FromatClass();  }
}

3.使用

  var B1 = new B {Name = "步惊云"}; //B是和A一样的一个类
  var result = string.Format(new FromatProvider(), "{0}",B1.Name);

4.结果

这里写图片描述

5.到了这一步,每个类都格式化同样的内容,如果每个类还想得到不同的呢,可以在Format()中Switch判断,也可以在Format()中return 改为 return “啦啦啦德玛西亚, + arg。ToString()”; ,arg是对象,在这里是B1,然后在B类中按上面的方法重写ToString()即可。

return "啦啦啦德玛西亚," + arg.ToString();

结尾

return的是String,本质是重载ToString();

Code地址

https://code.csdn.net/snippets/1025804

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页