c++与c#类型安全

本文关键字:类型安全 c++ | 更新日期: 2023-09-27 18:15:59

我正在阅读历史标签中大多数投票的问题,并发现https://stackoverflow.com/q/4377512/627005,其中公认的答案是C具有"最低类型安全性",c++具有"更好的类型安全性",c#"具有类型安全性"。为什么c#比c++更类型安全?

c++与c#类型安全

c++继承了很多C的特性,所以如果你想的话,你总是可以做一些不安全的事情。只是如果你习惯地使用c++,那么你通常会得到类型安全。如果你选择离开安全的场地,没有什么能绝对阻止你。

c#强制了一个更强的类型系统,并将C风格结构(最明显的是指针算术)的使用限制在标记为"不安全"的区域,因此您可以更好地(= automated)控制哪些是类型安全的,哪些不是类型安全的。


题外话:反思一下"安全"的含义可能是值得的。如果我们能够验证特定的代码段是正确的,那么这种语言就被称为安全的。在静态类型语言中,这基本上可以归结为类型检查:如果我们有一个表达式a + b,那么我们只需检查类型:int + int = int,很好;struct + union没有意义,编译错误。

在这个设置中奇怪的人是解引用运算符*:当我们看到*p时,我们可以检查p是一个指针,但这不足以证明表达式是正确的!代码的正确性不仅取决于p类型,还取决于其。这是C和c++不安全的核心。

这里有两个例子来说明:

// Example #1
void print_two(const char * fmt)
{
  double d = 1.5;
  unsigned int n = 111;
  printf(fmt, d, n);
}
// Example #2
unsigned int get_int(const char * p)
{
  return *(unsigned int *)(p - 3);
}
在例#1中,代码的正确性取决于fmt所指向的字符串的运行时提供的。在例#2中,我们有以下内容:
unsigned int n = 5;
double d = 1.5;
const char * s = "Hello world";
get_int((char*)(&n) + 3);  // Fine
get_int((char*)(&d) + 3);  // Undefined Behaviour!
get_int(s + 5);            // Undefined Behaviour!
同样,仅仅通过查看get_int()的代码,我们无法判断程序是否正确。这取决于如何使用该函数。

一个安全的语言不允许你写这样的函数

如果您不使用/unsafe,那么c#中唯一有点类型不安全的操作是类型转换-但是它会在您执行类型转换时抛出异常。在c++中,reinterpret_cast等可能会给你带来更多的麻烦,比如在实际指针解引用时的访问冲突。

简短的回答是因为他们是这样写的。

它的简单原理是。net不允许无类型的变量,它只允许为所讨论的类型定义的操作。

有关更多细节,您需要阅读CTS(通用类型系统)

是不同的语言,但仍然有效

C编译器是帮凶。

.Net编译器是警察.....