[英]is there a C# equivalent for Python's self-documenting expressions in f-strings?
從 Python 3.8 開始,可以像這樣在 f 字符串中使用自記錄表達式:
>>> variable=5
>>> print(f'{variable=}')
variable=5
C# 中是否有等效功能?
不,但是你可以使用InterpolatedStringHandler
和CallerArgumentExpression
自己寫:
[InterpolatedStringHandler]
public ref struct SelfDocumentingStringHandler
{
StringBuilder builder;
public SelfDocumentingStringHandler(int literalLength, int formattedCount)
{
builder = new StringBuilder(literalLength);
}
public void AppendLiteral(string s)
{
builder.Append(s);
}
public void AppendFormatted<T>(T t, [CallerArgumentExpression(nameof(t))] string member = "")
{
builder.Append(member + "=");
builder.Append(t);
}
internal string GetFormattedText() => builder.ToString();
}
void Print(ref SelfDocumentingStringHandler stringHandler)
{
Console.WriteLine(stringHandler.GetFormattedText());
}
然后你可以像這樣使用它:
var variable = 5;
Print($"{variable}"); // prints: variable=5
是的。
int variable = 5;
Console.WriteLine($"variable={variable}");
輸出:
variable=5
這里的關鍵是字符串文字前面的$
。
要使用動態名稱來做你想做的事,我建議使用擴展方法的更明確的方法。 嘗試這個:
public static class SelfDocExt
{
public static string SelfDoc<T>(
this T value,
[CallerArgumentExpression(nameof(value))] string name = "")
=> $"{name}={value}";
}
然后你可以這樣寫:
int variable = 5;
Console.WriteLine($"{variable.SelfDoc()}");
它在不破壞字符串插值的情況下解決了您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.