ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#中的匿名类型

2022-08-14 19:03:58  阅读:168  来源: 互联网

标签:name C# 匿名 类型 new 方法 我们 Select


    这节来讲一下C#中的匿名类型。

匿名类

    在C#中,我们可以不去显示的声明一个类,而是通过匿名类去临时声明一个类结构去帮助我们去完成一些功能。

    声明一个匿名类,我们可以像下面这样做:

var Anonymous=new {name="charles",year=18};//声明匿名类对象

  需要注意的是,匿名类成员只能声明公共的只读属性,不能在匿名类中声明方法,因此匿名类的作用主要是承载类的数据,而非类的行为,也就是方法。由匿名类型实例化的对象则被成为匿名对象,匿名对象使用var关键字标识。比如说解析一条JSON数据,我们完全可以通过匿名类的形式去获取我们想得到的数据,请看如下代码:

string json = " { \"name\":\"charles\" , \"year\":18 ,\"address\":"shandong"}";
var jsonObj = JsonConvert.DeserializeAnonymousType(json, new
        {
            name = string.Empty,
            year = 0
        });
Console.WriteLine($"name is {jsonObj.name},year is {jsonObj.year}");
  这段代码使用了Newtonsoft.Json中的一个JSON转换方法,该方法可以将一条JSON转换为我们指定的匿名对象。如果没有匿名对象,我们需要创建一个类,去为了转换这一JSON,但是使用匿名类就简单许多,而且实际上我们只需要关注我们需要的属性即可,至于JSON中的其它对象,我们可以一概丢弃。   除此以外,我们在使用Linq方法Select()的使用,也可以用匿名类型:
//class AnonymousTemp
//{
//    public int Id { get; set; }
//    public string Name { get; set; }
//    public int Year { get; set; }
//}
List<AnonymousTemp>= new List<AnonymousTemp>();
list.Add(new AnonymousTemp() { Id = 1, Name = "Charles", Year = 18 });
list.Add(new AnonymousTemp() { Id = 2, Name = "Chiron", Year = 18 });
var aList = list.Select(u => new
        {
            id = u.Id,
            name = u.Name
        });

foreach (var item in aList)
{
    Console.WriteLine($"name is {item.id},year is {item.name}");
}

     比如我们查到一组集合,我们只关心其中的几个属性(当然如果只需要取一个属性,则不需要匿名类,直接返回该属性值就可以了),就可以使用匿名类型。上述代码中 Select方法的参数,接受一个委托,也就引出了匿名方法,但是这个地方我用的并不是匿名方法,而是Lambda表达式,我们接着讲。

匿名方法(仅作了解)

    Select方法需要一个委托类型的参数,我们可以直接向里传入一个方法,传统的操作需要我们自己声明一个符合要求的委托,并且为这个委托传入方法,将这个委托作为参数传入Select方法中,但是后来为了简化操作,在C#2.0推出了匿名委托,匿名委托的结构为:

delegate (参数){//方法体}

  这样上述Select方法用匿名方法的形式可以改写为如下形式:

var aList = list.Select(delegate (AnonymousTemp u)
{
    return new
    {
        id = u.Id,
        name = u.Name
    };
});

    这样看似是简单了许多,但是为了更加简单,在C#3.0微软推出了Lambda表达式,是对于匿名方法的进一步简化,从对比中我们也可以看出,Lambda表达式写起来要更爽一些。因此大家对于匿名方法可以仅做了解,而应该着重了解Lambda表达式的使用。

真的匿名?

    匿名方法真的匿名吗?为此,我们可以反编译一下这个项目,就能看到,无论是匿名类还是匿名方法,编译器在编译时都会为我们创建一个类,虽然我们写的少的,但编译器并没有少做:

    下图是编译器解析匿名类,为我们生成的真正的类代码:

    下图是编译器解析匿名方法和Lambda表达式,为我们生成的一个类,这个类里边是两个方法,分别对应我写的匿名方法和Lambda表达式,我们可以看出它们最终都被编译为一个委托:

    但尽管如此,匿名类或者匿名方法也只能在其所在的上下文中使用,并不能跨作用域访问。

 

 

 

 

 

 

 

标签:name,C#,匿名,类型,new,方法,我们,Select
来源: https://www.cnblogs.com/charlesmvp/p/16586015.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有