Почему я не могу написать MessageBox.Show ("asdfasdf {0}", i) ;? - PullRequest
5 голосов
/ 10 ноября 2011
int i = 85; 
Console.WriteLine("My intelligence quotient is {0}", i);  // Kosher
MessageBox.Show("My intelligence quotient is {0}", i); // Not Kosher

Я нахожу это самым мучительным изнурительным.Один работает, а другой нет?Каков источник этого поведенческого несоответствия?Чем больше я думаю об этом, тем меньше могу себе представить, и непонимание слишком часто превращается в ненависть к себе.

Ответы [ 6 ]

9 голосов
/ 10 ноября 2011

Метод Show() просто не имеет надлежащей перегрузки.

Он был добавлен к Console.WriteLine для удобства, но не является неотъемлемой частью каждого метода .NET.

Длядля достижения того же эффекта используйте string.Format вручную:

MessageBox.Show(string.Format("asdfasdf{0}", i)); // Kosher
3 голосов
/ 10 ноября 2011

Console.Writeline имеет следующие перегрузки:

В частности, перегрузка , которая принимает строку формата и массив params .

Вот еще один похожий метод:

Я не знаю, почему MessageBox.Show не перегружен. Я предполагаю, что это потому, что уже есть так много других перегрузок для этого метода.

Но вы можете получить аналогичный эффект, добавив к нему string.Format:

public void ShowMessageBox(string format, params object[] args)
{
    MessageBox.Show(string.Format(format, args));
}

// ...

ShowMessageBox("You entered: {0}", someValue);
1 голос
/ 10 ноября 2011

Почему сложно сказать (это просто, как MS определил это), но если вы хотите написать «конгруэнтный» код для обоих случаев, тогда вы можете использовать string.Format - например, так:

MessageBox.Show (string.Format ("asdfasdf{0}", i));

или

Console.WriteLine (string.Format ("asdfasdf{0}", i)); // although this is unneccesary!
0 голосов
/ 10 ноября 2011

Или, если это так важно для вас, вы можете создать свой собственный класс и использовать его для той цели, которую вы уже просили:

 class myMessageBox
    {
        private myMessageBox()
        { }

        public static void Show(string text,params object[] i)
        {
            text = String.Format(text, i);
            MessageBox.Show(text);
        }
    }
0 голосов
/ 10 ноября 2011

Console.WriteLine, Debug.Print и т. Д. - это методы, которые намереваются принять строку, чтобы записать ее в определенное место. MessageBox.Show - это метод, который покажет пользователю модальное окно сообщения. Есть намного больше параметров для установки (например, заголовок, кнопки и т. Д.), Поэтому не имеет смысла принимать логику форматирования на этом этапе.

НТН

0 голосов
/ 10 ноября 2011

WriteLine() метод перегружен WriteLine (строковый формат, объект arg0) и MessageBox.Show() не имеет такой перегрузки. Вместо этого вам нужно использовать:

MessageBox.Show(string.Format("asdfasdf{0}", i));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...