none
一个与Params相关的抓狂问题 RRS feed

  • 常规讨论

  • 要用String.Format格式化一个字符串。
    问题是,Format接收的参数是带Parmas标识的,可是我却拥有一个要格式化的数据的数组。我不知道数组的大小,因此我不能尝试把数组中元素挨个放到Format参数列表中。

    我多么滴希望Format能够有一个不带Params标识的重载。

    或许哪位大侠能给个此函数的实现么?

    public string Func(string Formater,string[] Datas)
    {
          //.......


          //.......
          return String.Format(Formater,Datas);
    }
    2009年9月25日 17:05

全部回复

  • 你好!
         如果你的数组长度不确定,那你的格式化字符串如何定义呢?
    周雪峰
    2009年9月26日 3:01
    版主
  • 您好,params string[] args的定义,说明是接收不定长度的string类型的参数,而不是string数组,
    所以不可以String.Format(Formater,Datas);这么用,而是String.Format(Formater,Datas[0],Datas[1]...);

    这种格式化也不一定要用Format,可以使用StringBuilder做个for循环来操作。

    2009年9月26日 3:44
  • 如我代码所述,格式化字符串和参数都是用户指定的,真实情况未必如此,但问题就是这样。

    我在一个函数里封装了一段格式化的代码,其实格式化字符串和参数是通过不同途径传入的,但用户可以保证参数个数及含义与格式化字符串对应。我不能让用户直接直接Format函数生成格式化后的字符串再传给我。

    用Reflector查看了一下String.Format函数,发现有点诡异。

    public static string Format(string format, params object[] args)
    {
        return Format(null, format, args);
    }
    
     
    public static string Format(IFormatProvider provider, string format, params object[] args)
    {
        if ((format == null) || (args == null))
        {
            throw new ArgumentNullException((format == null) ? "format" : "args");
        }
        StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
        builder.AppendFormat(provider, format, args);
        return builder.ToString();
    }
    
     
    

    这里
    Format(IFormatProvider provider, string format, params object[] args)
    的格式化参数同样是带params的,但
    public static string Format(string format, params object[] args)
    给它传递的却是一个直接的数组。

    难道微软有什么机制保证不会把args直接当成一个单个参数么?
    2009年9月26日 5:13
  • 经测试,对于标识params的参数列表,可以直接传数组。

    Microsoft真强大~
    2009年9月26日 6:33