gpt4 book ai didi

c#:插入字符串以打印输出变量名称和值

转载 作者:行者123 更新时间:2023-12-05 04:20:34 27 4
gpt4 key购买 nike

在 C# 中是否有更短的方法来打印变量名及其值?我现在做的是:

int myvar = 42;
Console.WritelLine($"{nameof(myvar)}={myvar}"); // or any other log function
//myvar=42

(我最近经常使用 Python,并且非常喜欢 pythons f"{myvar=}",它正是这样做的。)

谢谢你的帮助

最佳答案

是与否。

不,您不能像 Python 那样简单地捕获局部变量名。

...但是可以通过使用 CallerArgumentExpression 的辅助方法来实现- 这确实需要 C# 10.0 和 .NET 6+ - 您还需要添加 [assembly: EnableCallerArgumentExpression]在你的AssemblyInfo.cs .

像这样:

public static class MyExtensions
{
public static String Dump<T>( this T value, [CallerArgumentExpression(nameof(value))] String? name = null )
{
String valueAsText;
if( value == null )
{
valueAsText = "null";
}
else if( value is IEnumerable e ) // Can't use IEnumerable<T> (unless you use MethodInfo.MakeGenericMethod, which is overkill)
{
valueAsText = "{ " + e.Cast<Object?>().Select( i => i?.ToString() ).StringJoin() + " }";
}
else
{
valueAsText = '"' + value.ToString() + '"';
}

name = name ?? "(Unnamed expression)";

return name + " := " + valueAsText;
}

public static String StringJoin( this IEnumerable<String?> collection, String separator = ", " )
{
return String.Join( separator: separator, collection.Select( s => s is null ? "null" : ( '"' + s + '"' ) ) );
}
}

Dump<T>上面的方法是通用的(超过 T )而不是使用 this Object? value避免不必要的装箱 value什么时候T是一个值类型。

这样使用:

int myvar = 42;
Console.WriteLine( myvar.Dump() );
// myvar := "42"

Int32?[] arr = new[] { 1, 2, 3, (Int32?)null, 5 };
Console.WriteLine( arr.Dump2() );
// arr := { "1", "2", "3", null, "5" }

截图证明:

enter image description here

(我不得不在上面的截图中将其命名为 Dump2,因为 Dump 已经由 Linqpad 定义)。

关于c#:插入字符串以打印输出变量名称和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74435367/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com