c#字符串格式
我很好奇为什么我会使用字符串格式,而我可以使用连接,如
Console.WriteLine("Hello {0} !", name); Console.WriteLine("Hello "+ name + " !");
为什么选择第一个超过第二个?
你选的太简单了。
字符串格式:
- 允许您多次使用同一个变量:(
("{0} + {0} = {1}", x, 2*x)
- 在其参数上自动调用
ToString
🙁("{0}: {1}", someKeyObj, someValueObj)
- 允许您指定格式:(
("The value will be {0:3N} (or {1:P}) on {2:MMMM yyyy gg}", x, y, theDate)
- 允许您轻松设置填充:(
(">{0,3}<", "hi"); // ">hi <"
(">{0,3}<", "hi"); // ">hi <"
您可以稍后将字符串换成动态字符串。
例如:
// In a land far, far away string nameFormat = "{0} {1}"; // In our function string firstName = "John"; string lastName = "Doe"; Console.WriteLine(nameFormat, firstName, lastName);
在这里,您可以将nameFormat
更改为例如"{1}, {0}"
并且您无需更改任何其他代码。 通过连接,您需要编辑代码或可能复制代码以处理这两种情况。
这在本地化/国际化中很有用。
这个问题没有一个单一的正确答案。 您想要解决几个问题:
性能
您的示例(以及实际应用程序)中的性能差异很小。 如果您开始编写多个连接,您将逐渐看到使用格式化字符串的更好的内存性能。 请参阅Ben的回答
可读性
在格式化时,使用格式化字符串会更好,或者使用许多不同的变量进行字符串化:
string formatString = "Hello {0}, today is {1:yyyy-MM-dd}"; Console.WriteLine(formatString, userName, Date.Today);
可扩展性
你的情况将决定什么是最好的。 您告诉我,当您需要在日志中的用户名和时间之间添加项时,哪个更好:
Console.WriteLine( @"Error! Username: " + userName + " Time: " + time.ToString("HH:mm:ss") + " Function: " + functionName + " Action: " + actionName + " status: " + status + " ---");
要么
Console.WriteLine(@"Error! Username: {0} Time: {1} Function: {2} Action: {3} status: {4} ---", username, time.ToString("HH:mm:ss"), functionName, actionName, status);
结论
我会在大多数时候选择格式化的字符串…但是当它更容易时我会毫不犹豫地使用连接。
这取决于: http : //geekswithblogs.net/BlackRabbitCoder/archive/2010/05/10/c-string-compares-and-concatenations.aspx
字符串格式化允许您将格式字符串保持独立,并在需要的地方使用它而不必担心连接。
string greeting = "Hello {0}!"; Console.WriteLine(greeting, name);
至于为什么你会在确切的例子中使用它,你给了……习惯的力量,真的。
我认为一个很好的例子是关于i18n和l10n
如果你必须更改不同语言之间的字符串,这个:“bla”+ variable +“bla bla ..”如果你使用不同的语言,会给用于创建字符串的sobstitution的程序带来问题
而这样:“bla {0} blabla”很容易转换(你将得到{0}作为字符串的一部分)
由于其他成员在此解释的大多数原因,格式化通常是首选。 我想从简短的编程经验中引入更多的理由:
- 格式化将有助于生成文化感知字符串。
- 格式化比串联更高效。 请记住,每个连接操作都将涉及创建临时中间字符串。 如果你需要连接一堆字符串,最好使用String.Join或StringBuilder。
你正在使用一个微不足道的例子,没有太大的区别。 但是,如果你有一个包含许多参数的长字符串,那么能够使用格式字符串而不是许多+符号和换行符要好得多。
它还允许您根据需要格式化数字数据,即货币,日期等。
建议使用第一种格式。 它允许您为其他类型指定特定格式,例如显示hex值或显示某些特定的字符串格式。
例如
string displayInHex = String.Format("{0,10:X}", value); // to display in hex
它也更加一致。 您可以使用相同的约定来显示Debug语句。 例如
Debug.WriteLine (String.Format("{0,10:X}", value));
最后但并非最不重要的是,它有助于您的程序的本地化。
除了像Ignacio这样的原因之外,许多(包括我)发现基于String.Format
的代码更容易阅读和修改。
string x = String.Format( "This file was last modified on {0} at {1} by {2}, and was last backed up {3}." date, time, user, backupDate);
与
string x = "This file was last modified on " + date + " at " + time + " by " + user + " and was last backed up " + backupDate + ".";
我发现在重写实体类中的ToString()方法时,前一种方法(使用string.format)非常有用。
例如,在我的Product类中;
public override string ToString() { return string.format("{0} : {1} ({2} / {3} / {4}", this.id, this.description, this.brand, this.model); }
然后,当用户决定他们希望产品显示不同时,很容易更改返回的字符串的顺序/内容或布局。
当然你仍然将这个字符串连接在一起,但我觉得string.Format使整个事情更具可读性和可维护性。
我想这就是我给出的简短答案,不是它 – 冗长或复杂字符串的可读性和可维护性。
我认为这里的主要内容是可读性 。 因此,我总是选择每种情况下具有最佳可读性的内容。
注意:
使用C#6的字符串插值,您的代码可以简化为:
Console.WriteLine($"Hello {name}!");
我认为哪个比你提出的两个选择更好。
自几年前C#6发布以来,也可以执行字符串插值。 每个例子:
var n = 12.5847; System.Console.WriteLine(string.Format("Hello World! {0:C2}", n));
成为那样:
var n = 12.5847; System.Console.WriteLine($"Hello World! {n:C2}");
两者都给你这个结果:
Hello World! £12.58