如何定义“类型”的含义

时间:2015-06-30 02:16:58

标签: c# .net types clr

摘录自Eric Lippert's Blog关于What the meaning of "is", is

  

类型的一个常见概念是类型是值的集合,并且赋值兼容性仅仅是检查给定值是否是必要集合的成员。但在C#中并非如此。

他给出的计数器示例是null is string返回false,但{#1}}完全没有C#编译器。

也许这是一个愚蠢的问题,但是在C#.Net上下文中定义“类型”概念的更好方法是什么?它只是用来定义内存占用规则的一个词吗? ......到CLR?我意识到这个定义是多么宽松(而且可怕的错误),但是我正在努力使用一个漂亮的包装器并且绕过类型的想法。

注意:越简单,但完全准确,越好。 (强N type,这里)。

5 个答案:

答案 0 :(得分:10)

  

在C#.Net上下文中定义“类型”概念的更好方法是什么?它只是用来定义内存占用规则的一个词吗?我正在努力适应一个漂亮的包装,并围绕类型的想法鞠躬。

这是一个棘手的问题。您打开了我关于is的文章的链接,但我认为您真正想要阅读的是这一个:

http://blogs.msdn.com/b/ericlippert/archive/2011/08/29/what-is-this-thing-you-call-a-quot-type-quot-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2011/09/07/what-is-this-thing-you-call-a-quot-type-quot-part-two.aspx

简要说明:

从“数学”的角度来看,类型就像一个数字:我们可以使用规则操纵的抽象数量。就像“如果T是一种类型,那么T[]也是一种类型”,依此类推。

一旦我们得到了一个抽象的类型概念,那么我们可以为每个表达式分配一个类型,然后我们可以创建一个自动确定程序是否遵循类型安全规则的验证程序。

答案 1 :(得分:3)

Type的传统英语定义是一个很好的起点。

  

一类具有共同特征的人或事。

.NET类型定义.NET对象的特定类别(即:System.IO.Stream)。它包含一组特定.NET对象的属性和方法(特征)。

您是否在寻找更多技术说明(即:内存管理等)?

答案 2 :(得分:1)

这里有类似问题的一些好答案: Why does the is operator return false when given null?

这里对null文字进行了更详细的讨论: What is the type of null literal?

似乎早期版本的.NET中曾经有一个null类型用于符号目的,但随后在后续版本中被删除。

从IL程序员的角度来看,我可以说当用IL编写'if(myvar == null)'之类的语句时,它会是这样的:

Ldloc myvar
brfalse IfNullLabel

仅使用一条IL指令检查变量的空引用,无论其类型如何。如果将其与另一个字符串进行比较,则将调用Equals方法。所以在内部,当引用指向空文本时,值为null。就这么简单。

答案 3 :(得分:0)

根据Programming Guide

,我认为你可能会过度思考这一点

存储在类型中的信息可包括以下内容:

  • 类型变量所需的存储空间。
  • 它可以表示的最大值和最小值。
  • 它包含的成员(方法,字段,事件等)。
  • 它继承的基本类型。
  • 将在运行时分配变量内存的位置。
  • 允许的操作类型。

我知道这不会导致null,但在c#null中实际上只是缺少引用的内存地址。

答案 4 :(得分:0)

有更多的背景将有助于回答你的问题(“[...] define the idea of 'type' in a C#.Net context[...]”),但这里是一个快速的刺。 .NET中的类型概念来自object-oriented programming,它是来自OOP前编程语言的datatype概念的概括。最简单的形式,你可以说......

  

类型是a的命名模板   结构,其实例包含数据和/或行为。


编辑部分中的问题解答:

  

[...] CLR如何处理类型的想法?

我不确切地知道你的意思,但是CLR中的一个类型 - 我上面定义中的'命名模板' - 实际存储为CIL并且在系统中由对象表示它本身(就像所有对象一样)是一种类型。

在这种情况下,确定该类型的名称System.Type。 (如果你很好奇,这种类型实际存储在mscorlib程序集中。)我知道我在自己的定义中使用了一个术语,但很难不这样做,因为这个概念本质上是递归的。

  

[...] CLR是否需要隐式地将null转换为   赋值字符串s = null?答案到目前为止意味着没有,它没有,但是   什么允许这项任务? null仅作为特例处理   这里吗?

是的,这是一个特殊情况,没有,编译器和CLR都没有nullstring(或其他任何东西)。 null没有类型(1)且无法转换为任何类型 - 它是一个特殊的“值”,表示缺少值(2)因此可分配给任何引用类型的变量(3)


(1)根据您的外观,maymay not属于"null type"类型。

(2)这样的值对于该类型的实例是reference

(3)two kinds of types - reference typesvalue types - 以及null真正only applies to the former kind。它可以在源代码(例如int? i = null;)中显示为分配给nullable value type的变量,但这只是语法糖,幕后发生的事情是非常不同的,只与这个讨论相关。