“类型安全”和“强类型”是否意味着同样的事情?

时间:2009-06-09 09:35:14

标签: c# types

“类型安全”和“强类型”是否意味着同样的事情?

5 个答案:

答案 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)

它们基本相同,只是解释的问题:

来自维基百科:

  

Type safety

     

类型安全与强类型的许多定义之一同义;但类型安全和动态类型是相互兼容的。动态类型语言(如Smalltalk)可以看作是一种强类型语言,具有非常宽松的类型系统,其中任何语法正确的程序都是良好类型的;只要它的动态语义确保没有这样的程序在适当的意义上“出错”,它就满足上面的定义,可以称为类型安全。

答案 4 :(得分:0)

ype safe意味着阻止程序访问对象公共属性范围之外的内存。当代码不是类型安全的时,可能会发生不必要的副作用。类型安全对于程序集隔离和安全实施非常重要。当代码是类型安全的时,公共语言运行库可以完全隔离组件