English 中文(简体)
C#: IFormattable、IFormatProvider和ICustomFormatter之间的联系,以及何时使用什么
原标题:C#: Connection between IFormattable, IFormatProvider and ICustomFormatter, and when to use what

<代码>IFormattable、>IFormatProvider之间的区别和联系是什么? 一个简单的执行实例也非常突出。

而且,我并不真的指在网内使用网时,但当我执行这些网时,以及在这种情况下,哪几类人通常会执行什么接口,以及如何适当做到这一点。

最佳回答
  • <代码>IFormattable是支持<编码>格式的物体。 Format, i.e., the xxx in 0:xxx}. <编码>载体。 格式将交给物体<代码>。 如果物体支持接口,则采用方法。

  • <代码>IFormatProvider是构成信息的来源,用于文化特定日期和货币布局等事项。

  • 然而,就如<代码>Datetime等情况而言,如果你希望格式已经实施IFormattable<>code>,但你不控制实施情况(Datetime在《巴塞尔公约》中提供,你可以轻易取代这一条),则有一个防止<编码>编码的机制。 格式,仅使用<代码>IFormattable。 ToString。 相反,请你执行<条码>t/IFormatProvider,并在要求实施<条码>时,交还。 <编码>载体。 格式核对供应商在参加标语<代码>的表格/编码。 格式,这反过来又可能请<编码>IFormatProvider提供特定文化数据,如<代码>CultureInfo。

这是一项显示<代码>内容的方案。 格式/编码 要求tormatProvider,以及控制的流动如何:

using System;
using System.Globalization;

class MyCustomObject : IFormattable
{
    public string ToString(string format, IFormatProvider provider)
    {
        Console.WriteLine("ToString("{0}", provider) called", format);
        return "arbitrary value";
    }
}

class MyFormatProvider : IFormatProvider
{
    public object GetFormat(Type formatType)
    {
        Console.WriteLine("Asked for {0}", formatType);
        return CultureInfo.CurrentCulture.GetFormat(formatType);
    }
}

class App
{
    static void Main()
    {
        Console.WriteLine(
            string.Format(new MyFormatProvider(), "{0:foobar}", 
                new MyCustomObject()));
    }
}

它印刷如下:

Asked for System.ICustomFormatter
ToString("foobar", provider) called
arbitrary value

如果格式提供商改换成一种定制格式,则转而:

class MyFormatProvider : IFormatProvider
{
    public object GetFormat(Type formatType)
    {
        Console.WriteLine("Asked for {0}", formatType);
        if (formatType == typeof(ICustomFormatter))
            return new MyCustomFormatter();
        return CultureInfo.CurrentCulture.GetFormat(formatType);
    }
}

class MyCustomFormatter : ICustomFormatter
{
    public string Format(string format, object arg, IFormatProvider provider)
    {
        return string.Format("(format was "{0}")", format);
    }
}

运行:

Asked for System.ICustomFormatter
(format was "foobar")
问题回答

定制格式的工作基于三个组成部分之间的协调:

  • Formattable
  • Format provider
  • Formatter

formattable Object are cases that can use a form Providers as well with a Formatstring to Format their data by implementing 表格接口。 基本上,它们将要求格式提供商获得<代码>formatter,然后使用作为格式指示的格式,请<代码>formatter<<>>>>>格式。 日期/时间和数字类型是表格类型的例子。

<>标准提供商是实施<条码>的班级。 他们负责根据打电话者要求的格式类型归还<代码>formatter的物体。 格式类型可以是格式提供商可以理解的哪类,而填回的<代码>formatter则应是用户(表格“多数情况下的标的”)可用于格式其数据。

<>formatters是负责提供格式化服务的物体。 在日期/时间及数字类型方面,格式提供商也为<代码>formatters。 www.un.org/chinese/ga/president

在通过诸如<代码>String.Format、Console.WriteLine等一些方法实施的综合格式格式中,当一个格式提供人通过时,他们总是要求提供实施ustomFormatter界面的<代码>格式>。 这使得开发商能够提供这些方法的各种定制格式。

>IFormattable是支持不同形式(例如,编号和编号)的物体。 通过使用接口,守则的多部分可使用价值和格式说明,这在数据约束和<编码>中是常见的(例如)。 格式

http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx” rel=“nofollow noretinger”>IFormatProvider 填充了处理格式的某些空白,特别是I18n。 最常见的是,使用<条码>CultureInfo作为提供方,或者提供具体的当地格式,或采用不变的文化。

就我所知,ICustomFormatter与外界无关,与序列化的联系更多(BinaryFormatter)。 我会错......

缩略语

IFormattable d = 123.45M;
string s1 = d.ToString("c", CultureInfo.CurrentCulture), // local currency
       s2 = d.ToString("c", CultureInfo.InvariantCulture); // invariant currency




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签