C#匿名类型对象分析

 

  • 摘要:这里介绍C#匿名类型对象,在很多情况下,我们需要一种能够临时将一批具有一定关联的数据存放起来的对象;或者在某些情况下,我们对仅一个对象的“形状”(如属性的名字和类型等)比较感兴趣。
  • -

    学习C#语言时,经常会遇到C#匿名类型对象问题,这里将介绍C#匿名类型对象问题的解决方法。

    C#匿名类型对象

    在很多情况下,我们需要一种能够临时将一批具有一定关联的数据存放起来的对象;或者在某些情况下,我们对仅一个对象的“形状”(如属性的名字和类型等)比较感兴趣。例如前面我们提到的Book,当它和其他商品放在一起进行查询时,我们可能仅对其名称和价格感兴趣,并且希望将这两种属性放在另外一个单独的临时对象中以备今后使用。这时,我们关注的仅仅是这个临时对象具有Name和Price的属性感兴趣,至于它究竟是什么类型就无关紧要了。然而,为了使这样一个对象得以存在,我们不得不为这个无关紧要的类型写上一大堆“样本代码”,无非就是定义一个如BookAsGood的类,其中无非也就是形如 m_name和m_price的私有域和名为Name与Price的公共可读写方法。

    而在C# 3.0中,我们无须为这些无关紧要的类型浪费时间。通过使用“匿名类型”,只要在需要一个这样的对象时使用没有类型名字的new表达式,并用前面提到的对象初始化器进行初始化即可。如:

  1. var b1 = new { Name = "The First Sample Book"Price = 88.0f };  
  2. var b2 = new { Price = 25.0f, Name = "The Second Sample Book" };  
  3. var b3 = new { Name = "The Third Sample Book"Price = 35.00f };  
  4.  
  5. Console.WriteLine(b1.GetType());  
  6. Console.WriteLine(b2.GetType());  
  7. Console.WriteLine(b3.GetType()); 

    首先,前面三行声明并初始化了三个具有C#匿名类型对象,它们都将具有公共可读写属性Name和Price。我们可以看到,匿名类型的属性连类型都省掉了,完全是由编译器根据相应属性的初始化表达式推断出来的。这三行称作“C#匿名类型对象初始化器”,编译器在遇到这样的语句时,首先会创建一个具有内部名称的类型(所谓的“匿名”只是源代码层面上的匿名,在最终编译得到的元数据中还是会有这样一个名字的),这个类型拥有两个可读写属性,同时有两个私有域用来存放属性值;然后,和对待对象初始化器一样,编译器产生对象声明代码,并依次为每个属性赋值。

    上面代码的最后三行用来检验匿名类型在运行时的类型,如果尝试编译并运行上述代码,会得到类似下面的输出:

  1. lover_P.CSharp3Samples.Ex03.Program+<Projection>f__0  
  2. lover_P.CSharp3Samples.Ex03.Program+<Projection>f__1  
  3. lover_P.CSharp3Samples.Ex03.Program+<Projection>f__0 

    这表明编译器的确为C#匿名类型对象创建了实际的类型,并且该类型在代码中是不可访问的,因为类型的名字不符合C#语言命名规则(其中出现了+、<、>等非法字符)。

    另外,我们还发现一个有趣的现象,由于b1和b2在初始化的时候其属性的顺序和推断出来的类型完全一致,它们的运行时类型也是一样的;而b2因为属性出现的顺序不同于另外两个对象,因此具有不同的运行时类型。通过下面的代码,我们可以验证这一事实:

  1. // 正确的赋值,b1和b3具有相同的类型  
  2. b1 = b3;  
  3.  
  4. // 错误的赋值,b1和b2的类型不同  
  5. b1 = b2;  
  6.  
  7. //如果尝试编译这段代码,对于第二个赋值我们会得到一条编译错误
  8. Cannot implicitly convert type ’lover_P.CSharp3Samples.Ex03.Program.
  9. <Projection>f__1’ to ’lover_P.CSharp3Samples.Ex03.Program.
  10. <Projection>f__0’。 

    这实际上是C# 3.0编译器固有的特性,在同一个程序集中,编译器将为属性出现顺序和类型完全相同的C#匿名类型对象生成唯一的一个类型。而一旦属性的出现顺序或类型有所不同,编译器就会生成不同的类型。另外,在两个程序集之中,即使属性出现的顺序和类型一致,编译器也可

内容概要:该PPT详细介绍了企业架构设计的方法论,涵盖业务架构、数据架构、应用架构和技术架构四大核心模块。首先分析了企业架构现状,包括业务、数据、应用和技术四大架构的内容和关系,明确了企业架构设计的重要性。接着,阐述了新版企业架构总体框架(CSG-EAF 2.0)的形成过程,强调其融合了传统架构设计(TOGAF)和领域驱动设计(DDD)的优势,以适应数字化转型需求。业务架构部分通过梳理企业级和专业级价值流,细化业务能力、流程和对象,确保业务战略的有效落地。数据架构部分则遵循五大原则,确保数据的准确、一致和高效使用。应用架构方面,提出了分层解耦和服务化的设计原则,以提高灵活性和响应速度。最后,技术架构部分围绕技术框架、组件、平台和部署节点进行了详细设计,确保技术架构的稳定性和扩展性。 适合人群:适用于具有一定企业架构设计经验的IT架构师、项目经理和业务分析师,特别是那些希望深入了解如何将企业架构设计与数字化转型相结合的专业人士。 使用场景及目标:①帮助企业和组织梳理业务流程,优化业务能力,实现战略目标;②指导数据管理和应用开发,确保数据的一致性和应用的高效性;③为技术选型和系统部署提供科学依据,确保技术架构的稳定性和扩展性。 阅读建议:此资源内容详尽,涵盖企业架构设计的各个方面。建议读者在学习过程中,结合实际案例进行理解和实践,重点关注各架构模块之间的关联和协同,以便更好地应用于实际工作中。
资 源 简 介 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系, 详 情 说 明 独立分量分析(Independent Component Analysis,简称ICA)是近二十年来逐渐发展起来的一种盲信号分离方法。它是一种统计方法,其目的是从由传感器收集到的混合信号中分离相互独立的源信号,使得这些分离出来的源信号之间尽可能独立。它在语音识别、电信和医学信号处理等信号处理方面有着广泛的应用,目前已成为盲信号处理,人工神经网络等研究领域中的一个研究热点。 本文简要的阐述了ICA的发展、应用和现状,详细地论述了ICA的原理及实现过程,系统地介绍了目前几种主要ICA算法以及它们之间的内在联系,在此基础上重点分析了一种快速ICA实现算法一FastICA。物质的非线性荧光谱信号可以看成是由多个相互独立的源信号组合成的混合信号,而这些独立的源信号可以看成是光谱的特征信号。为了更好的了解光谱信号的特征,本文利用独立分量分析的思想和方法,提出了利用FastICA算法提取光谱信号的特征的方案,并进行了详细的仿真实验。 此外,我们还进行了进一步的研究,探索了其他可能的ICA应用领域,如音乐信号处理、图像处理以及金融数据分析等。通过在这些领域中的实验和应用,我们发现ICA在提取信号特征、降噪和信号分离等方面具有广泛的潜力和应用前景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值