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

时间:2011-04-12 19:00:39

标签: c# string .net-3.5 string-interpolation

.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>
    ";

}

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

14 个答案:

答案 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)

答案 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而不是手动操作。