什么是types安全的?

“types安全”是什么意思?

types安全意味着编译器将在编译时validationtypes,如果尝试将错误types指定给variables,则会引发错误。

一些简单的例子:

// Fails, Trying to put an integer in a string String one = 1; // Also fails. int foo = "bar"; 

这也适用于方法参数,因为您将显式types传递给它们:

 int AddTwoNumbers(int a, int b) { return a + b; } 

如果我试图使用以下方式调用它:

 int Sum = AddTwoNumbers(5, "5"); 

编译器会抛出一个错误,因为我传递一个string(“5”),并且期待一个整数。

在松散types的语言,如JavaScript,我可以做到以下几点:

 function AddTwoNumbers(a, b) { return a + b; } 

如果我这样称呼它:

 Sum = AddTwoNumbers(5, "5"); 

JavaScript自动将5转换为一个string,并返回“55”。 这是由于JavaScript使用+号来进行string连接。 为了使其具有types意识,您需要执行以下操作:

 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转换为一个string,并追加它们,返回“5只狗”。

并不是所有的dynamic语言都像javascript一样宽容(事实上dynamic语言并不意味着松散的types语言(参见Python)),其中一些实际上会给无效types转换带来运行时错误。

尽pipe它很方便,但它却为您提供了很多容易遗漏的错误,只有通过testing正在运行的程序才能识别出来。 就我个人而言,我更喜欢让我的编译器告诉我是否犯了这个错误。

现在,回到C#…

C#支持称为协变的语言特性,这基本上意味着你可以用一个基typesreplace一个子types而不会导致错误,例如:

  public class Foo : Bar { } 

在这里,我创build了一个新的类(Foo),它是Bar的子类。 我现在可以创build一个方法:

  void DoSomething(Bar myBar) 

并用Foo或Bar作为参数来调用它们,两者都可以工作而不会导致错误。 这是有效的,因为C#知道Bar的任何子类将实现Bar的接口。

但是,你不能做相反的事情:

 void DoSomething(Foo myFoo) 

在这种情况下,我不能将Bar传递给这个方法,因为编译器不知道Bar实现了Foo的接口。 这是因为一个子类可以(通常会)和父类非常不同。

当然,现在我已经远离了原始问题的范围,但它的所有好东西知道:)

这里有许多答案将types安全与静态types和dynamictypes混淆起来。 dynamictypes语言(如smalltalk)也可以是types安全的。

简短的回答:如果没有操作导致未定义的行为,则语言被认为是types安全的。 许多人认为语言的显式types转换是严格键入的必要条件,因为自动转换有时会导致定义明确但意想不到的/不直观的行为。

不要将types安全与静态/dynamictypes或强/弱types混淆。

一个types安全的语言就是一个可以在数据上执行的唯一操作是数据types所允许的操作。 也就是说,如果你的数据是Xtypes的,而X不支持y操作,那么语言将不允许你执行y(X)

这个定义在检查没有设定规则。 它可以在编译时(静态types)或运行时(dynamictypes),通常是通过例外。 它可以是两个:一些静态types的语言允许你将数据从一个types转换到另一个types,转换的有效性必须在运行时检查(假设你正试图将一个Object转换为Consumer – 编译器无法知道它是否可以接受)。

types安全并不一定意味着强types,或者 – 某些语言的types很差,但仍然可以说是types安全的。 以Javascript为例:它的types系统就像它来的那样薄弱,但仍然严格定义。 它允许自动投射数据(比如string到整数),但是在定义好的规则中。 据我所知,没有一个Javascript程序会以不确定的方式运行,如果你足够聪明(我没有),你应该能够预测读取Javascript代码时会发生什么。

一个types不安全的编程语言的例子是C:读取/写入数组边界之外的数组值具有未定义的行为。 预测会发生什么是不可能的。 C是一种具有types系统的语言,但不是types安全的。

一个文科专业的解释,而不是一个科学专业:

当人们说语言或语言function是types安全的时,它们意味着语言将有助于防止您将某些不是整数的内容传递给某个期望为整数的逻辑。

例如,在C#中,我将一个函数定义为:

  void foo(int arg) 

编译器会阻止我这样做:

  // call foo foo("hello world") 

在其他语言中,编译器不会阻止我(或者没有编译器…),所以string将被传递给逻辑,然后可能会发生不好的事情。

types安全的语言试图更多地了解“编译时”。

另一方面,types安全的语言,当你有一个像“123”的string,你想像一个int一样操作,你必须编写更多的代码来将string转换为一个int,或者当你有一个int像123,并希望使用它的消息,如“答案是123”,你必须编写更多的代码转换/转换为一个string。

types安全是指以编程方式,variables,返回值或参数的数据types必须符合特定标准。

实际上,这意味着7(整数types)不同于“7”(一个带引号的stringtypes)。

PHP,Javascript和其他dynamic脚本语言通常是弱types的,因为如果你尝试添加“7”+ 3,它们会将(string)“7”转换为(整数)7,尽pipe有时你必须这样做显式地(和Javascript使用“+”string联)。

C / C ++ / Java不会理解,或者将结果连接成“73”。 types安全通过明确types要求来防止代码中的这些types的错误。

types安全是非常有用的。 上述“7”+ 3的解决办法是inputcast(int)“7”+ 3(等于10)。

为了得到更好的理解,请观看下面的video演示types安全语言(C#)的代码和不键入安全语言(JavaScript)。

http://www.youtube.com/watch?v=Rlw_njQhkxw

现在的长文本。

types安全意味着防止types错误。 当一种types的数据types被分配给其他typesUNKNOWINGLY时会发生types错误,并且我们得到不希望的结果。

例如,JavaScript不是一种安全的语言。 在下面的代码中,“num”是一个数字variables,“str”是string。 Javascript允许我做“num + str”,现在GUESS会做算术或连接。

现在对于下面的代码结果是“55”,但重要的一点是混淆创造了什么样的操作,它会做。

这是因为JavaScript不是一种types安全的语言。 它允许将一种types的数据设置为另一种types而没有任何限制。

 <script> var num = 5; // numeric var str = "5"; // string var z = num + str; // arthimetic or concat ???? alert(z); // displays “55” </script> 

C#是一种types安全的语言。 它不允许将一种数据types分配给其他数据types。 下面的代码不允许在不同的数据types上使用“+”运算符。

在这里输入图像描述

一种“types安全”的编程语言意味着以下几点:

  1. 您无法读取未初始化的variables
  2. 你不能将数组索引超出范围
  3. 你不能执行未经检查的types转换

试试这个解释…

TypeSafe意味着在编译时对variables进行静态检查以便进行适当的分配。 例如,consder是一个string或一个整数。 这两种不同的数据types不能交叉分配(即,不能将整数分配给string,也不能将string分配给整数)。

对于非types安全的行为,请考虑这一点:

 object x = 89; int y; 

如果你尝试这样做:

 y = x; 

编译器会抛出一个错误,说它不能将System.Object转换为Integer。 你需要明确地做到这一点。 一种方法是:

 y = Convert.ToInt32( x ); 

上面的任务不是types安全的。 types安全分配是types可以直接分配给对方的地方。

ASP.NET中没有types安全的集合(例如,应用程序,会话和视图状态集合)。 关于这些集合的好消息是(尽量减less多个服务器状态pipe理的考虑因素),你可以在三个集合中的任何一个中放置几乎所有的数据types。 坏消息是:因为这些集合不是types安全的,所以当你把它们取出来的时候,你需要适当的转换这些值。

例如:

 Session[ "x" ] = 34; 

工作正常。 但要分配整数值,你需要:

 int i = Convert.ToInt32( Session[ "x" ] ); 

阅读有关generics的方法,帮助您轻松实现types安全集合。

C#是一种types安全的语言,但注意关于C#4.0的文章; 有趣的dynamic可能性织机(这是一件好事,C#本质上是得到选项严格:关…我们会看到)。

types安全是仅访问其被授权访问的存储器位置的代码,并且只能以定义明确,允许的方式访问。 types安全的代码无法对该对象无效的对象执行操作。 C#和VB.NET语言编译器总是生成types安全的代码,在JIT编译期间validation它是types安全的。

types安全意味着可以分配给程序variables的一组值必须符合定义明确且可testing的标准。 types安全variables导致更强大的程序,因为操作variables的algorithm可以相信variables只会采取定义明确的一组值。 保持这种信任确保了数据和程序的完整性和质量。

对于许多variables,可以分配给variables的一组值在程序写入时定义。 例如,称为“颜色”的variables可以被允许呈现“红色”,“绿色”或“蓝色”的值,并且从不具有任何其他值。 对于其他variables,这些标准在运行时可能会发生变化。 例如,一个名为“color”的variables只能被允许在关系数据库的“Colors”表的“name”列中取值,其中“red”,“green”和“blue”是三个值对于“颜色”表中的“名称”,但在程序运行时,计算机程序的某些其他部分可以添加到该列表中,并且该variables在添加到颜色表后可以采用新的值。

许多types安全的语言通过坚持严格定义variables的types,只允许为variables赋予相同的“types”的值,从而给出“types安全”的错觉。 这种方法有几个问题。 例如,一个程序可能有一个variables“yearOfBirth”,这是一个人出生的年份,并且很容易将其输出为一个短整数。 但是,它不是一个短整数。 今年,这个数字是小于2009年,大于-10000。 然而,随着程序的运行,这个集合每年增长1个。 使这个“短整”是不够的。 使这个variablestypes安全所需的是一个运行时validation函数,确保该数字总是大于-10000且小于下一个日历年。 没有编译器可以执行这样的标准,因为这些标准始终是问题域的唯一特征。

使用dynamictypes(或鸭式打字,或明文input)的语言,如Perl,Python,Ruby,SQLite和Lua没有types化variables的概念。 这迫使程序员为每个variables编写一个运行时validation程序,以确保它是正确的,或忍受不明原因的运行时exception的后果。 根据我的经验,像C,C ++,Java和C#这样的静态types语言的程序员往往认为静态定义types是他们需要做的,以获得types安全的好处。 对许多有用的计算机程序来说这是不正确的,而且很难预测对于任何特定的计算机程序是否是真的。

长与短….你想要types安全吗? 如果是这样,那么编写运行时函数来确保当一个variables被赋值时,它符合明确的标准。 不利的一面是,它使大多数计算机程序的域分析变得非常困难,因为你必须明确地定义每个程序variables的标准。