如何定义“类型”的含义
摘自Eric Lippert关于“是”的含义 的博客 是 :
类型的一个常见概念是类型是值的集合,并且赋值兼容性仅仅是检查给定值是否是必要集合的成员。 但在C#中并非如此。
他给出的计数器示例是null is string
返回false
,但string b = null
完全没有C#编译器。
也许这是一个愚蠢的问题,但是在C#.Net上下文中定义“类型”概念的更好方法是什么? 它只是用来定义内存占用规则的一个词吗? …到CLR? 我意识到这个定义是多么宽松(而且可怕的错误),但我正在努力适应一个漂亮的包装并绕过类型的想法。
注意:越简单,但完全准确,越好。 (强N型 ,这里)。
什么是在C#.Net上下文中定义“类型”概念的更好方法? 它只是用来定义内存占用规则的一个词吗? 我正在努力适应一个漂亮的包装,并围绕类型的想法鞠躬。
这是一个棘手的问题。 你打开了关于我的文章的链接,但我认为你真正想要阅读的是这一个:
简述:
从“数学”的角度来看,类型就像一个数字:我们可以使用规则操纵的抽象数量。 就像“如果T
是一个类型那么T[]
也是一个类型”,依此类推。
一旦我们有一个抽象的类型概念,那么我们可以为每个表达式分配一个类型,然后我们可以创建一个自动确定程序是否遵循类型安全规则的validation程序。
Type
的传统英语定义是一个很好的起点。
一类具有共同特征的人或事物。
.NET类型定义特定类别的.NET对象(即:System.IO.Stream)。 它包含一组特定.NET对象的属性和方法(特征)。
您是否在寻找更多技术描述(即:内存管理等)?
这里有类似问题的一些好的答案: 为什么当给定null时,is运算符返回false?
这里对null文字进行了更详细的讨论:null文字的类型是什么?
为了符号目的,似乎早期版本的.NET中曾经存在null类型,但随后在后续版本中被删除。
从IL程序员的角度来看,我可以说当在IL中写入’if(myvar == null)’之类的语句时,它会是这样的:
Ldloc myvar brfalse IfNullLabel
无论其类型如何,仅使用一条IL指令检查变量的空引用。 如果将其与另一个字符串进行比较,则将调用Equals方法。 所以在内部,当引用指向空文本时,值为null。 就如此容易。
根据编程指南,我想你可能会过度思考这一点
存储在类型中的信息可包括以下内容:
- 类型变量所需的存储空间。
- 它可以表示的最大值和最小值。
- 它包含的成员(方法,字段,事件等)。
- 它inheritance的基类型。
- 变量内存在运行时分配的位置。
- 允许的操作类型。
我知道这不会占用null
但在c#中, null
实际上只是缺少引用的内存地址。
有更多的上下文将有助于回答你的问题(“ [...] define the idea of 'type' in a C#.Net context[...]
”,但这里是一个快速的刺。 .NET中的类型概念来自面向对象的编程 ,并且是来自前OOP编程语言的数据类型概念的概括。 最简单的forms,你可以说……
类型是结构的命名模板,其实例包含数据和/或行为。
编辑部分中的问题解答:
[…] CLR如何处理类型的想法?
我不确切地知道你的意思,但CLR中的一个类型 – 我上面的定义中的’命名模板’ – 在物理上存储为CIL,并在系统中由一个对象本身表示(就像所有对象一样)是一种类型。
在这种情况下,该类型被命名,当然, System.Type
。 (如果你很好奇,这种类型实际存储在mscorlib
程序集中。)我知道我在自己的定义中使用了一个术语,但很难不这样做,因为这个概念本质上是递归的。
[…] CLR是否需要隐式地将null转换为赋值字符串s = null中的字符串? 答案到目前为止暗示不,它没有,但是什么允许这个任务? null只是在这里被视为一个特例吗?
是的,这是一个特殊情况,不,编译器和CLR都没有将null
转换为string
(或其他任何东西)。 null
没有类型(1)并且不能转换为任何类型 – 它是一个特殊的“值”,表示缺少值(2) ,因此可以赋值给任何引用类型的变量(3) 。
(1)根据您的外观,它可能是也可能不是 “null type”类型 。
(2)这样的值将是对该类型的实例的引用 。
(3)有两种类型 – 引用类型和值类型 – 而null
实际上只适用于前一种类型 。 它可以出现在源代码中(例如int? i = null;
),因为它被赋值给可空值类型的变量,但这只是语法糖,幕后发生的事情是非常不同的,只与这个讨论相关。