zoukankan      html  css  js  c++  java
  • C#之匿名类型与隐式局部变量

    一、匿名类型 

      下面一段代码展示了如何定义并且使用匿名类型:

    static void Main(string[] args)
            {
                var patent1 = new 
                { Title = "Net Management",
                    YearOfPublication = "2012"
                };
    
                var patent2 = new
                {
                    Title = "Reflection Dynamic",
                    YearOfPublication = "2012"
                };
                var patent3 = new
                {
                    Title = "Grade ",
                    Year = "2011"
                };
                Console.WriteLine("{0},{1}", patent1.Title, patent1.YearOfPublication);
                Console.WriteLine("{0},{1}", patent2.Title, patent2.YearOfPublication);
    
                Console.WriteLine("............................");
                // 显然编译器生成匿名类型时,重写了ToString
                Console.WriteLine(patent1);
                Console.WriteLine(patent2);
                Console.WriteLine("............................");
                Console.WriteLine(patent3);
    }
    

      Console.WriteLine(patent1); 这一句输出的是 属性名-值。

    WriteLine执行的时候,会隐式调用ToString方法。而本例输出的是有规则的键值对,所以表明编译器生成匿名类型时重写了ToString类型的方法,所以WriteLine才会输出键值对。

    二、匿名类型的类型。

    1、只读的属性

    继续上面的代码,当我写入

    1 patent1.Title = "aaa"; 匿名类型的属性一旦实例化,便无法更改。

    时,报错,Title属性是只读的。即匿名类型一旦实例化则其属性无法更改。这样防止编译器做类型推断时出错。

    2、强类型。

    匿名类型仍然是有类型的,不表示说像C++ 中 void*一样指向任何类型。当编译器编译的时候,会根据匿名类型右侧推断出变量的类型。

    例如

    string text = "this is a string type";

    var text = "this is a string type";

    生成了CIL(公共中间语言)是一致的。

    3、匿名类型声明时,属性名称 类型 顺序完全一样才属于同一种类型,可以互相引用。

    之所以要求顺序是基于以下考虑:

    前文提到,ToString针对定义的匿名类型重写了,如果属性顺序不同使用同一个ToString,则会出现不同的输出结果。另外,在动态编程中,会反射或者动态调用一个属性,如果属性顺序不同的两个匿名类型当作同一个类型,则调用属性的时候会出现比较大的问题。

     
  • 相关阅读:
    【GIT-精讲】从零玩转Git-基础理论
    【fmjava】 面试题突击训练-Java基础语法篇01
    【笔记】springSecurity-OAuth2.0-授权模式演示
    【难受】SpirngCloud-Alibaba-nacos跨服务器访问接口的问题
    Python编程题汇总(持续更新中……)
    Python编程题14--随机分配礼物
    Python编程题13--判断两个升序列表,其中一个是另外一个的子集
    Python编程题12--列表中比前面元素都大,比后面元素都小的数
    Python编程题11--找出100以内的质数
    Python编程题10--找出和为N的两个数
  • 原文地址:https://www.cnblogs.com/tntboom/p/4139957.html
Copyright © 2011-2022 走看看