Pau*_*nta 6 c# c++ type-safety
我正在阅读历史标签中大多数投票的问题,并且遇到了 /sf/ask/306425871/,其中接受的答案表明C具有"最小类型安全性",C++具有"更好的类型安全性" "和C#"具有类型安全性".为什么C#比C++更安全?
Ker*_* SB 10
C++继承了许多C功能,因此如果您愿意,您总是可以做一些不安全的事情.只有当你习惯性地使用C++时,你通常才会获得类型安全性.如果你选择离开安全场地,没有任何东西可以断然阻止你.
C#强制使用更强大的类型系统并限制使用C风格的结构(最明显的是指针运算)来标记"不安全"区域,因此您可以更好地(=自动)控制什么是类型安全,什么不是.
题外话:对"安全"的含义进行反思可能是值得的.如果我们可以验证特定代码是否正确,则称该语言是安全的.在一个静态类型的语言中,这基本上归结为类型检查:如果我们有一个表达式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);
}
Run Code Online (Sandbox Code Playgroud)
在示例#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!
Run Code Online (Sandbox Code Playgroud)
再说一次,仅仅通过查看代码get_int(),我们无法判断程序是否正确.这取决于函数的使用方式.
安全语言不允许您编写此类函数.