Почему я не могу использовать {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

Другие вопросы по тегам