c# - C++ 与 C# 类型安全

标签 c# c++ type-safety

我正在阅读 中得票最多的问题标记并遇到 https://stackoverflow.com/q/4377512/627005 ,其中公认的答案指出 C 具有“最低类型安全性”,C++ 具有“更好的类型安全性”而 C#“具有类型安全性”。为什么 C# 比 C++ 更安全?

最佳答案

C++ 继承了很多 C 的特性,所以如果你愿意,你总是可以做一些不安全的事情。只是如果您惯用地使用 C++,那么您通常会获得类型安全。如果您选择离开安全地带,没有什么可以断然阻止您。

C# 强制执行更强大的类型系统,并将 C 风格构造(最显着的指针算法)的使用限制在标记为“不安全”的区域,因此您可以更好地(=自动)控制什么是类型安全的,什么不是。


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

安全语言不允许您编写此类函数。

关于c# - C++ 与 C# 类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8272809/

相关文章:

angular - Angular 分量的类型

c# - 遍历二维数组c#

c# - 将字典导出为 JSON,按键排序

c# - 找不到路径的一部分 - ASP.net/C# 图片上传

c++ - 加载DLL和直接调用的区别

c++ - dynamic_cast 到相同的类型不检查对象的类型

c# - xpath搜索多个关键字

c++ - 一对多IPC

c++ - Boost 的无序容器对于读取来说是线程安全的吗?

python - Python 中的类型安全