彻底学通string.Format以及IFormattable,IFormatProvider,ICustomFormatter

  自从使用.NET以来就一直都在使用string.Format方法,一直没有空或者其他原因都没有深入去了解,主要还是因为项目上似乎没有这么高的要求,也没必要去深入了解,就算碰到了自定义的格式化内容也是写几个通用的方法而已。今天空下来仔细去理解了一下,在这里和大家分享一下,也希望大家一起交流。

  string.Format方法是string类提供的静态方法,一般最多使用的是其两个参数的重载,例如:

var name = "Zhezhe";
var msg 
= string.Format("Hello Cnblogs, I am {0},Today is {1:yyyy-MM-dd} {2}.", name, DateTime.Now, DateTime.Now.DayOfWeek);
Console.WriteLine(msg);

  3.ToString带有自定义格式化参数的理解

  上面讲到的ToString都是不带格式化参数的,像  {1:yyyy-MM-dd} 这样的情况是没法处理的,也许有人会说像 DateTime.Now.ToString("yyyy-MM-dd") 这样的情况自己去重载一个ToString方法就可以了,果真如此吗? 下面就测试一下:

public class PersonWithToString
    {
        
public string Name { getset; }

        
public override string ToString()
        {
            
return Name;
        }

        
public string ToString(string format)
        {
            
switch (format)
            {
                
case "UPP":
                    
return Name.ToUpper();
                
case "LOW":
                    
return Name.ToLower();
                
default:
                    
return Name;
            }
        }
    }

  4.继续了解 IFormatProvider 和 ICustomFormatter 接口

  到这里为止,应该说灵活应用string.Format()已经没什么多大的问题了,但是也还是存在一些问题,比如我们必须得为每个类单独去实现IFormattable接口才能实现自定义的格式化参数。在一些场后还是觉得不太方便或者说代码冗余。

  .NET的string.Format静态方法还提供了重载方法,具体签名如下:public static string Format(IFormatProvider provider,string format,params Object[] args)

  这个方法比起原来使用的方法最前面增加了 IFormatProvider类型参数。使用此方法的优点是不需要为后面的参数对象实现 IFormattable  接口就可以使用自定义的格式化参数。既然这样的话也就解决了第4部分开头提到的问题了。 

  还是用例子说话,下面是正方形类

public class Square
{
public string Name { get; set; }

/// <summary>
/// 边长
/// </summary>
public double Side { get; set; }

public override string ToString()
{
return string.Format("{0}(Side:{1})",Name, Side);
}
}

NET技术彻底学通string.Format以及IFormattable,IFormatProvider,ICustomFormatter,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。