gpt4 book ai didi

c# - IFormattable 的引用实现

转载 作者:可可西里 更新时间:2023-11-01 08:01:02 28 4
gpt4 key购买 nike

IFormattable有没有好的引用实现?我打算至少定制一个 IFormatProvider对于我的对象,我想确保传递给 IFormattable.ToString(string, IFormatProvider) 的不同可能参数集的接线正确无误。 .

到目前为止我所拥有的:

public class MyDataClass : IFormattable
{
/// <seealso cref="IFormattable.ToString(string, IFormatProvider)"/>
public string ToString(string format, IFormatProvider formatProvider)
{
ICustomFormatter formatter = (ICustomFormatter)formatProvider.GetFormat(typeof(ICustomFormatter));
return formatter.Format(format, this, formatProvider);
}
}

但似乎还应该涵盖其他潜在情况,即:
  • formatProvider为空,我应该回退到 this.ToString() ?
  • formatProvider.GetFormat(typeof(ICustomFormatter))返回 null ,是否有我应该抛出的特定异常?

  • 感谢任何博客文章/代码示例/MSDN 引用。

    最佳答案

    您似乎误解了 .NET Framework 格式基础结构的设计。 ICustomFormatter永远不应该在 IFormattable.ToString 的实现中被引用,因为这与该接口(interface)的预期目的相冲突。
    IFormattable
    一个对象应该只实现 IFormattable如果它知道如何格式化自己(理想情况下,它当然应该将其委托(delegate)给另一个类,但这里会故意耦合)。一个对象可能知道如何以多种不同的方式格式化自己,因此格式字符串允许您在它们之间进行选择。即便如此,仍然可能缺少信息,这些信息因文化而异。因此,存在间接提供此类信息的第二个参数。

    传递给 IFormatProvider.GetFormat 的类型旨在成为特定于类 IFormatProvider 的类型或接口(interface)被提供给。

    例如,内置数字类型希望能够检索 System.Globalization.NumberFormatInfo 的实例。 , 而 DateTime相关类希望能够检索到 System.Globalization.DateTimeFormatInfo .

    实现 IFormattable
    所以让我们假设我们正在创建一些新的自格式化类。如果它只知道一种格式化自己的方法,它应该简单地覆盖 object.ToString() ,仅此而已。如果类知道不止一种格式化自己的方法,则应该实现 IFormattable .
    format范围

    the documentationIFormattable.ToString "G" 的格式字符串(代表通用格式)必须得到支持。建议 null 或空格式字符串等价于格式字符串 "G" .确切的含义取决于我们。
    formatProvider范围

    如果我们需要任何特定于文化的东西,或者会有所不同,我们需要使用 IFormatProvider范围。我们会使用 IFormatProvider.GetFormat 向它请求某种类型。 .如果IFormatProvider为空,或者如果 IFormatProvider.GetFormat对于我们想要的类型返回 null 我们应该回退到这个变化信息的一些默认来源。

    默认源不必是静态的。可以想象,默认来源可能是应用程序中的用户设置,而formatProvider用于预览选项更改和/或序列化需要固定格式时。

    格式化也可能涉及格式化某些子对象。在这种情况下,您可能希望通过 IFormatProvider下。 MSDN 有一个 excellent example实现 IFormattable这表明了这种情况。

    其他 ToString重载

    实现时IFormattable重要的是 Object.ToString()以等效于以下的方式覆盖

    public override string ToString()
    {
    return this.ToString(null, System.Globalization.CultureInfo.CurrentCulture);
    }

    这样做可确保 somestring + yourobject相当于 string.Format("{0}{1}",somestring, yourobject) ,您的用户会期望这是真的。

    为了方便您的用户,您可能应该提供 string ToString(string format) .此外,如果您的默认格式有任何可以从 IFormatProvider 中受益的不同组件。 ,您可能还想提供 public string ToString(IFormatProvider provider) .
    ICustomFormatter
    那么如果我们想要格式化一个不知道如何格式化自己的类,或者我们想要使用一些类本身不支持的格式,我们该怎么办。这就是 ICustomFormatter 变得相关的地方。安 IFormatProvider可以提供 ICustomFormatter类型可以作为 IFormatProvider 传递 string.Format 等方法中的参数和 StringBuilder.AppendFormat .

    提供的 ICustomFormatter有它的 Formatstring.Format 的每个格式调用的方法做。如果 ICustomFormatter不熟悉所使用的格式字符串或不支持该类型,它只是委托(delegate)给 IFormattable.ToStringObject.ToString . ICustomFormatter documentation如果您正在格式化一个尚未提供格式支持的对象,则提供了所需的列表,以及如果您只想向现有 IFormattable 添加额外格式所需的列表.它还提供了一个添加额外格式案例的示例。

    引用

    This MSDN page提供了 .NET 格式系统的一个很好的概述,并提供了指向 MSDN 中几乎所有其他相关页面的链接。它是解决几乎所有格式相关问题的最佳起点。

    关于c# - IFormattable 的引用实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14221424/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com