Language agnostic 什么是类型安全?

Language agnostic 什么是类型安全?,language-agnostic,programming-languages,computer-science,terminology,type-safety,Language Agnostic,Programming Languages,Computer Science,Terminology,Type Safety,“类型安全”是什么意思?类型安全意味着编译器将在编译时验证类型,如果您试图将错误类型分配给变量,则会抛出错误 一些简单的例子: // 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; } 如果我尝试使用以下方

“类型安全”是什么意思?

类型安全意味着编译器将在编译时验证类型,如果您试图将错误类型分配给变量,则会抛出错误

一些简单的例子:

// 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");
Sum = AddTwoNumbers(5, " dogs");
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, "5");
Sum = AddTwoNumbers(5, " dogs");
Javascript自动将5转换为字符串,并附加它们,以返回“5只狗”

并非所有的动态语言都像javascript那样宽容(事实上,动态语言并不隐含着松散类型的语言(请参见Python)),其中一些语言实际上会在无效类型转换时给您一个运行时错误

虽然它很方便,但它会让您遇到许多容易忽略的错误,并且只能通过测试正在运行的程序来识别这些错误。就我个人而言,如果我犯了那个错误,我宁愿让我的编译器告诉我

现在,回到C#

C#支持名为的语言功能,这基本上意味着您可以用基类型替换子类型,而不会导致错误,例如:

 public class Foo : Bar
 {
 }
Session[ "x" ] = 34;
在这里,我创建了一个新类(Foo),它是Bar的子类。我现在可以创建一个方法:

 void DoSomething(Bar myBar)
并使用Foo或Bar作为参数来调用它,两者都不会导致错误。这是因为C#知道Bar的任何子类都将实现Bar的接口

但是,您不能执行相反的操作:

void DoSomething(Foo myFoo)
在这种情况下,我不能将Bar传递给这个方法,因为编译器不知道Bar实现了Foo的接口。这是因为子类可以(并且通常会)与父类有很大的不同


当然,现在我已经偏离了问题的深层次,超出了原始问题的范围,但要知道这一切都是好事:)

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

当人们说一种语言或语言功能是类型安全的时,他们的意思是该语言将帮助阻止您,例如,将非整数的内容传递给需要整数的逻辑

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

 void foo(int arg)
编译器将阻止我执行以下操作:

  // call foo
  foo("hello world")
在其他语言中,编译器不会阻止我(或者没有编译器…),因此字符串将被传递到逻辑,然后可能会发生不好的事情

类型安全语言试图在“编译时”捕获更多信息


另一方面,对于类型安全语言,当您有一个像“123”这样的字符串,并且希望像int一样对其进行操作时,您必须编写更多的代码来将该字符串转换为int,或者当您有一个像123这样的int,并且希望在“答案是123”这样的消息中使用它时,您必须编写更多代码才能将其转换/强制转换为字符串。

请在

TypeSafe意味着在编译时静态检查变量是否有适当的赋值。例如,输入字符串或整数。这两种不同的数据类型不能交叉分配(即,不能将整数分配给字符串,也不能将字符串分配给整数)

对于非类型行为,考虑如下:

object x = 89;
int y;
如果您试图这样做:

y = x;
编译器抛出一个错误,表示无法将System.Object转换为整数。你需要明确地这样做。一种方法是:

y = Convert.ToInt32( x );
上面的作业不是类型安全的。类型安全分配是类型可以直接相互分配的地方

ASP.NET中存在大量非类型安全集合(例如,应用程序、会话和viewstate集合)。关于这些集合的好消息是(最小化多个服务器状态管理注意事项),您可以在三个集合中的任何一个集合中放置几乎任何数据类型。坏消息是:因为这些集合不是类型安全的,所以在取出它们时需要适当地强制转换这些值

例如:

 public class Foo : Bar
 {
 }
Session[ "x" ] = 34;
很好。但要重新分配整数值,您需要:

int i = Convert.ToInt32( Session[ "x" ] );
阅读泛型,了解该工具可以帮助您轻松实现类型安全集合的方法


C#是一种类型安全的语言,但请注意有关C#4.0的文章;有趣的动态可能性隐现(C#本质上变得选项严格是件好事吗:Off…我们将拭目以待)。

类型安全意味着以编程方式,变量、返回值或参数的数据类型必须符合特定标准

实际上,这意味着7(整数类型)不同于“7”(字符串类型的带引号的字符)

PHP、Javascript和其他动态脚本语言通常是弱类型的,因为如果您尝试添加“7”+3,它们会将(字符串)“7”转换为(整数)7,尽管有时您必须显式地这样做(Javascript使用“+”字符进行连接)

C/C++/Java将不理解这一点,或者将结果连接到“73”中。类型安全性通过明确类型要求来防止代码中出现这些类型的错误


类型安全性非常有用。上述“7”+3的解决方案是类型转换(int)“7”+3(等于10)。

类型安全意味着可能分配给程序变量的一组值必须符合定义良好且可测试的标准。类型安全变量导致更健壮的程序,因为操纵变量的算法可以相信变量将只接受定义良好的一组值中的一个。保持这种信任可以确保数据和程序的完整性和质量

对于许多变量