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

问题描述 投票:0回答:4

如果我想在

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));
    }
}
c# linqpad
4个回答
5
投票

Interaction.MsgBox
接收一个字符串作为其第一个参数。如果你想格式化一个字符串,你必须自己做,并将格式化的字符串传递给
Interaction.MsgBox
:

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

另一方面,

Console.Write
是用重载编写的,允许在
Console.Write
内部执行格式化。


2
投票

这是因为与

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}, ...
,因为我使用了params数组。因此,以下内容也有效:

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,并在“其他命名空间导入”中添加命名空间。


1
投票

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

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

正如评论中所指出的,您将需要使用

string.Format()
来复制
Interaction.MsgBox
的行为。


© www.soinside.com 2019 - 2024. All rights reserved.