是否可以在不使用连接符的情况下在字符串变量中包含C#变量?

.NET 3.5 C#允许我们在字符串变量中包含变量而不必使用+ concatenator(或string.Format())。

例如(在伪,我使用$符号来指定变量):

DateTime d = DateTime.Now; string s = "The date is $d"; Console.WriteLine(s); 

输出:

日期是4/12/2011 11:56:39 AM

编辑

由于提示string.Format()的一些响应,我只能假设当我提到“ …(或string.Format(),就此而言)时,我的原始post不清楚”。 要清楚,我很清楚string.Format()方法。 但是,在我正在处理的特定项目中,string.Format()对我没有帮助(它实际上比+连接器更糟)。

另外,我推断大多数/你们都想知道我的问题背后的动机是什么(我想如果我按原样阅读我的问题,我会有同样的感受)。

如果你是一个好奇的人,这就是它的缺点:

我正在创建一个在Windows CE设备上运行的Web应用程序。 由于Web服务器的工作原理,我在字符串变量中创建了整个网页内容(css,js,html等)。 例如,我的.cs托管代码可能有这样的东西:

 string GetPageData() { string title = "Hello"; DateTime date = DateTime.Now; string html = @"    $title   
Hello StackO
The date is $date
"; }

正如您所看到的,能够在不需要连接的情况下指定变量,使事情变得更容易 – 尤其是当内容增加时。

几乎用一种小的扩展方法。

 static class StringExtensions { public static string PHPIt(this string s, T values, string prefix = "$") { var sb = new StringBuilder(s); foreach(var p in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)) { sb = sb.Replace(prefix + p.Name, p.GetValue(values, null).ToString()); } return sb.ToString(); } } 

现在我们可以写:

 string foo = "Bar"; int cool = 2; var result = "This is a string $foo with $cool variables" .PHPIt(new { foo, cool }); //result == "This is a string Bar with 2 variables" 

不,不幸的是C#不是PHP。
但好的一面是,C#不是PHP。

不,它没有。 有很多方法可以解决这个问题。 最简单的例子是

 Console.WriteLine("The date is {0}", DateTime.Now); 
 string output = "the date is $d and time is $t"; output = output.Replace("$t", t).Replace("$d", d); //and so on 

根据@JesperPalm的优秀答案,我找到了另一个有趣的解决方案,让你使用类似于普通string.Format方法的类似语法:

 public static class StringExtensions { public static string Replace(this string text, T values) { var sb = new StringBuilder(text); var properties = typeof(T) .GetProperties(BindingFlags.Public | BindingFlags.Instance) .ToArray(); var args = properties .Select(p => p.GetValue(values, null)) .ToArray(); for (var i = 0; i < properties.Length; i++) { var oldValue = string.Format("{{{0}", properties[i].Name); var newValue = string.Format("{{{0}", i); sb.Replace(oldValue, newValue); } var format = sb.ToString(); return string.Format(format, args); } } 

这使您可以添加常用格式:

 var hello = "Good morning"; var world = "Mr. Doe"; var s = "{hello} {world}! It is {Now:HH:mm}." .Replace(new { hello, world, DateTime.Now }); Console.WriteLine(s); // -> Good morning Mr. Doe! It is 13:54. 

简短而简单的答案是:不!

 string.Format("The date is {0}", DateTime.Now.ToString()) 

不,但您可以在字符串实例上创建扩展方法以缩短输入。

 string s = "The date is {0}".Format(d); 

string.Format (以及类似的格式化函数,如StringBuilder.AppendFormat )是在灵活性,编码实践和(通常)性能方面做到这一点的最佳方法:

 string s = string.Format("The date is {0}", d); 

您还可以指定DateTime的显示格式,以及在字符串中插入多个对象。 查看有关string.Format方法的MSDN页面 。

某些类型的ToString方法也有重载,允许您指定格式字符串。 您还可以为string创建扩展方法,以允许您指定格式和/或解析语法。

如果您只是想避免连接不可变字符串,那么您正在寻找的是StringBuilder 。

用法:

 string parameterName = "Example"; int parameterValue = 1; Stringbuilder builder = new StringBuilder(); builder.Append("The output parameter "); builder.Append(parameterName); builder.Append("'s value is "); builder.Append(parameterValue.ToString()); string totalExample = builder.ToString(); 

C#6.0开始,您可以编写字符串"The title is \{title}" ,它可以完全满足您的需求。

或者合并:

 Console.WriteLine("The date is {0}", DateTime.Now); 

额外信息(回应BrandonZeider ):

是的,这对于人们来说很重要,因为他们意识到自动完成字符串转换。 手动添加ToString已损坏,例如:

 string value = null; Console.WriteLine("The value is '{0}'", value); // OK Console.WriteLine("The value is '{0}'", value.ToString()); // FAILURE 

而且,一旦你意识到字符串化不等于使用.ToString() ,这就变得不那么简单了。 您可以使用格式说明符,甚至是自定义格式格式提供程序……有趣的是教人们利用String.Format而不是手动执行。