10

.NET 3.5 C# では、+ 連結子 (または string.Format()) を使用しなくても、文字列変数内に変数を含めることができますか?

例(疑似では、 $ 記号を使用して変数を指定しています):

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

出力:

日付は 2011 年 4 月 12 日午前 11:56:39 です。

編集

string.Format() を示唆する少数の応答があるため、「 ...(または string.Format() 、さらに言えば) 」について言及したとき、元の投稿が明確ではなかったとしか思えません。明確にするために、私は string.Format() メソッドをよく知っています。ただし、私が取り組んでいる特定のプロジェクトでは、string.Format() は役に立ちません (実際には + 連結子よりも悪いです)。

また、私の質問の背後にある動機が何なのか疑問に思っている方も多いと思います (私の質問をそのまま読んでも同じように感じると思います)。

あなたが好奇心の強い人の一人なら、ここにその短いものがあります:

Windows CE デバイスで実行する Web アプリを作成しています。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>
    ";

}

ご覧のとおり、連結せずに変数を指定できるため、特にコンテンツのサイズが大きくなった場合に、少し簡単になります。

4

14 に答える 14

12

いいえ、残念ながら C# は PHP ではありません。
ただし、明るい面では、C# は PHP ではありません。

于 2011-04-12T19:06:13.737 に答える
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"
于 2011-04-12T20:38:00.847 に答える
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.
于 2014-05-08T11:56:21.297 に答える
3

いいえ、そうではありません。これを回避する方法はありますが、それらは目的を無効にします。あなたの例にとって最も簡単なことは

Console.WriteLine("The date is {0}", DateTime.Now);
于 2011-04-12T19:02:34.007 に答える
3
string output = "the date is $d and time is $t";
output = output.Replace("$t", t).Replace("$d", d);  //and so on
于 2011-04-12T19:03:27.077 に答える
2

短くて簡単な答えは: いいえ!

于 2011-04-12T19:04:56.177 に答える
0

いいえ、ただし、文字列インスタンスに拡張メソッドを作成して、入力を短くすることができます。

string s = "The date is {0}".Format(d);
于 2011-04-12T19:05:48.400 に答える
0

string.Format(および などの同様の書式設定関数StringBuilder.AppendFormat) は、柔軟性、コーディング方法、および (通常) パフォーマンスの観点から、これを行うための最良の方法です。

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

DateTime の表示形式を指定したり、複数のオブジェクトを文字列に挿入したりすることもできます。string.Format メソッドに関する MSDN のページを確認してください。

特定の型にはToString、フォーマット文字列を指定できるメソッドへのオーバーロードもあります。stringこのような形式や構文を指定できる拡張メソッドを作成することもできます。

于 2011-04-12T19:06:36.420 に答える
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();
于 2011-04-12T20:37:45.453 に答える
0
string.Format("The date is {0}", DateTime.Now.ToString())
于 2011-04-12T19:02:32.850 に答える
0

T4 テンプレート エンジンを使用するのはどうですか?

http://visualstudiomagazine.com/articles/2009/05/01/visual-studios-t4-code-generation.aspx

于 2011-04-12T19:43:02.963 に答える
0

C# 6.0以降"The title is \{title}"では、まさに必要なことを行う文字列を記述できます。

于 2014-12-01T13:08:25.660 に答える
-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 を活用するように人々に教えるのは十分に興味深いことです。

于 2011-04-12T19:04:24.727 に答える