如果我想在
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));
}
}
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}, ...
,因为我使用了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,并在“其他命名空间导入”中添加命名空间。
Console.WriteLine
有一个重载,支持 string.Format
类型实现。
http://msdn.microsoft.com/en-us/library/586y06yf(v=vs.110).aspx
正如评论中所指出的,您将需要使用
string.Format()
来复制 Interaction.MsgBox
的行为。