Почему я не могу использовать {0} при записи в MsgBox?
Если я хочу показать что-то в console
Я обычно пишу это так: Console.Write("Hello{0}", AnyNumber);
,
Но если я использую Interaction.MsgBox
и писать Interaction.MsgBox("Hello {0}, AnyNumber");
Я получаю ошибку, почему это?
Мне нравится использовать заполнители как {0}
намного больше чем +
(конкатенация строк), когда я пишу, я думаю, что проще так написать...
Поэтому мой вопрос: почему я не могу использовать заполнители в MsgBox и есть ли другой способ их использования?
Вот пример того, как я хотел бы использовать его в MsgBox:
static void multiplikation(int tal1, int tal2)
{
if (tal1*tal2 == 100)
{
Interaction.MsgBox("Hello!\nResult:\n" + (tal1 * tal2));
}
else
{
Interaction.MsgBox("Resultat:\n" + (tal1 * tal2));
}
}
static void addition(int tal1, int tal2)
{
if (tal1 + tal2 == 100)
{
Console.Write("Hello!\nResult:{0}\n", (tal1 + tal2));
}
else
{
Console.Write("Resultat:{0}\n", (tal1 + tal2));
}
}
4 ответа
Interaction.MsgBox
получает строку в качестве первого параметра. Если вы хотите отформатировать строку, вы должны сделать это самостоятельно и передать отформатированную строку Interaction.MsgBox
:
Interaction.MsgBox(string.Format("Hello!\nResult:{0}\n", (tal1 + tal2)));
С другой стороны, Console.Write
был написан с перегрузками, которые позволяют выполнять форматирование внутри Console.Write
,
Это связано с тем, что в отличие от Console.Write
, Interaction.Msgbox
ничего не знает о string.Format
: Он просто отображает строку "как есть".
Начиная с C# версии 6, есть удобный способ:
Interaction.MsgBox($"Result:\n {tal1 * tal2}");
'$' Говорит компилятору обрабатывать {tal1 * tal2}
как выражение и вставить результат в строку. Подробнее об этой так называемой строковой интерполяции:
С интерполяцией строк, выражения в фигурных скобках
{}
также может быть оценено. Результат будет вставлен в соответствующее место в строке. Например, чтобы вычислить максимумfoo
а такжеbar
и вставьте его, используйтеMath.Max
в фигурных скобках:Console.WriteLine($"And the greater one is: { Math.Max(foo, bar) }");
Выход:
И больше: 42
Примечание. Любые начальные или конечные пробелы (включая пробел, табуляцию и CRLF/ символ новой строки) между фигурной скобкой и выражением полностью игнорируются и не включаются в выходные данные.
Для всех версий C# (особенно версий до C#6) вы можете сделать следующее:
Вместо того, чтобы вызывать string.Format
каждый раз, вы можете создать такую функцию, как
public Microsoft.VisualBasic.MsgBoxResult MsgBox(string msg, params object[] p)
{
var fmt = string.Format(msg, p);
var msgStyle = Microsoft.VisualBasic.MsgBoxStyle.OkOnly;
return Interaction.MsgBox(fmt, msgStyle, "Information");
}
Это можно использовать следующим образом:
var tal1=1; var tal2=2;
MsgBox("Hello!\nResult:{0}\n", (tal1 + tal2));
Примечание: это решение поддерживает не только {0}
, но также {1}, {2}, ...
потому что я использовал массив параметров. Следовательно, следующее тоже работает:
MsgBox("Calculation: {0} + {1} = {2}", tal1, tal2, (tal1+tal2));
какие выводы Calculation: 1 + 2 = 3
,
Вы можете прочитать здесь (в Microsoft) больше о Interaction.MsgBox
метод, как изменить стиль окна сообщения (например, как отображать кнопки Да / Нет / Отмена и о MsgBoxResult
значения возвращаются), так что вы можете адаптировать его к вашим потребностям.
Это полная программа, вы можете запустить ее в LinqPad или Visual Studio:
static void Main(string[] args)
{
var tal1=1; var tal2=2;
MsgBox("Hello!\nResult:{0}\n", (tal1 + tal2));
MsgBox("Calculation: {0} + {1} = {2}", tal1, tal2, (tal1+tal2));
}
public static MsgBoxResult MsgBox(string msg, params object[] p)
{
var fmt=string.Format(msg, p);
var msgStyle= Microsoft.VisualBasic.MsgBoxStyle.OkOnly;
return Interaction.MsgBox(fmt, msgStyle, "Information");
}
Не забудьте добавить ссылку на Microsoft.VisualBasic.dll
, используя пространство имен Microsoft.VisualBasic
для того, чтобы запустить этот пример.
Если вы используете LinqPad, щелкните правой кнопкой мыши, выберите "Свойства запроса...", затем добавьте dll в "Дополнительные ссылки" и пространство имен в "Импорт дополнительных пространств имен".
Console.WriteLine
имеет перегрузки, которые поддерживают string.Format
реализация типа.
http://msdn.microsoft.com/en-us/library/586y06yf%28v=vs.110%29.aspx
Как указано в комментариях, вам нужно будет использовать string.Format()
повторить это поведение для Interaction.MsgBox
,
Вы можете использовать метод строкового формата http://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx