【问题标题】:C# String.Format argsC# String.Format 参数
【发布时间】:2010-11-28 21:01:49
【问题描述】:

我有一个这样的数组:

object[] args

并且需要将这些参数插入到一个字符串中,例如:

str = String.Format("Her name is {0} and she's {1} years old", args);

代替:

str = String.Format("Her name is {0} and she's {1} years old", args[0], args[1]);

注意:实际上第一行代码有效!但是 args[1] 不见了!对不起,谢谢。每个人的分数:)

【问题讨论】:

  • 您有问题吗?

标签: c# .net string formatting


【解决方案1】:

如果数组 args 中至少有两个对象,您的第一个示例应该可以正常工作。

object[] args = new object[] { "Alice", 2 };
str = String.Format("Her name is {0} and she's {1} years old", args);

【讨论】:

    【解决方案2】:

    它应该按照您想要的方式工作。 String 类的 Format 方法定义如下:

    public static string Format(string format, params object[] args);
    

    看到你的例子中的“args”是一个对象数组,它应该适合。

    【讨论】:

      【解决方案3】:

      你的第二个代码块会做我认为你想要完成的事情。

      string.Format("Hello {0}, {1} and {2}", new object[] { "World", "Foo", "Bar" });
      

      【讨论】:

        【解决方案4】:

        您是否尝试过第一行?你看到它应该和第二个一样工作了吗?

        【讨论】:

          【解决方案5】:
          str = String.Format("Her name is {0} and she's {1} years old", args);
          

          应该在 args 是 object[] 类型时工作。

          【讨论】:

            【解决方案6】:

            我不确定你在问什么,但考虑到 String.Format() 函数的签名之一是

            Public Shared Function Format(ByVal format As String, ByVal ParamArray args() As Object) As String
            

            我从 Visual Studio 复制的更多垃圾:

            总结: 将指定 System.String 中的格式项替换为指定数组中对应 System.Object 实例的值的等效文本。

            参数: 格式:复合格式字符串。 args:一个 System.Object 数组,包含零个或多个要格式化的对象。

            返回值: 格式的副本,其中格式项已替换为 args 中 System.Object 对应实例的 System.String 等效项。

            例外情况: System.ArgumentNullException:格式或参数为空。 System.FormatException:格式无效。 - 或 - 表示要格式化的参数的数字小于零,或者大于或等于 args 数组的长度。

            -- 在 VB 上糟糕,但你明白了。

            【讨论】:

            • 我喜欢您提供的 API 定义是针对 VB 的。 ;-)
            【解决方案7】:

            您的两个示例都做同样的事情 - String.Format 有一个重载,它接受一个 object[] 而不是单独指定每个参数。

            【讨论】:

              【解决方案8】:

              如果您不知道参数数组中有多少个数组元素,请尝试使用 string.Join()。

              string.Format("Arguments passed in to the program are: {0}", string.Join(" ", args));
              

              特别是在你的例子中:

              string.Format("Her name is {0} years old", string.Join(" and she's ", args));
              

              就我个人而言,我不喜欢数组对象的硬编码结构。在整个应用程序中要记住的东西太多了,而且很难维护。我宁愿将参数转换为带有接受数组的构造函数的“Person”对象,并重载 ToString() 以显示有关对象成员的特定信息。

              class Person
              {
                  private string m_sName;
                  private string m_sAge;
              
                  public Person(string[] args)
                  {
                      m_sName = args[0];
                      m_sAge = args[1];
                  }
              
                  public override string ToString()
                  {
                      return string.Format("Her name is {0} and she's {1} years old.", m_sName, m_sAge);
                  }
              }
              

              因此您可以构造一个“Person”对象并在调用时显示消息。

              var oNewPerson = new Person(args);
              console.WriteLine(oNewPerson.ToString());
              

              这与 Microsoft 的示例非常相似:

              http://msdn.microsoft.com/en-us/library/ms173154(v=vs.80).aspx

              【讨论】:

                猜你喜欢
                • 2014-05-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多