06-02 C# 匿名类

25 篇文章 2 订阅

一、诞生

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
     * 
     * 缺点:
     * 代码可读性差(对性能无影响)
     */
}

六、本文代码

C#匿名类

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值