C# 谈谈dynamic、var、object和泛型

目录

1.object

2.var

3.dynamic

4.泛型

5.区别


1.object

        万能对象:object只是个对象,是个强类型,在编译的时候确定类型了,只能用对象本身的方法属性等等 ,object想使用动态属性方法只能用反射。

2.var

        万能强类型。

3.dynamic

        动态类型:运行的时候才确定类型,dynamic可以定义成多个类型,并且可以不用过反射直接动态使用方法,属性等(说白了就是能随便点出来用,这点就是区别object的,object想使用动态属性方法只能用反射)。

4.泛型

泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。

的T是类型参数,起占位符的作用,编译时被真正类型取代。

泛型的特性:

  • 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
  • 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。

泛型的优点:

1.性能。减少装箱拆箱提高性能。

2.类型安全

3.消除强制类型转换

4.二进制代码重用

使用样例:

例1:
定义:
public class GenericList
{
    public void Add(T input)//T制定成类型参数
    public T Add()//T制定成返回值
}

使用泛型:
GenericList list1 = new GenericList();
GenericList list2 = new GenericList();
GenericList<类名> list3 = new GenericList<类名>();
GenericList<类名> list4= new GenericList<类名>();

以list1为例编译器生成以下的方法:
public void Add(int input)
public int Add()
例2:
有多个类型参数的泛型类:
public class 类名
泛型约束:
确保泛型类使用的参数是提供特定方法的类型。
public class GenericList where T : IEmployee 
假如IEmployee接口包含A方法,编译器会验证用于替换T的类型一定要实现IEmployee接口。
例3:
泛型方法:允许采取定义泛型类时采用的方式
//定义泛型方法
static void Swap(ref T lhs, ref T rhs)
{
    T temp; 
    temp = lhs; 
    lhs = rhs; 
    rhs = temp; 
}
//使用泛型方法 
public static void TestSwap()
{    
    int a=1,b=3;
    Swap(ref a,ref b);
    string s1="Hello",s2="world";
    Swap(ref s1,ref s2);
}

5.区别

var 和 js中的var作用是一样的,定义一个变量的类型,不需要明确定义类型是什么,编译器在源码编译期间根据变量的赋值自己识别类型,并直接改写替换成实际需要的类型;其本质就是个语法糖。

object其实就是.net中的所有对象的基类型。在c#中所有的类型都是对象,都是继承于object,就算int类型也可以装箱成object。

dynamic本质上就是个object类型,只不过在写源代码的时候不再进行类型检查,从而减少了类型转换的操作,实现了动态语言的特征。

关于object类型:
        1).object类型可以来引用任何类型的实例;
        2).object类型可以存储任何类型的值;
        3).可以定义object类型的参数;
        4).可以把object作为返回类型。
但是这样做有很大的问题:
        1).会因为程序员没有记住使用的类型而出错,造成类型不兼容;
        2).值类型和引用类型的互化即装箱拆箱使系统性能下降。

总结:
        用var请随意 ,符合代码规范即可;
        object和dynamic使用的时候要注意装箱和拆箱操作,尽量使用泛型规避。

你可能感兴趣的:(C# 谈谈dynamic、var、object和泛型)