如果我想在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));
}
}
答案 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.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
。
您可以阅读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)