目录
一、诞生
framework 3.0版本开始支持匿名类
二、普通类的实例化
普通类型实例化之后,可以访问其中的属性和方法
/// <summary>
/// 普通类
/// </summary>
public void InstacePerson()
{
Console.WriteLine("=========================普通类=====================");
//通常实例化对象都是如下
Person person = new Person()
{
Id = 1,
Name = "张三"
};
//如此以来,我们还可以获取实例对象的属性和修改属性值
Console.WriteLine(person.Name);
person.Name = "李四";
Console.WriteLine(person.Name);
//还可以访问实例方法
person.Hello();
}
三、object匿名类
1、优点
- 同样可以声明任何属性
2、缺点
- 不能访问其中的属性
3、思考
为什么明明声明了Id属性,但是为什么访问不到呢?
因为C#强类型语言,object是在编译时确定类型,上面的匿名类会被编译器认为是object类型,但是众所周知object实际上没有该属性,所以编译器不允许获取
/// <summary>
/// object匿名类
/// </summary>
public void InstanceObject()
{
Console.WriteLine("=========================object匿名类=====================");
//object匿名类的实例化如下,同样可以指定任何属性
object model = new
{
Id = 1,
Name = "张三",
Age = 30
};
//用object接收匿名类,缺点在于不能访问其中的属性
//Console.WriteLine(model.Id); //这是访问不到的,会报错
//思考:为什么明明声明了Id属性,但是为什么访问不到呢?
//因为C#强类型语言,object是在编译时确定类型,上面的匿名类会被编译器认为是object类型,但是众所周知object实际上没有该属性,所以编译器不允许获取
}
四、动态类型匿名类
1、优点
- 同样可以指定任何属性
- 不仅可以访问其中的属性,还可以给属性赋值
2、缺点
- 只能访问和修改已经声明的属性,若访问未声明的属性运行时就会报错
3、思考
为什么呢?动态类型和object的区别在于哪里?
因为动态类型dynamic试运行时确定类型,所以它可以避开编译器的检查,当程序运行时,就会确定类型,然后检查是否能够访问到相关的属性,如果访问未声明的属性就会报错(因为根本就找不到)
/// <summary>
/// 动态类型匿名类
/// </summary>
public void InstanceDynamic() {
Console.WriteLine("=========================动态类型匿名类=====================");
//动态类型匿名类的实例化如下,同样可以指定任何属性
dynamic model = new
{
Id = 1,
Name = "张三",
Age = 30
};
//动态类型匿名类不经可以访问其中的属性,还可以给属性赋值
Console.WriteLine(model.Id);
model.Name = "李四";
//但是他只能访问和修改已经声明的属性,若访问未声明的属性就会报错
Console.WriteLine(model.Gender);
//思考:为什么呢?动态类型和object的区别在于哪里?
//因为动态类型dynamic试运行时确定类型,所以它可以避开编译器的检查,当程序运行时,就会确定类型,然后检查是否能够访问到相关的属性,如果访问未声明的属性就会报错(因为根本就找不到)
}
五、弱类型(不确定类型)匿名类
1、优点
- 同样可以指定任何属性
- 弱类型可以访问其中存在的属性(只读)
2、缺点
- 不能修改属性
- var类型必须有初始值,不能为null,因为var 本来就不知道是什么类型,所以,如果右边也是null,那编译器就不可能推算出其具体类型
- var也不允许作为参数类型,原因如上
- 代码可读性差(对性能无影响)
3、思考
var与dynamic和object的区别?
var其实是一个语法糖,编译器可以通过等号右边的类型自动推断出实际类型
4、使用场景
- 配合匿名类使用
- 声明复杂类型的时候可以使用var(可以偷懒,不用知道其具体类型)
- 在不知道具体的类型的时候可以用var
/// <summary>
/// 弱类型(不确定类型)匿名类(var)
/// </summary>
public void InstanceVar()
{
Console.WriteLine("=========================弱类型(不确定类型)匿名类=====================");
//动态类型匿名类的实例化如下,同样可以指定任何属性
var model = new
{
Id = 1,
Name = "张三",
Age = 30
};
//弱类型可以访问其中存在的属性(只读)
Console.WriteLine(model.Id);
//但是不能修改属性
//model.Name = "李四";
//var 类型必须有初始值,不能为null,因为var 本来就不知道是什么类型,所以,如果右边也是null,那编译器就不可能推算出其具体类型,下面两种都不行
//var a = null;
//var b;
//var也不允许作为参数类型,原因如上
//void Test(var i) { }
//思考:var与dynamic和object的区别?
//var其实是一个语法糖,编译器可以通过等号右边的类型自动推断出实际类型
/**
* var的使用场景:
* 1、配合匿名类使用
* 2、声明复杂类型的时候可以使用var(可以偷懒,不用知道其具体类型)
* 3、在不知道具体的类型的时候可以用var
*
* 缺点:
* 代码可读性差(对性能无影响)
*/
}