码迷,mamicode.com
首页 > 其他好文 > 详细

如何使用IFormattable接口实现格式化输出

时间:2014-08-19 16:22:24      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   strong   for   

分析问题

  在设计类型时,程序员应该尽量为类型使用者着想,其中重要的一点就是提供格式化的字符串输出。为类型编写格式化输出接口,类型自身和其使用者都将得到收益。对于一些类型,重写基类中的ToString方法就已经足够了,但对于有些类型,则需要提供多种格式的输出,这个时候ToString方法就不能满足需求了。此时就需要实现IFormattable中的ToString方法:

String IFormattable.ToString(String format,IFormatProvider formatProvider)

  该方法接受两个参数,第一个字符串参数告诉方法需要何种格式的输出,而第二个IFormatProvider的参数则允许类型使用者自定义格式化方法。IFormatProvider接口将在后续小节中讨论。以下代码展示了如何实现IFormattable接口。

using System;

namespace Test
{
    class UseIFormattable:IFormattable
    {
        private DateTime _time;

        public UseIFormattable(DateTime time)
        {
            _time = time;
        }

        //重写ToString方法
        public override string ToString()
        {
            return "Object.ToString()";
        }

        public string ToString(string format, IFormatProvider formatProvider)
        {
            //这一段将在后面章节讨论
            if (formatProvider!=null)
            {
                ICustomFormatter fmt = formatProvider.GetFormat(this.GetType()) as ICustomFormatter;
                if (fmt!=null)
                {
                    return fmt.Format(format, this, formatProvider);
                }
            }
            //这里实现格式化输出
            switch (format)
            {
                case "ld":
                    return _time.ToLongDateString();
                case "lt":
                    return _time.ToLongTimeString();
                case "sd":
                    return _time.ToShortDateString();
                case "st":
                    return _time.ToShortTimeString();
                case "G":
                //null和""在这里实现
                default:
                    return _time.ToString(); 
            }
        }

        static void Main()
        {
            UseIFormattable use = new UseIFormattable(DateTime.Now);
            //调用IFormattable.ToString方法

            Console.WriteLine(use);
            Console.WriteLine(use.ToString("ld", null));
            Console.WriteLine(use.ToString("lt", null));
            Console.WriteLine(use.ToString("sd", null));
            Console.WriteLine(use.ToString("st", null));

            Console.Read();
        }

    }
}

  如上面代码所示,IFormattable.ToString方法主要使用第一个字符串参数来作为输出的依据,根据不同的输入来格式化类型对象。在实现IFormattable接口时,有几点需要读者注意:

  1、实现IFormattable.ToString方法通常可以自定义接受的格式字符串,但有三个字符串应该被实现:“G”、null和Empty。不实现这三个格式不会造成编译或者运行的错误,但潜在地违反了.NET的内建规范。

  2、当实现了IFormattable.ToString方法后,所有的内建类型都将调用IFormattable.ToString方法,而不是继承自System.Object的ToString方法。在以上代码中,Console.WriteLine方法就是一个例子。

  3、内建方法会自动调用IFormattable.ToString方法,使用的参数可能是“G”,也可能是空字符串,建议读者在设计类型时,把这几个格式实现成和Object.ToString具有相同的输出。

  4、在IFormattable.ToString方法的一开始,对IFormatProvider参数进行了检查,这一机制将在后续小节中详细介绍,简单来讲,它实现了让类型使用者提供格式化方法的功能。

  以下是上边代码的输出:

bubuko.com,布布扣

答案

  IFormattable接口帮助类型实现了多样化的格式化输出。IFormattable的ToString方法接受一个代表格式的字符串参数,通过对这个参数的分析来进行格式化输出。另外,IFormattable.ToString方法接受一个IFormatProvider类型的参数,以允许类型的使用者提供格式化的方法。

 

如何使用IFormattable接口实现格式化输出,布布扣,bubuko.com

如何使用IFormattable接口实现格式化输出

标签:style   blog   http   color   使用   os   strong   for   

原文地址:http://www.cnblogs.com/wangjinpeng-study/p/3922167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!