“类型安全”和“强类型”是否意味着同样的事情?
答案 0 :(得分:25)
不,不一定 - 虽然这取决于您对术语的定义,但没有非常明确和广泛接受的定义。
例如,动态编程语言通常是类型安全的,但不是强类型的。换句话说,没有编译时类型信息确定您可以和不能对类型执行什么操作,但在执行时,运行时会确保您不使用一种类型,就像它是另一种类型一样。
例如,在C#4.0中,您可以执行以下操作:
dynamic foo = "hello";
dynamic length = foo.Length; // Uses String.Length at execution time
foo = new int[] { 10, 20, 30 };
length = foo.Length; // Uses Array.Length at execution time
dynamic bar = (FileStream) foo; // Fails!
最后一行是它是类型安全的关键:没有从int数组到FileStream
的安全转换,因此操作失败 - 而不是将数组对象的字节视为如果他们是FileStream
。
编辑:C#通常都是“强类型”(作为一种语言)和类型安全:编译器不会让你尝试对一个对象进行任意调用,运行时不会让你执行不适当的转换。
我不完全确定哪些不安全的代码适合 - 我不太了解它的评论,我很害怕。
C#4中的动态类型允许弱类型但仍然是类型安全的代码,如上所示。
请注意foreach
执行隐式转换,使其成为一种混合:
ArrayList list = new ArrayList();
list.Add("foo");
foreach (FileStream stream in list)
{
...
}
这将编译(最近有another question)但在执行时会失败。具有讽刺意味的是,那是因为你尝试对stream
变量进行强类型化,这意味着你必须对迭代器的结果执行强制转换。
答案 1 :(得分:4)
好问题。阅读this维基百科条目,这是一个摘录:
Benjamin C. Pierce,类型的作者 和编程语言和高级 类型和编程语言,说, “我花了几个星期......试图排序 出了“强烈的术语” 打字,“”静态打字,“”安全,“ 等,发现它令人惊讶 困难......这些术语的使用 它是多种多样的,几乎可以渲染它们 无用“。
答案 2 :(得分:1)
“类型安全”表示不涉及转换,也不会发生运行时类型错误。
有些人认为“强烈打字”并不意味着什么,或者说“它很好”,或“我对此感到满意”。
无论如何,“类型安全”与代码或API的一部分有关,当“强类型”指整个语言或平台时。
答案 3 :(得分:0)
它们基本相同,只是解释的问题:
来自维基百科:
类型安全与强类型的许多定义之一同义;但类型安全和动态类型是相互兼容的。动态类型语言(如Smalltalk)可以看作是一种强类型语言,具有非常宽松的类型系统,其中任何语法正确的程序都是良好类型的;只要它的动态语义确保没有这样的程序在适当的意义上“出错”,它就满足上面的定义,可以称为类型安全。
答案 4 :(得分:0)
ype safe意味着阻止程序访问对象公共属性范围之外的内存。当代码不是类型安全的时,可能会发生不必要的副作用。类型安全对于程序集隔离和安全实施非常重要。当代码是类型安全的时,公共语言运行库可以完全隔离组件