【问题标题】:What is type-safe in .net?.net 中的类型安全是什么?
【发布时间】:2011-01-27 02:31:40
【问题描述】:

什么是类型安全的?

这是什么意思,为什么重要?

【问题讨论】:

标签: c# .net


【解决方案1】:

如果您问general 中“类型安全”的概念是什么意思,代码的特点是允许开发人员确定一个值或对象将表现出某些属性(即,属于某种类型),以便他/她可以以特定方式使用它,而不必担心意外或未定义的行为。

例如,在 C# 中,您可以说ArrayList 类是类型安全的,因为它可以存储任何对象,这意味着您可以执行类似的操作以下:

var integers = new ArrayList();
integers.Add(1);
integers.Add(2);
integers.Add("3");

for (int i = 0; i < integers.Count; ++i) {
    int integer = (int)integers[i];
    // do something
}

上面将编译,因为值“3”,即使它是一个字符串而不是整数,也可以合法地添加到ArrayList,因为String 派生自Int32(如Int32)。但是,当您尝试将integer 设置为(int)integers[2] 时,它会抛出InvalidCastException,因为String 不能转换Int32

另一方面,List&lt;T&gt;类型安全的,原因恰恰相反——即,如果integers,上述代码将编译是List&lt;int&gt;。开发人员从类型安全的List&lt;int&gt; 中访问的任何值都可以确定int(或任何对应的T 用于任何通用List&lt;T&gt;);因此,您可以确定您将能够执行诸如转换为int(显然)或long 之类的操作。

【讨论】:

  • 我不同意你的观点。 ArrayList 既不是类型安全也不是类型安全:stackoverflow.com/a/17984521/1145224 .
  • 他只是想解释类型检查的重要性,并没有解释数组列表特性的意思。
【解决方案2】:

C - 声明一个 int,将其转换为 char 并访问 int 边界之外的内存

int i = 10;
char *s = (char*)i;
print(*(s+10));

C# - 类型是安全的

int i = 10;
char *s //This is invalid unless you are using unsafe context. 

.NET 不直接支持指针

【讨论】:

  • +1 TypeSafe 与 CLR 或程序的内存访问有关,而不是关注 TYPES。因此,此响应为 +1,因为它针对的是实际差异。参考:exforsys.com/tutorials/csharp/.-net-type-safety.html
  • 没有奇怪转换的 C 是 类型安全 (除了非常古老的所有标准)。您的样本在这方面并不严格。你说……可以说……关于内存安全/不安全的解决方案???带有奇怪转换的 C# 在正常部分可能是类型不安全的(“非不安全”):正编译,运行时出错
【解决方案3】:

类型安全代码仅访问 它被授权的内存位置 使用权。例如,类型安全的代码 无法从另一个读取值 对象的私有字段。它访问 类型仅在定义明确的、允许的 方式。

在即时 (JIT) 编译期间, 可选的验证过程 检查元数据和 Microsoft 中间语言 (MSIL) 方法被 JIT 编译为本机 机器代码来验证它们是 键入安全。如果出现以下情况,则跳过此过程 代码有权限绕过 验证

虽然验证了类型安全 不是必须运行托管代码, 类型安全在其中起着至关重要的作用 装配隔离和安全 执法。当代码类型安全时, 公共语言运行时可以 完全隔离程序集 彼此。这种隔离有助于 确保组件不能 互相影响,而且 提高应用程序的可靠性。

更多信息请参考msdn link

解释它的好文章是here

【讨论】:

  • 最后一个链接坏了。
【解决方案4】:

您是指具体的类型安全还是一般的类型安全?

我不同意接受的答案:ArrayList 是类型安全无知的(既不是类型安全也不是类型安全):https://stackoverflow.com/a/17984521/1145224

Richter - CLR 通过 C#,第 4 版(第 93 页):

类型安全是 CLR 的主要特性。你总能发现 通过调用 nonvirtual GetType 方法获取对象的确切类型 系统对象。

例如Hero类不能重写GetType方法成为SuperHero的类型。

此 System.Object 功能使 CLR 能够检查在运行时转换对象的可能性。例如:

internal class Employee { ... }

public sealed class Program 
{

    public static Main() 
    {
        DateTime dt = new DateTime(2016, 1, 1);
        PromoteEmployee(newYears);
    }

    public static PromoteEmployee(Object o)
    {
        Employee e = (Employee)o; //InvalidCastException, runtime error
    }
}

将 DateTime 类型转换为 Employee 类型是非类型安全尝试转换的示例。

【讨论】:

    【解决方案5】:

    我不同意这里的一些答案。 C# 的安全级别很少

    编辑:类型安全有 2 个级别的含义(如果我们通常讨论编程语言,就像在这个线程中一样)

    一个是编译时类型安全,接近重构等,编译器捕获拼写错误,将值分配给错误的变量(属性),即字符串到 int 变量。典型的 C# 代码是类型安全的,禁用此功能的已知方法是 dynamic 关键字,或者非通用容器,上述错误会延迟到运行时。示例:非黑客 C/C++ 代码(通常)在编译时是类型安全的。我认为有可能在 C# 中编写(黑客)转换来隐藏类型冲突。

    下一级是运行时类型安全,C# 通常是安全的(没有不安全的部分)。甚至动态值也会在运行时检查。相反:C/C++ 在运行时不是类型安全的。如果编译器接受代码,则在运行时不检查非逻辑分配,提供奇怪/奇怪/系统级别或后期错误,这对于 C 语言很典型。

    这个线程中很少有回答者混合了 C# 安全的其他领域(内存安全、范围安全、空指针等)。严格来说,这些是不同的安全性。

    理论:https://en.wikipedia.org/wiki/Type_safety

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 2011-01-09
      • 1970-01-01
      • 2018-09-01
      • 2013-07-31
      • 2014-07-24
      • 1970-01-01
      相关资源
      最近更新 更多