“类型安全”是什么意思?
当前回答
这里的许多答案将类型安全与静态类型和动态类型混为一谈。动态类型语言(如smalltalk)也可以是类型安全的。
简单的回答是:如果没有操作导致未定义的行为,则该语言被认为是类型安全的。许多人认为显式类型转换的要求对于严格类型的语言是必要的,因为自动转换有时会导致定义良好但意想不到/不直观的行为。
其他回答
类型安全
在现代c++中,类型安全是非常重要的。类型安全意味着正确使用类型,因此避免不安全的类型强制转换和合并。c++中的每个对象都是根据其类型使用的,并且在使用之前需要对对象进行初始化。
安全初始化:{}
编译器在类型转换过程中防止信息丢失。例如, int {7};初始化没问题 \ . int b{7.5}编译器显示错误,因为信息丢失
不安全的初始化:=或()
编译器不会在类型转换期间防止信息丢失。 int a = 7初始化正常 int a = 7.5初始化正常,但信息丢失。a的实际值将变为7.0 int c(7)初始化OK int c(7.5)初始化是可以的,但是会发生信息丢失。a的实际值将变为7.0
类型安全意味着在编程上,变量、返回值或参数的数据类型必须符合特定的标准。
实际上,这意味着7(整数类型)不同于"7"(字符串类型的引号字符)。
PHP, Javascript和其他动态脚本语言通常是弱类型的,因为它们将转换(字符串)如果您尝试将“7”+ 3添加为“7”到(整数)7,尽管有时您必须显式地这样做(Javascript使用“+”字符进行连接)。
C/ c++ /Java不会理解,或者会将结果连接到“73”中。类型安全通过明确类型需求来防止代码中出现这些类型的错误。
类型安全非常有用。上述“7”+ 3的解决方案是类型转换(int)7 + 3(等于10)。
试试这个解释……
TypeSafe意味着在编译时静态检查变量是否有适当的赋值。例如,考虑一个字符串或整数。这两种不同的数据类型不能交叉赋值(也就是说,不能将整数赋值给字符串,也不能将字符串赋值给整数)。
对于非类型安全的行为,考虑如下:
object x = 89;
int y;
如果你试图这样做:
y = x;
编译器抛出一个错误,表示它不能转换一个系统。对象转换为整数。你需要明确地这样做。一种方法是:
y = Convert.ToInt32( x );
上面的赋值不是类型安全的。类型安全赋值是指类型可以直接相互赋值。
非类型安全的集合在ASP。NET(例如,应用程序、会话和视图状态集合)。关于这些集合的好消息是(尽量减少多个服务器状态管理方面的考虑),您可以在这三个集合中的任何一个中放入几乎任何数据类型。坏消息是:因为这些集合不是类型安全的,所以在取回值时需要适当地强制转换。
例如:
Session[ "x" ] = 34;
工作很好。但是要将整数值赋回,你需要:
int i = Convert.ToInt32( Session[ "x" ] );
阅读泛型,了解该工具帮助您轻松实现类型安全集合的方式。
c#是一种类型安全语言,但请关注有关c# 4.0的文章;有趣的动态可能性正在逼近(c#实际上得到了严格的选项:关闭,这是一件好事吗?我们将会看到)。
类型安全不应与静态/动态类型或强/弱类型相混淆。
类型安全语言是这样一种语言,在这种语言中,只能对数据执行数据类型所允许的操作。也就是说,如果您的数据是X类型,而X不支持操作y,那么该语言将不允许您执行y(X)。
这个定义没有设置何时检查的规则。它可以在编译时(静态类型)或在运行时(动态类型),通常通过异常进行。它可以两者兼有:一些静态类型语言允许您将数据从一种类型转换为另一种类型,并且必须在运行时检查转换的有效性(假设您试图将对象转换为消费者—编译器无法知道它是否可接受)。
Type-safety does not necessarily mean strongly typed, either - some languages are notoriously weakly typed, but still arguably type safe. Take Javascript, for example: its type system is as weak as they come, but still strictly defined. It allows automatic casting of data (say, strings to ints), but within well defined rules. There is to my knowledge no case where a Javascript program will behave in an undefined fashion, and if you're clever enough (I'm not), you should be able to predict what will happen when reading Javascript code.
类型不安全编程语言的一个例子是C语言:在数组边界之外读取/写入数组值的规范没有定义行为。预测将会发生什么是不可能的。C是一种具有类型系统的语言,但不是类型安全的。
来自文科专业而不是计算机科学专业的解释:
当人们说一种语言或语言特性是类型安全的时,他们的意思是该语言将有助于防止,例如,将非整数的东西传递给某个期望整数的逻辑。
例如,在c#中,我将一个函数定义为:
void foo(int arg)
编译器会阻止我这样做:
// call foo
foo("hello world")
在其他语言中,编译器不会阻止我(或者没有编译器…),所以字符串将被传递给逻辑,然后可能会发生一些不好的事情。
类型安全语言试图在“编译时”捕获更多。
缺点是,使用类型安全语言,当你有一个像“123”这样的字符串,你想像整型一样对它进行操作时,你必须写更多的代码来将字符串转换为整型,或者当你有一个像123这样的整型,并且想在一个像“答案是123”这样的消息中使用它时,你必须写更多的代码来将它转换/强制转换为字符串。