什么是类型安全的?
这是什么意思,为什么重要?
答案 0 :(得分:72)
如果您在 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
)来自Object
。但是,当您尝试将InvalidCastException
设置为integer
时,它会抛出(int)integers[2]
,因为String
无法投射到Int32
}。
另一方面,List<T>
类是类型安全的,原因恰恰相反 - 即上面的代码不编译{ {1}}是integers
。开发人员在类型安全的List<int>
中可以某些访问的任何值都是List<int>
(或者对应任何通用的int
相应的T
List<T>
);因此,您可以确保您能够执行诸如转换为int
(显然)或者说long
等操作。
答案 1 :(得分:15)
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
不直接支持指针答案 2 :(得分:10)
类型安全代码仅访问 它被授权的内存位置 访问。例如,类型安全的代码 无法从另一个读取值 对象的私有字段。它访问 类型只有明确定义,允许 方式。
在即时(JIT)编译期间, 可选的验证流程 检查元数据和微软 中间语言(MSIL)的 JIT编译成本机的方法 机器代码来验证它们是什么 类型安全。如果,则跳过此过程 代码有权绕过 验证
虽然验证了类型安全性 运行托管代码不是必需的, 类型安全起着至关重要的作用 装配隔离和安全 执法。当代码类型安全时, 公共语言运行库可以 完全隔离组件 彼此。这种隔离有帮助 确保程序集不能 对彼此产生不利影响 提高应用可靠性。
有关详情,请参阅msdn link
一篇解释它的好文章是here
答案 3 :(得分:-1)
引入了.NET中的类型安全性,以防止一种类型的对象窥视为另一个对象分配的内存。
例如,详细讨论请visit this link
答案 4 :(得分:-1)
您的意思是特别是类型安全还是类型安全?
我不同意接受的答案:ArrayList是类型安全无知的(既不是类型安全的,也不是类型安全的):https://stackoverflow.com/a/17984521/1145224
Richter - CLR通过C#,第4版(第93页):
类型安全是CLR的主要特征。你总能发现 对象的确切类型通过调用非虚拟 GetType方法 System.Object的。
例如,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 :(得分:-2)
我不同意这里的一些答案。 C#几乎没有安全级别。
编辑:类型安全有两个层次的含义(如果我们通常讨论编程语言,就像在这个帖子中一样)
一个是编译时类型安全,接近重构等,编译器捕获拼写错误,错误地将值分配给错误的变量(属性),即字符串到int变量。典型的C#代码是类型安全的,已知的禁用此功能的方法是dynamic
关键字,或非通用容器,上述错误会延迟到运行时。示例:非攻击性C / C ++代码(通常)在编译时是类型安全的。我认为可能在C#中编写(黑客)转换隐藏类型冲突。
下一级是运行时类型安全,C#一般是安全的(没有不安全的部分)。甚至动态值也会在运行时检查。相反:C / C ++在运行时不是安全类型。如果编译器接受代码,则不会在运行时检查非逻辑分配,从而提供奇怪的/奇怪的/系统级的或迟到的错误,这是C语言的典型错误。
此线程中很少有人回答C#安全的其他区域(内存安全,范围安全,空指针等)。严格来说,这些都是不同的安全。