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