2011-11-25 78 views

回答

10

C++继承了很多C特性,所以如果你愿意,你总是可以做一些不安全的事情。只有如果你习惯使用C++,那么你通常会得到类型安全。如果你选择离开安全场地,那么没有任何东西会明确地阻止你。

C#强制执行一个更强大的类型系统,并将C风格构造(最明显的是指针算术)限制为标记为“不安全”的区域,所以您最好(=  自动)控制什么是类型安全和什么是“吨。


题外话:这可能是值得反思什么是“安全”的意思了一下。如果我们可以验证某个特定的代码是正确的,则语言被称为安全。在静态类型语言,这基本上可以归结为类型检查:如果我们有一个表达式a + b,那么我们只检查类型:intint等于int,罚款; structunion没有意义,编译错误。

古怪的人出此设置是引用操作*:当我们看到*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()的代码,我们不能告诉程序是否会正确与否。这取决于如何使用该功能。

安全的语言不允许你编写这样的函数。

4

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

0

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

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

更多细节,你需要在CTS(通用类型系统)来读取了

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

C编译器是从犯。

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