我正在阅读history标记中大多数投票的问题,并且遇到了https://stackoverflow.com/q/4377512/627005,其中接受的答案指出C具有“最小类型安全性”,C++具有“更好的类型安全性”和C# “具有类型安全性”。为什么C#比C++更安全?C++与C#类型安全
6
A
回答
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);
}
在实施例#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编译器是一名警察.....
相关问题
- 1. C#枚举类型安全
- 2. C#与C++安全性
- 3. 做一个类型安全扔在C++
- 4. C#枚举类型安全吗?
- 5. 类型安全的memcpy C++包装?
- 6. 类型安全的C#通用缓存
- 7. C中的类型安全枚举?
- 8. 违反C++中的类型安全与其他类型的函数声明?
- 9. 类型转换在C和类型安全
- 10. C# - 安全`sockets`与SSL
- 11. C++:不完全类型
- 12. NSArray与C类型?
- 13. 泛型类与C#
- 14. 确保与Java泛型类型安全
- 15. C#泛型和运行时类型安全
- 16. “类型安全”UUID?
- 17. 类型安全objectdatasources
- 18. 与日期JPA2类型安全查询
- 19. 类型安全通用容器与宏
- 20. 更换非类型与类型安全的泛型方法
- 21. C#与泛型集合类
- 22. C++:使用类型安全来区分两个int参数的类型
- 23. C#数据源类和线程安全
- 24. C#MySQL可重用类安全问题
- 25. C#多线程安全类设计
- 26. C#线程安全
- 27. C++常量安全
- 28. C安全手柄#
- 29. 类型安全配置安全rendeing
- 30. 如何在C#中的PrivateObject上创建类型安全性