【发布时间】:2012-03-30 00:32:47
【问题描述】:
我一直在学习 C# 课程,我的脑海中不断出现以下主题,希望摆脱它的时候到了:类型化在编程语言中的含义是什么?
当我问自己,构建类型安全语言的意愿背后的原因/动机是什么时,我想出的最终答案(也许是唯一的一个)是:在语言中定义类型的能力允许我们对我们在程序中使用的数据强制执行编译时约束,以便 IDE/编译器可以帮助防止/检测错误,否则我们会错过 - 并且可能要在很久以后才能发现 - 这当然是一个问题。这些错误包括无效操作、无效成员访问等。
如果到目前为止我是对的,那么我会问:在 C# 等语言中,强制转换是什么意思/真正发生了什么?假设我有一个定义为采用 Object 类型参数的方法,并且我将类型的任何派生(即任何类型)传递给它 - 此时在幕后发生了什么?
我倾向于假设键入还限制了我可以在任何给定对象实例中访问哪些成员。换句话说,我假设编译器总是查看变量的类型而不是它接收到的实例来执行/应用其验证规则,然后触发或不触发错误消息。这是正确的吗?在下面给出的示例中,由于变量类型是 Object,编译器将不允许我访问我的任何实例成员 - 除非我对实例的类型执行强制转换。我想在这里澄清的一点是,该实例曾经并且将始终保留其类型——无论是否正在执行强制转换。按照我的理论,演员阵容是必要的,只有这样编译器——一个可以帮助我们工作的工具——以及我们在构建程序的每一步中都受到的认可——才能接受这段代码确实是一个100% 信任/“安全”。
然后我想到前面提到的应用于多态性,并且似乎是有道理的:一个更通用的类型持有一个更专业的类型的实例不会导致编译器错误,因为访问实例成员没有风险没有在更通用的类型中定义,因为更专业的类型继承了它们(是否覆盖它们,甚至隐藏它们)。另一方面(当类型比实例更特化时)存在问题,因为程序员很可能错误地访问实例中的特化成员(该成员将不存在)。
最后一点,我想每个实例都分配一个内存块(我想知道是否一定是连续的) - 在大小上,它的每个类型成员内存需求的总和(加上更多的元数据/头信息,不管怎样)——并且每个成员定义都会生成一个特定的内存地址,以便在访问实例以访问任何给定成员(无论是变量、方法等)时使用。
上面的假设有错吗? (或者我应该问......他们中的任何一个都是对的吗?:)
【问题讨论】:
-
您可能对the Wikipedia article on type systems感兴趣;特别是关于动态类型和静态类型的部分与您的问题非常相关。
-
谢谢,实际上我认为这个讨论是在我阅读之后才开始形成的,但我肯定没有仔细阅读它,或者至少没有阅读你提到的所有部分。会去看看。
标签: compiler-construction types casting theory