2016-03-29 3 views
0

Doing это как тест:Weird поведение в System.Console.Write()

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 
+1

Вам нужно использовать '{1}' для ссылки на второй параметр – stackErr

+0

, проверил его же результат. – Johnson

ответ

6

Нет выход правильно, только первое значение текста, предоставленное для перегрузки методы это Console.Write() формат, который может содержать заполнители.

Фактический формат, который вы используете, - "{0}" + " {0}" + " {0}" в вашем случае (что фактически оценивает "{0} {0} {0}").Остальная часть вашего звонка теперь предоставляются в виде отдельных аргументов:

  • text1 в качестве первого аргумента, которые используются, чтобы заменить все вхождения {0}
  • " {0}" в качестве второго аргумента, используемых для замены всех occurrances из {1}
  • text2 в третий аргумент, используемый для замены всех записей {2}

И поскольку текст в реальном формате содержит только заполнитель {0} вы не увидите других предоставленных аргументов в полученном тексте.

+1

О, теперь я получил это благодаря. – Johnson

3

Это даст вам правильный вывод:

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

Есть несколько вещей неправильно с пониманием функции и форматирование строк.

  1. Первый параметр Write() является строкой, которую вы хотите вывести
  2. параметры после 1-го параметра НЕ будут слиты в строку в первом параметре, если не ссылаться, используя {0}, {1}, etc..
  3. Там будет никаких ошибка компилятора, так как это действительный вызов метода. Параметры " 0" и text2 игнорируются компилятором, поскольку они не указаны в исходной строке.
+1

Или даже лучше, стилистически: 'Console.Write (" {0} {0} {0} {1} ", text1, text2);' – antiduh

+0

Спасибо @stackErr, я знаю это, но я спрашиваю, что такое поведение в другой пример, который я дал? Почему он не работает, и почему он тоже не бросает ошибок? – Johnson

+1

Следующее должно помочь объяснить «Композитное форматирование». https://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx – Stringfellow

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); 
+0

Просто nitpicking, но OP передает строку и 3 других параметра: 'text1',' "{0}" 'и' text2' – stackErr

+1

@stackErr - Да, но поскольку он ссылается только на один, '{0}', тогда компилятор игнорирует другие параметры. Более конкретно, это не игнорирование параметров, а просто их не использование. – Icemanind