为什么我在写MsgBox时不能使用{0}?

时间:2014-03-21 11:07:38

标签: c#

如果我想在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 个答案:

答案 0 :(得分:5)

Interaction.MsgBox收到一个字符串作为其第一个参数。如果要格式化字符串,则必须自己执行此操作,并将格式化的字符串传递给Interaction.MsgBox

Interaction.MsgBox(string.Format("Hello!\nResult:{0}\n", (tal1 + tal2)));

另一方面,Console.Write编写了重载,允许在Console.Write内执行格式化。

答案 1 :(得分:2)

这是因为与Console.Write不同,Interaction.Msgboxstring.Format一无所知:它只是显示字符串“按原样”。


C#版本6 以来,有一种舒适的方式:

 Interaction.MsgBox($"Result:\n {tal1 * tal2}");

'$'告诉编译器将{tal1 * tal2}视为表达式并将结果插入到字符串中。关于这个所谓的字符串插值的更多细节:

  

使用字符串插值,花括号{}中的表达式可以   也被评估。结果将插入相应的   字符串中的位置。例如,要计算最大值   foobar并插入,在卷曲中使用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}, ...,因为我使用了params数组。因此,以下工作也是如此:

MsgBox("Calculation: {0} + {1} = {2}", tal1, tal2, (tal1+tal2));

输出Calculation: 1 + 2 = 3

您可以阅读here (at 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,并在“其他命名空间导入”中添加名称空间。

答案 2 :(得分:1)

Console.WriteLine有一个重载,支持string.Format类型的实现。

http://msdn.microsoft.com/en-us/library/586y06yf(v=vs.110).aspx

正如评论中所指出的,您需要使用string.Format()来复制Interaction.MsgBox的行为。

答案 3 :(得分:0)