C vs. C#型安全

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

解决方法

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

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

题外话:对“安全”的含义进行反思可能是值得的.如果我们可以验证特定代码是否正确,则称该语言是安全的.在静态类型语言中,这基本上归结为类型检查:如果我们有一个表达式a b,那么我们只检查类型:int plus int equals int,fine; struct plus 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++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...