前言
JS为什么适合处理前端的数据,是因为前端的数据特点是动态的。比如我今天想传3个参数,后天想传5个参数,大后天我想把字段名Age改成age。这都支持。这就是动态语言的特点,特点就是修改起来极其方便,数据类型是在编译的时候才确定的。但是也有许多问题。
- 动态语言在传入的时候根本不知道传入的值是什么。
- 需要极其严格的代码规范,明确传入的值的类型。
- 动态语言是一直在编译代码的类型
- 相对于静态语言来说,效率极低。所以动态语言不适合高性能场景。
- 动态语言难以有完整的代码提示
- 虽然现在编译器有了很强大的代码提示,但是还是会出错。因为你根本不知道传入的参数是什么。
我最近在B站上面看到了这篇教程,太厉害了。
C#基础教程 ValueTuple元组 VS 匿名类型, 最佳临时类型花落谁家?
匿名对象
先说一下匿名对象,匿名对象出来的比较早。虽然是比较好的临时变量,但是还是有很多问题。
//匿名对象的声明
var MyObj = new
{
Name= "啦啦",
Age= 1,
Sex2= "女"
};
- 在函数中无法入参出参。只能转化为obj。因为是匿名的,所以你没办法使用类名,因为根本不存在
- 动态匿名dynamic完全没有代码提示,极其容易出问题。失去了静态语言的优雅
- obj转匿名对象只能用反射
详细比较请看该Up主的视频
C#基础教程 ValueTuple元组 VS 匿名类型, 最佳临时类型花落谁家?
简单来说就是元祖完胜匿名对象。
元祖
元祖完美解决了这些问题。而且能轻易的入参出参
元祖声明
使用()而不是{}。而且不需要new 。里面的元素用:(冒号)赋值
var MyObj = (
Name : "啦啦",
Age : 1,
Sex : "女"
);
而且有代码提示
元祖函数入参和出参
//入参:
public static void Print((string Name, int Age, string Sex) myObj)
{
}
//出参
public static (string,int,string) Print()
{
return ("a",1,"b");
}
和obj互转
var MyObj = (
Name : "啦啦",
Age : 1,
Sex : "女"
);
object temp = MyObj;
MyObj = ((string Name, int Age, string Sex))temp;
//这样也没关系。只有个数,类型和顺序对应即可
MyObj = ((string Name2, int Age3, string Sex4))temp;
注意,这里的Name只是字段名,相当于别名。元祖是数值类型和顺序强匹配,字段值不相等也没关系。
结论
元祖实在的太厉害了。既保留了C#的静态优势,又添加了动态语言的随心所欲。简单来说,元祖就是一obj的列表,并不是一个类。但是微软给我们简化了语法,大大提高了开发的顺序。