“类型安全”是什么意思?
当前回答
类型安全
在现代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
其他回答
类型安全
在现代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
类型安全意味着编译器将在编译时验证类型,如果试图将错误的类型赋值给变量,则抛出错误。
一些简单的例子:
// Fails, Trying to put an integer in a string
String one = 1;
// Also fails.
int foo = "bar";
这也适用于方法参数,因为你传递显式类型给它们:
int AddTwoNumbers(int a, int b)
{
return a + b;
}
如果我试着称之为使用:
int Sum = AddTwoNumbers(5, "5");
编译器会抛出一个错误,因为我传递了一个字符串(“5”),而它期待的是一个整数。
在一个松散类型的语言,如javascript,我可以做以下:
function AddTwoNumbers(a, b)
{
return a + b;
}
如果我这样调用它:
Sum = AddTwoNumbers(5, "5");
Javascript自动将5转换为字符串,并返回“55”。这是由于javascript使用+符号进行字符串连接。为了使它具有类型意识,你需要做如下的事情:
function AddTwoNumbers(a, b)
{
return Number(a) + Number(b);
}
或者,可能是:
function AddOnlyTwoNumbers(a, b)
{
if (isNaN(a) || isNaN(b))
return false;
return Number(a) + Number(b);
}
如果我这样调用它:
Sum = AddTwoNumbers(5, " dogs");
Javascript自动将5转换为字符串,并追加它们,以返回“5只狗”。
并不是所有的动态语言都像javascript一样宽容(事实上,动态语言并不意味着松散的类型语言(参见Python)),其中一些语言实际上会在无效的类型转换上给你一个运行时错误。
虽然它很方便,但它会给您带来很多容易被忽略的错误,只有通过测试正在运行的程序才能识别出来。就我个人而言,我更喜欢让编译器告诉我是否犯了这个错误。
现在,回到c#…
c#支持一种叫做协方差的语言特性,这基本上意味着你可以用基类型替换子类型,而不会导致错误,例如:
public class Foo : Bar
{
}
在这里,我创建了一个新类(Foo),它是Bar的子类。我现在可以创建一个方法:
void DoSomething(Bar myBar)
并使用Foo或Bar作为参数调用它,两者都不会引起错误。这是因为c#知道Bar的任何子类都将实现Bar的接口。
然而,你不能做相反的事情:
void DoSomething(Foo myFoo)
在这种情况下,我不能将Bar传递给这个方法,因为编译器不知道Bar实现了Foo的接口。这是因为子类可以(而且通常会)与父类有很大不同。
当然,现在我已经走得太远了,超出了最初问题的范围,但知道这些都是好事:)
为了更好地理解,请观看下面的视频,该视频演示了类型安全语言(c#)和非类型安全语言(javascript)的代码。
http://www.youtube.com/watch?v=Rlw_njQhkxw
现在来看长文本。
类型安全意味着防止类型错误。当一种类型的数据类型在不知不觉中被分配给另一种类型时,就会发生类型错误,我们会得到不想要的结果。
例如,JavaScript不是一种类型安全语言。在下面的代码中,“num”是一个数值变量,“str”是字符串。Javascript允许我做“num + str”,现在猜测将它做算术或串联。
现在对于下面的代码,结果是“55”,但重要的一点是,它将执行什么样的操作造成了混乱。
这是因为javascript不是一种类型安全的语言。它允许不受限制地将一种类型的数据设置为另一种类型。
<script>
var num = 5; // numeric
var str = "5"; // string
var z = num + str; // arthimetic or concat ????
alert(z); // displays “55”
</script>
c#是一种类型安全语言。它不允许将一种数据类型分配给另一种数据类型。下面的代码不允许在不同的数据类型上使用“+”运算符。
“类型安全”的编程语言意味着以下几点:
不能从未初始化的变量中读取 数组的索引不能超出它们的边界 不能执行未检查的类型强制转换
类型安全意味着在编程上,变量、返回值或参数的数据类型必须符合特定的标准。
实际上,这意味着7(整数类型)不同于"7"(字符串类型的引号字符)。
PHP, Javascript和其他动态脚本语言通常是弱类型的,因为它们将转换(字符串)如果您尝试将“7”+ 3添加为“7”到(整数)7,尽管有时您必须显式地这样做(Javascript使用“+”字符进行连接)。
C/ c++ /Java不会理解,或者会将结果连接到“73”中。类型安全通过明确类型需求来防止代码中出现这些类型的错误。
类型安全非常有用。上述“7”+ 3的解决方案是类型转换(int)7 + 3(等于10)。