C ++与C#类型的安全性

时间:2011-11-25 18:03:54

标签: c# c++ type-safety

我正在阅读来自标签的大多数投票的问题并遇到https://stackoverflow.com/q/4377512/627005,其中接受的答案表明C具有“最小类型安全性”,C ++具有“更好的类型安全性”和C#“有类型安全”。为什么C#比C ++更安全?

3 个答案:

答案 0 :(得分:10)

C ++继承了许多C功能,因此如果你愿意,你总是可以做一些不安全的事情。只有当你习惯性地使用C ++时,你通常才会获得类型安全性。如果您选择离开安全场地,那么没有任何东西可以断然阻止您。

C#强制使用更强大的类型系统并限制使用C风格的结构(最明显的是指针运算)来标记“不安全”区域,因此您可以更好地(=自动)控制什么是类型安全和什么不是。


题外话:对“安全”的含义进行反思可能是值得的。如果我们可以验证特定代码是否正确,那么语言称为 safe 。在静态类型语言中,这基本上归结为类型检查:如果我们有表达式a + b,那么我们只检查类型:intint等于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()的代码,我们无法判断程序是否正确。这取决于函数的使用方式。

安全语言不允许您编写此类功能。

答案 1 :(得分:4)

如果你没有使用/unsafe,C#中唯一有点类型不安全的操作是类型转换 - 但它会在你执行转换时抛出异常。在C ++ reinterpret_cast等人可能会遇到更多麻烦,例如在实际指针取消引用时出现访问冲突。

答案 2 :(得分:0)

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

它的简单方法是.net不允许使用无类型变量,它只允许为相关类型定义的操作。

有关详细信息,您需要阅读CTS(通用类型系统)

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

C编译器是帮凶。

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