System.Console.Write()中的奇怪行为

时间:2016-03-29 17:45:03

标签: c#

将此作为测试:

string text1 = "Letter";
string text2 = "Number";

System.Console.Write("{0}" + " {0}" + " {0}", text1, " {0}", text2);

导致此输出:

Letter Letter Letter

这不应该是输出吗?

Letter Letter Letter Number

这样做:

System.Console.Write("{0}" + " {0}" + " {0}", text1, " {1}", text2);

也导致此输出:

Letter Letter Letter

3 个答案:

答案 0 :(得分:6)

没有输出正确,只有提供给此Console.Write()方法重载的第一个文本值是可能包含占位符的格式。

您使用的实际格式为"{0}" + " {0}" + " {0}"(有效评估为"{0} {0} {0}")。您的其余通话现在作为单独的参数提供:

  • text1作为第一个参数,用于替换所有出现的{0}
  • " {0}"作为第二个参数,用于替换{1}
  • 的所有出现
  • text2作为第三个参数,用于替换{2}
  • 的所有出现

由于实际的格式文本只包含占位符{0},因此您将永远不会在结果文本中看到其他提供的参数。

答案 1 :(得分:3)

这将为您提供正确的输出:

System.Console.Write("{0} {0} {0} {1}", text1, text2);

您对函数和字符串格式的理解有几个问题。

  1. Write()的第一个参数是您要输出的字符串
  2. 除非使用{0}, {1}, etc..
  3. 引用,否则第一个参数之后的参数将不会连接到第一个参数中的字符串
  4. 没有编译器错误,因为这是对方法的有效调用。编译器会忽略" 0"text2参数,因为它们未在原始字符串中引用。

答案 2 :(得分:2)

以下是您的代码无效的原因说明:

首先,让我们分解你的行:

System.Console.Write("{0}" + " {0}" + " {0}", text1, " {0}", text2);

这一行将简化为:

System.Console.Write("{0} {0} {0}", text1, " {0}", text2);

请记住,第一个参数是要输出的字符串。在这种情况下"{0} {0} {0}"。该字符串后面的任何参数都是要在原始字符串中替换的参数,例如{0}{1}等。这些参数将在需要时使用。

System.Console.Write,在您使用的上下文中需要一个字符串并搜索参数,例如{0}{1}等。因为您只使用一个参数, {0},它只抓取字符串后的第一个参数,即text1。之后的任何其他参数都被忽略,或者更具体地说,它们未被使用。所以编译器基本上简化了你的行:

System.Console.Write("{0}" + " {0}" + " {0}", text1);