【问题标题】:C# string insertions confused with optional parametersC# 字符串插入与可选参数混淆
【发布时间】:2009-05-18 13:44:56
【问题描述】:

我是 C# 的新手,并试图找出字符串插入(即"some {0} string", toInsert),但遇到了一个我没想到的问题......

如果你有两个构造函数:

public MyClass(String arg1) { ... }

public MyClass(String arg1, String arg2) { ... }

我可以使用第一个构造函数来插入字符串吗?

...
toInsert = "def"
myClass = new MyClass("abc{0}ghi", toInsert)
...

或者 C# 会将其解释为第二个构造函数,并将文字 "abc{0}ghi" 作为第一个参数传递?

【问题讨论】:

    标签: c# string-formatting multiple-constructors


    【解决方案1】:

    是的,这将被解释为只是第二个参数。

    您描述的行为称为字符串格式化,并且接受这种样式的字符串的所有内容都在后台使用 string.Format() 。有关详细信息,请参阅该方法的文档。

    要获得所需的行为,请使用以下代码:

    myClass = new MyClass(string.Format("abc{0}ghi", toInsert));
    

    【讨论】:

    • 其实String.Format()调用的是StringBuilder.AppendFormat()
    • 那么,我是否应该始终将我的格式包装在 string.Format() 中以避免在具有一个构造函数的类得到一个新构造函数的情况下出现错误?
    • 不,这是一个不合理的结论。 new MyClass(A) 调用接受一个参数的 ctor,而 new MyClass(A,B) 调用接受 2 个参数的 ctor,不管你用什么替换 A 和 B。你已经用 "abc{0}ghi" 替换了 A . 这不会改变你已经传递了 2 个参数的事实。
    • @Cheeso,听起来您正在确认我的假设,即在参数中使用字符串格式时,格式应该始终在 string.Format() 中,但我这样做的原因是错误的。
    【解决方案2】:

    只要做:

    public MyClass(string format, params object[] args)
    {
      this.FormattedValue = string.Format(format, args);
    }
    

    【讨论】:

      【解决方案3】:

      或者 C# 会将其解释为 第二个构造函数并传递一个文字 “abc{0}ghi”作为第一个参数?

      这是正确的答案。 我认为如果您使用 String.Format("abc{0}ghi", toInsert) 那么它将采用第一个构造函数

      【讨论】:

        猜你喜欢
        • 2014-04-19
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多