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

FormatProvider vs.扩展方法vs.新类

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

    我想输出一个罗马数字的整数,结果遇到了 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 回复  |  直到 9 年前
        1
  •  1
  •   Paul Alexander    17 年前

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

        2
  •  1
  •   tim    17 年前

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

        3
  •  0
  •   shahkalpesh    17 年前

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

    国际海事组织认为,延期方法是一个很好的选择。不确定,使用c#1或c#2(不支持扩展方法的语言)的程序集用户会如何看待它。

    两种扩展方法都会很好。
    即在数字类型上-从数字转换为罗马和
    on string-从Roman转换为number(您必须考虑一个应该容纳最大值的数字类型)。