.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()时,我的原始帖子不清楚)”。要清楚,我很清楚string.Format()方法。但是,在我正在处理的特定项目中,string.Format()对我没有帮助(它实际上比+连接器更差)。
另外,我推断大多数/你们都想知道我的问题背后的动机是什么(我想如果我按原样阅读我的问题,我会有同样的感受)。
如果你是一个好奇的人,这就是它的缺点:
我正在创建一个在Windows CE设备上运行的Web应用程序。由于Web服务器的工作原理,我在字符串变量中创建了整个网页内容(css,js,html等)。例如,我的.cs托管代码可能包含以下内容:
string GetPageData()
{
string title = "Hello";
DateTime date = DateTime.Now;
string html = @"
<!DOCTYPE html PUBLIC ...>
<html>
<head>
<title>$title</title>
</head>
<body>
<div>Hello StackO</div>
<div>The date is $date</div>
</body>
</html>
";
}
正如您所看到的,能够在不需要连接的情况下指定变量,使事情变得更容易 - 特别是当内容增加时。
答案 0 :(得分:12)
不,不幸的是C#不是PHP 但好的一面是,C#不是PHP。
答案 1 :(得分:8)
几乎用一种小的扩展方法。
static class StringExtensions
{
public static string PHPIt<T>(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"
答案 2 :(得分:3)
不,它没有。有很多方法可以解决这个问题。最简单的例子是
Console.WriteLine("The date is {0}", DateTime.Now);
答案 3 :(得分:3)
string output = "the date is $d and time is $t";
output = output.Replace("$t", t).Replace("$d", d); //and so on
答案 4 :(得分:3)
基于@JesperPalm的优秀答案,我找到了另一个有趣的解决方案,让您使用类似于普通string.Format
方法的类似语法:
public static class StringExtensions
{
public static string Replace<T>(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.
答案 5 :(得分:2)
简短的答案是:不!
答案 6 :(得分:0)
string.Format("The date is {0}", DateTime.Now.ToString())
答案 7 :(得分:0)
不,但您可以在字符串实例上创建一个扩展方法,以缩短输入时间。
string s = "The date is {0}".Format(d);
答案 8 :(得分:0)
string.Format
(以及类似的格式化函数,例如StringBuilder.AppendFormat
)是在灵活性,编码实践和(通常)性能方面做到这一点的最佳方式:
string s = string.Format("The date is {0}", d);
您还可以指定DateTime的显示格式,以及在字符串中插入多个对象。查看MSDN's page on the string.Format method。
某些类型的ToString
方法也有重载,允许您指定格式字符串。您还可以为string
创建一个扩展方法,允许您指定格式和/或解析语法。
答案 9 :(得分:0)
如何使用T4模板引擎?
http://visualstudiomagazine.com/articles/2009/05/01/visual-studios-t4-code-generation.aspx
答案 10 :(得分:0)
如果您只是想避免连接不可变字符串,那么您需要的是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();
答案 11 :(得分:0)
由于 C#6.0 ,您可以编写完全符合您需要的字符串"The title is \{title}"
。
答案 12 :(得分:0)
您可以使用C#文档中提到的类似方法。 字符串内插
string name = "Horace";
int age = 34;
Console.WriteLine($"He asked, \"Is your name {name}?\", but didn't wait for a reply :-{{");
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old.");
答案 13 :(得分:-1)
或合并:
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而不是手动操作。