匿名类型是不是强类型?

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

什么是匿名类型?

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

匿名类型和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 ? "" : "" }用于友好的数据绑定,但这仅限于这种绑定的地方非常非常少。例如:下拉框的绑定。

结语

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

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

### TypeScript 中匿名函数的泛型定义和使用方法 在 TypeScript 中,匿名函数也可以被赋予泛型特性。这使得它们能够在不预先知道具体类型的情况下工作,并且仍然保持强类型的安全保障。 #### 泛型匿名函数的基础语法 当定义一个带有泛型的匿名函数时,可以在参数列表之前放置一对尖括号 `<T>` 来表示这个函数支持泛型。这里的 `T` 是占位符,代表任何将来会传递给它的类型[^1]。 ```typescript const reverseArray = <T>(array: T[]): T[] => array.reverse(); ``` 在这个例子中,`reverseArray` 函数接受一个数组作为输入,并返回一个新的反转后的数组。由于它是一个泛型函数,所以无论传入的是字符串数组还是数字数组,都能正常运作[^1]。 #### 实际案例分析 考虑这样一个场景:我们需要编写一个通用的日志记录器,它可以打印出对象的内容而不关心这些对象的具体类型是什么样的。这时我们可以这样写: ```typescript const logger = <T>(obj: T): void => console.log(JSON.stringify(obj)); logger({ name: 'Alice', age: 25 }); // {"name":"Alice","age":25} logger([1, 2, 3]); // [1,2,3] ``` 在这里,`logger` 就是一个典型的泛型匿名函数实例。通过这种方式,不仅可以简化代码结构,还能提高程序的整体可维护性和扩展性[^1]。 另外值得注意的一点是,有时候为了让调用更加直观简洁,甚至可以直接省略显式的类型标注让编译器自动推导出来: ```typescript const identity = <T>(value: T) => value; let output = identity<string>('hello'); // 明确指出string 类型 output = identity('world'); // 自动推测为 string 类型 ``` 尽管如此,在团队协作或者大型项目里为了增加清晰度减少歧义,通常推荐保留必要的类型提示信息。 --- ### 总结 综上所述,掌握了如何正确定义与运用TypeScript里的匿名泛型函数之后,就能更高效地构建既灵活又安全的应用程序组件了。无论是简单的数据转换还是复杂的业务流程控制,都可以从中受益匪浅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值