代码之家  ›  专栏  ›  技术社区  ›  Colin Burnett

FormatProvider与扩展方法与新类

  •  5
  • Colin Burnett  · 技术社区  · 15 年前

    我想输出一个整数到罗马数字 this 杰西·斯克勒回答。这是一种扩展方法,但我想利用 ToString(string, IFormatProvider) 做类似的事情

    int a = 10;
    string b = a.ToString("RN", provider);
    // OR
    string c = string.Format(provider, "{0:RN} blah foo", a);
    

    而不是

    int a = 10;
    string b = a.ParseRomanNumeral();
    // OR
    string c = string.Format("{0} blah foo", a.ParseRomanNumeral());
    

    我从来没有写过格式提供商,所以我不确定所涉及的工作,但这是我的问题。 对于一些定义明确的格式转换,如罗马数字,您是否会使用:

    • 格式提供程序
    • 使用扩展方法
    • 编写一个实现 Parse 我是说, TryParse ,和 ToString
    • 别的什么

    为什么呢?

    使用 string.Format() 以及它的任何同类方法(例如, StringBuilder.AppendFormat() )影响你的回答?显然,使用扩展方法时,无法使用这些格式设置方法之一访问转换。

    我认为实现整个范围的定制类是最谨慎的,但也是最耗时的。与定制格式提供者一起,似乎它将踏上一些现有全球化事物的脚趾(如果你有任何东西)。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Paul Alexander    15 年前

    格式提供程序适用于您自己的类型,但是在使用内置类型时它们很笨拙,因为您必须创建提供程序的实例并将其传递给format方法,这样就消除了格式说明符的优势。直接在int上使用扩展方法要方便得多。

        2
  •  1
  •   tim    15 年前

    就我个人而言,我会编写一个罗马数字类,使用tryparse,parse+tostring(),并使用扩展方法来支持它,这是基于以上所有原因(包括您对shahkalpesh答案的后一条评论)。

        3
  •  0
  •   shahkalpesh    15 年前

    我想这取决于你打算如何使用这个功能。

    在我看来,扩展方法是一个很好的方法。不确定,使用C 1或2(不支持扩展方法的语言)的程序集用户将如何看到它。

    两种方法都可以扩展。
    即关于数字类型-从数字转换为罗马和
    在字符串上-从罗马数字转换为数字(你必须考虑一个数字类型,它应该容纳最大值)。