深入了解c# 匿名类型

一、什么叫做匿名类?

  匿名类就是没有名字的类。匿名类不能被引用,只能再创建的时候用new语句来声明。

二、匿名类的优势以及应用场景;

  1、匿名类型提供了一种方便的方法,可以用来将一组只读属性封装到单个的对象中,而且并不需要首先显示定义一个类型。

  2、类型名由编译器生成,并且不能在源代码级使用。每个属性的类型由编译器推断。

  3、可通过是用new运算符和对象初始值创建匿名类型。

  4、匿名类型通常用在查询表达式的 Select 子句中,以便返回原序列中每个对象的属性子集(Linq 中使用的比较多)。

三、匿名类的应用; 

//匿名类型
var news = new {title="冰红茶",day="2019-4-10",author="康师傅"};
showInfo(news);
//
static void ShowInfo<T>(T news)
{
  dynamic d = news;
  Console.WriteLine(d.title);
  Console.WriteLine(d.day);
  Console.WriteLine(d.author);
}

四、var隐式类型;

  隐式类型var,声明变量是无需指定数据类型的,编译器会根据赋值判断其类型的一种机制,它的优势就在于,通过var这个隐式类型,可以提高开发人员的开发效率,很多时候可以不考虑对象的类型。

五、var 的使用规则;

  1、var 类型会被编译器根据初始值的类型推断出具体的类型;

  2、var 类型的局部变量必须赋予初始值;

  3、无法将null赋值给隐式类型的局部变量;

  4、var 类型变量的定义必须是在方法中或者在属性get、set 访问器中;

  5、var 不能做方法的参数;

  6、不能当作返回值类型;

  7、语句中只能声明一次变量,声明后不能更改类型;

六、匿名方法;

  匿名方法是C#2.0引入的一个新的特性,它允许开发者内联(inline)声明自己的函数代码而无须使用委托函数(delegate function)。

  匿名方法的应用场景:

            1、需要一个临时方法,这个方法使用次数极少;

            2、这个方法的代码很短,甚至可能比方法声明都短的情况下使用;

七、匿名方法的实例:

/*匿名方法的演化过程*/MySumHandler m1 = new MySumHandler(Sum);
m1(2,3);
MySumHandler m2 = Sum;
m2(3,4);

//匿名方法,C#2.0
MySumHandler m3 = delegate(int i, int j){Console.WriteLine("{0}+{1}={2}",i,j,(i+j));};
m3(5,6);

//lambda,表达式C#3.0
MySumHandler m4 = (i,j)=>{Console.WriteLine("{0}+{1}={2}",i,j,(i+j));};

八、Func和Action的使用:

  Func<TResult>和Action<T>是.NET的内置委托。Func<TResult>要求由返回值。Action<T>要求无返回值。

  在使用时,Func<T1,T2,……,T16,TResult>中尖括号中的最后一个类型就是返回值。

  Action<T1,T2,……,T16>,T1 至 T16 是参数。

以上就是深入了解c# 匿名类型的详细内容,更多关于C# 匿名类型的资料请关注我们其它相关文章!

(0)

相关推荐

  • c#基础知识---委托,匿名函数,lambda

    前言: C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.委托(Delegate)特别用于实现事件和回调方法.所有的委托都派生自 System.Delegate 类.把一个方法当作参数传递,让其它方法进行调用执行. 1.委托的声明 委托声明决定了可由该委托引用的方法.委托可指向一个与其具有相同标签的方法. 1.1.delegate 1.1.1. 0-23个参数,可以有返回值也可以没有返回值 public d

  • 深入讲解C#编程中嵌套类型和匿名类型的定义与使用

    嵌套类型 在类或结构内部定义的类型称为嵌套类型.例如: class Container { class Nested { Nested() { } } } 不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public.protected internal.protected.internal 或 private.在上面的示例中,Nested 对外部类型是不可访问的,但可以设置为 public,如下所示: class Container { public class N

  • C#中LINQ多条件JOIN时为什么可以使用匿名类

    前言 本文主要介绍的是关于C#中LINQ多条件JOIN时为什么可以使用匿名类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 我们先来看一下linq中如何在join中指定多个条件 public ActionResult Edit(int id) { using (DataContext db = new DataContext(ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionS

  • 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

    随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑.C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变.既然是强类型语言,那编写任一程序均要求满足下面的基本条件: 1.变量声明必须指明其类型 2.变量类型明确后,其类型在Runtime亦不能改变 代码如下: public class Student { public string Name { get; set; } public int Age { get; set; } public str

  • C#匿名方法与Delegate类型转换错误分析

    本文实例分析了C#匿名方法与Delegate类型转换错误.分享给大家供大家参考.具体分析如下: 问题描述 C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法: 复制代码 代码如下: public object Invoke(Delegate method); public IAsyncRe

  • C#特性 匿名类型与隐式类型局部变量使用介绍

    在本篇中我要介绍两个概念,我觉得这两个东西必须一起来介绍,这样才能连贯. C# 2.0里我们已经匿名方法了,现在类型也玩起匿名来了,怪不得大家"举报"的时候都喜欢匿名,为啥?因为匿名被举报人就找不着报复对象了呗,是的,匿名就是把名字隐藏起来,没有名字谁还能找得到你啊. 匿名类型 在C#里有这样一些类型,它是作为临时储存数据的,生命周期只在这个方法内,方法结束了,这个类型的生命周期也没有了.那么这里我们就可以使用一个匿名类型. 复制代码 代码如下: var KeyPair = new {

  • 深入了解c# 匿名类型

    一.什么叫做匿名类? 匿名类就是没有名字的类.匿名类不能被引用,只能再创建的时候用new语句来声明. 二.匿名类的优势以及应用场景: 1.匿名类型提供了一种方便的方法,可以用来将一组只读属性封装到单个的对象中,而且并不需要首先显示定义一个类型. 2.类型名由编译器生成,并且不能在源代码级使用.每个属性的类型由编译器推断. 3.可通过是用new运算符和对象初始值创建匿名类型. 4.匿名类型通常用在查询表达式的 Select 子句中,以便返回原序列中每个对象的属性子集(Linq 中使用的比较多).

  • ASP.NET中的参数与特殊类型和特性

    一.可选参数和命名参数         1.可选参数 语法: [修饰符] 返回类型 方法名(必选参数1...必选参数n,可选参数1...可选参数n) eg: static void BookList(string category,int pageIndex = 1) { //操作 } //调用 static void Main(string[] args) { BookList("C#"); //使用全部默认参数 BookList("C#",2) //不使用默认参

  • .net framework中引进的var对象类型声明

    安装了vs 2008之后,在后台代码中,resharper插件对后台所有局部变量进行提示建议,显示需要采用"use implicitly typed local variable declaration",通过代码修改建议,发现有"use Var"的提示,通过字面含义,很快就能知道这是.net framework3.5中引进的新机制,即对局部变量进行自动类型设置,其类型取决于等号右边初始化的对象的类型.在网上查了一下相关解释,记录在此: 一.神奇的var 在C#3.

  • Go语言struct类型详解

    struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样的类型我们称之struct.如下代码所示: 复制代码 代码如下: type person struct {     name string     age int } 看到了吗?声明一个struct如此简单,上面的类型包含有两个字段. 1.一个string类型的字段name,用来保存用户名称这个属性

  • 深入解析C#中的交错数组与隐式类型的数组

    交错数组 交错数组是元素为数组的数组.交错数组元素的维度和大小可以不同.交错数组有时称为"数组的数组".以下示例说明如何声明.初始化和访问交错数组. 下面声明一个由三个元素组成的一维数组,其中每个元素都是一个一维整数数组: int[][] jaggedArray = new int[3][]; 必须初始化 jaggedArray 的元素后才可以使用它.可以如下例所示初始化该元素: jaggedArray[0] = new int[5]; jaggedArray[1] = new int

  • C# WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇C#进阶系列--WebApi接口传参不再困惑:传参详解,这篇博文内容本身很基础,没想到引起很多园友关注,感谢大家的支持.作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,今天再来看看WebApi里面另一个重要而又基础的知识点:返回值.还是那句话:本篇针对初初使用WebApi的同学们,比较基础,有兴趣的且看看.

  • C#9特性record 类型、模式匹配、init 属性详情

    目录 C#的特性record 类型.模式匹配.init 属性 一.record 类型 二.模式匹配(Pattern Matching) 三.属性的 init 访问器 C#的特性record 类型.模式匹配.init 属性 一.record 类型 record ,我还是用原词吧,我知道有翻译为"记录类型"的说法.只是,只是,老周老觉得这不太好听,可是老周也找不出更好的词语,还是用回 record吧. record 是引用类型,跟 class 很像(确实差不多).那么,用人民群众都熟悉的

随机推荐