zoukankan      html  css  js  c++  java
  • 匿名类型是不是强类型?

    在一次会议上由于一些需要提到了匿名类型,也由此展开了两批人,我和另一位主张匿名类型不是强类型,而另两位则觉得匿名类型属于强类型,此博文主要深入了解一下匿名类型。

    什么是匿名类型?

    原来不想写这个标题相关内容的,因为类似文章还是很多的,但为了一些新人能更好的阅读本文章就顺便提及一下,这里不涉及太深的东西,只是简单的介绍。

    匿名类型和var关键字是Visual C# 3.0提供的一个新特性或者说是语法糖,var是隐式类型而并不是类型javascript中的var

    var user = new { Id = 1, Name = "张三", Age = 15 };
    Console.WriteLine(user.Name);

    详解匿名类型

    匿名类型并不属于.NET Framework

    image

    在MSDN的文档中其实匿名类型并不属于.NET Framework,它属于Visual Studio更准确的来说它属于Visual C# 3.0,不扯太多题外话,再扯下去记得再"论.NET Framework和C#"哈哈。

    匿名类型的智能感知

    imageimage

    从这边来看匿名类型是可以智能感知的,那是否说明匿名类型就是一个强类型呢?

    匿名类型是只读的

    image

    匿名类型中的所有属性器除在初始化时候都是只读的,所以一旦初始化成功后它将无法进行赋值。

    无法在一个数组内添加两种不同属性的匿名类型

    image

    我们来看看反编译之后他们会生产什么?

    image

    反编译之后会发现一个<>f__AnonymousType0<int, string, int>,这个类型是什么呢?定义结构跟Tuple<>非常的相像。如果定义了类型那么它不就是一个强类型吗?我们追踪看看。

    image

    会发现提示出是由编译器生成的类,我们无法追踪他,也无法确定他是否定义了这个类。

    匿名类型到底是不是强类型?

    首先不饶那么多弯,我先阐述一下我个人的想法,我个人觉得匿名类型不是一个“强类型”

    当然这边强类型加了引号,其实在C#中所有的类型都是强类型的,因为C#本身就是一个强类型语言。

    但这边所指的强类型更倾向于使用,因为匿名类型脱离了var只能将其转换成object类型,那么它将无法拥有神奇的智能感知,再加上var的使用是有限制的,var不能在全局定义,只能在方法体内定义,所以脱离了当前方法体它将不再拥有智能感知的光环。

    其实在本人的日常开发中匿名类型使用的极少,几乎没有,个人更倾向把匿名类型使用在数据绑定上,比如把bool类型的IsEnable投射至匿名类型中的new { IsEnable = isEnable ? "" : "" }用于友好的数据绑定,但这仅限于这种绑定的地方非常非常少。例如:下拉框的绑定。

    结语

    这次在博客园的第二篇文章,排版、润色还有所欠缺,希望能坚持写博文以弥补这些问题。

    欢迎大家和谐讨论( ̄ˇ ̄)

  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/ants/p/3252543.html
Copyright © 2011-2022 走看看