C# ValueTuple 原理
2021-04-07 12:27
标签:private style -name object serialize com 特性 tom stl 本文告诉大家一些 ValueTuple 的原理,避免在使用出现和期望不相同的值。ValueTuple 是 C# 7 的语法糖,如果使用的 .net Framework 是 4.7 以前,那么需要使用 Nuget 安装 虽然 ValueTuple 的很好用,但是需要知道他有两个地方都是在用的时候需要知道他原理。如果不知道原理,可能就发现代码和预期不相同 先创建一个项目,然后安装 Json 解析,使用下面的代码,在运行之前,先猜一下,下面的代码会出现什么 实际上输出的是 那么刚才的命名在哪? 如果想知道,那么请看 ValueTuple 的原理 先来写一段代码,编译之后对他反编译,看一下他是怎么做的 不需要安装反编译软件,可以使用这个网站拿到反编译 可以看到Foo被编译为 TupleElementNames 特性的两个字符串 所以实际上代码是 IL 代码是 这个特性只有编译器可以用,不可以在代码使用。 在上面的解释,实际上 IL 不知道存在定义的命名,所以不可以通过这个方法获得值。 如果希望使用动态类型获得值,那么下面的代码实际上会运行出现异常 运行出现 RuntimeBinderException 异常,因为没有发现 实际上对比下面匿名类,也就是很差不多写法。 运行是可以的,所以在使用动态类型,请不要使用 ValueTuple ,如果需要使用,那么请知道有存在找不到变量异常,而且是在运行才出现异常。 不要随便定义一个看不懂的值 实际上下面的代码,编译是可以通过 但是这个值,在看的时候,几乎说不出他的属性 第二个需要知道的,ValueTuple 是值类型,所以他的默认值不是 null 而是 关于 ValueTuple 变量名的定义也是很难说的,有的小伙伴觉得需要使用 Axx 的方式命名,但是很多小伙伴觉得使用 aaBa 的命名更好,所以暂时对于他的命名,大家觉得什么方式好请告诉我 参见:Exploring Tuples as a Library Author C# 7: Dynamic types and Reflection cannot access Tuple fields by name 我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新 如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入 C# ValueTuple 原理 标签:private style -name object serialize com 特性 tom stl 原文地址:https://www.cnblogs.com/lindexi/p/csharp-valuetuple.htmlSystem.ValueTuple
json 转换
var foo = (name: "lindexi", site: "blog.csdn.net/lindexi_gd");
var str = JsonConvert.SerializeObject(foo);
{"Item1":"lindexi","Item2":"blog.csdn.net/lindexi_gd"}
原理
static void Main(string[] args)
{
var foo = Foo();
var str = JsonConvert.SerializeObject(foo);
Console.WriteLine(str);
}
static (string name, string site) Foo()
{
return (name: "lindexi", site: "blog.csdn.net/lindexi_gd");
}
[return: TupleElementNames(new string[]
{
"name",
"site"
})]
private static ValueTuple
ValueTuple
不是刚才定义的代码,只是通过 TupleElementNames 让编译器知道值,所以是语法糖。private hidebysig static valuetype [mscorlib]System.ValueTuple`2
动态类型获得值
static void Main(string[] args)
{
dynamic foo = Foo();
Console.WriteLine(foo.name);
}
static (string name, string site) Foo()
{
return (name: "lindexi", site: "blog.csdn.net/lindexi_gd");
}
name
属性 dynamic foo = new { name = "lindexi", site = "blog.csdn.net/lindexi_gd" };
Console.WriteLine(foo.name);
其他需要知道的
(int x, (int y, (float a, float b))[] c) f1
default(xx)
,在C# 7.2 支持使用关键字,所以不需要去写 defalut(xx,xx)
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。