【问题标题】:Do "type-safe" and "strongly typed" mean the same thing?“类型安全”和“强类型”是同一个意思吗?
【发布时间】:2010-11-01 10:19:17
【问题描述】:

“类型安全”和“强类型”是同一个意思吗?

【问题讨论】:

  • 这不应该是社区维基吗?

标签: c# types


【解决方案1】:

不,不一定 - 尽管这取决于您对术语的定义,并且没有非常明确和广泛接受的定义。

例如,动态编程语言通常是类型安全的,但不是强类型的。换句话说,没有编译时类型信息来确定您可以对类型做什么和不能做什么,但在执行时,运行时会确保您不会像使用另一种类型一样使用一种类型。

例如,在 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 的安全转换,因此操作失败 - 而不是将数组对象的字节视为 /em> 他们是FileStream

编辑:C# 通常既是“强类型”(作为一种语言)又是类型安全的:编译器不允许您尝试对对象进行任意调用,运行时也不允许您执行不适当的转换。

我不完全确定不安全代码的适用范围 - 恐怕我对此了解的不够多,无法发表评论。

如上所示,C# 4 中的动态类型允许弱类型但仍然是类型安全的代码。

请注意,foreach 执行隐式转换,使其成为一种混合:

ArrayList list = new ArrayList();
list.Add("foo");

foreach (FileStream stream in list)
{
    ...
}

这将编译(最近有another question),但在执行时会失败。具有讽刺意味的是,这是因为您试图stream 变量进行强类型化,这意味着您必须对迭代器的结果执行强制转换。

【讨论】:

  • 乔恩,你能不能给 C# 定义/解释一下(如果你有时间的话)。
  • 嗯,听起来你对“类型安全”的定义只是意味着执行引擎不会访问一条认为它是错误类型的数据。我对此感到惊讶,因为根据该定义,例如,与使用非泛型 ArrayList 相比,C# 泛型不会增加任何类型安全性。你会说泛型只是强类型的一个例子,而不是类型安全吗?
  • @Timwi:CLR 在这两种情况下都提供了类型安全性,但您可以从更高的层次来看待它:如果我必须转换从ArrayList 中提取值的结果,那演员可能会失败。它会以一种相当安全的方式失败,但“从列表中获取字符串值”的行为仍然比使用 List<string> 的行为风险更大。
【解决方案2】:

好问题。阅读 this 维基百科条目,这是摘录:

Benjamin C. Pierce,《类型》一书的作者 和编程语言和高级 类型和编程语言,说, “我花了几个星期……试图分类 出“强烈”的术语 类型化,“静态类型化”,“安全”, 等等,然后惊奇地发现它 困难.... 这些术语的用法 种类繁多,几乎使它们呈现 没用。”

【讨论】:

    【解决方案3】:

    “类型安全”意味着不涉及强制转换,也不会发生运行时类型错误。

    有些人认为“强类型”没有任何意义,或者“很好”,或者“我很满意”。

    无论如何,“类型安全”与代码或 API 的一部分相关,而“强类型”则指整个语言或平台。

    【讨论】:

    • 实际上,类型安全并不意味着在编译时执行类型检查。只要在某处进行,一切都很好。
    【解决方案4】:

    ype safe 意味着防止程序访问对象公共属性范围之外的内存。当代码不是类型安全的时,可能会出现不需要的副作用。类型安全对于程序集隔离和安全执行很重要。当代码是类型安全的时,公共语言运行时可以将程序集彼此完全隔离

    【讨论】:

      【解决方案5】:

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

      来自维基百科:

      Type safety:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-01
        • 2014-05-16
        • 2013-08-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2016-07-27
        • 2018-08-26
        相关资源
        最近更新 更多