5

有人可以澄清一下 C# 是强类型语言还是弱类型语言?并解释原因。

如果我有一个concat可以接受任何对象的函数,那么这是否被认为是弱类型?

function concat(Object stuff)
{
   //do something here to stuff
}
4

6 回答 6

19

来自http://ericlippert.com/2012/10/15/is-ca-strongly-typed-or-a-weakly-typed-language/

C# 是强类型语言还是弱类型语言?

是的。

那是没有帮助的。

我不怀疑。有趣的是,如果您将问题改写为“和”问题,答案将是相同的。

什么?你的意思是,C# 是强类型语言还是弱类型语言?

是的,C# 是一种强类型语言和一种弱类型语言。

我很困惑。

我也是。也许您应该准确地告诉我“强类型”和“弱类型”是什么意思。

嗯。我实际上并不知道这些术语是什么意思,所以也许这就是我应该问的问题。“弱类型”或“强类型”的语言到底意味着什么?

“弱类型”的意思是“这种语言使用了一种我觉得讨厌的类型验证系统”,而“强类型”的意思是“这种语言使用了一种我觉得很有吸引力的类型系统”。

于 2013-02-18T22:00:28.173 回答
11

C# 是强类型的。

ECMA-334 将 C# 定义为“C#(发音为“C Sharp”)是一种简单、现代、面向对象和类型安全的编程语言。

维基百科定义类型安全

类型安全是强类型的众多定义之一。但是类型安全和动态类型是相互兼容的。

维基百科将强类型定义为

在计算机科学和计算机编程中,当一个类型系统指定一个或多个对涉及不同数据类型值的操作如何混合的限制时,就被称为具有强类型化特征。强类型的反面是弱类型。

也许最好问问 C# 是否是一种类型安全的语言,因为如果编译器会进行类型检查,没有人可以就“强类型”和“弱类型”的真正含义达成一致。

C# 确实有一些动态语言,例如可用的构造,但值得注意的是,这些在编译时仍然是类型安全的。

从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式类型var。隐式类型的局部变量是强类型的,就像您自己声明了类型一样,但编译器确定类型。

http://msdn.microsoft.com/en-us/library/bb383973.aspx

关键字基本上以相同的dynamic方式工作,只是它在运行时而不是在编译时进行评估,就像var.

Visual C# 2010 引入了一种新类型动态。该类型是静态类型,但动态类型的对象绕过静态类型检查。在大多数情况下,它的功能就像它具有类型对象一样。在编译时,假定类型为动态的元素支持任何操作。

http://msdn.microsoft.com/en-us/library/dd264736.aspx

于 2013-02-18T22:07:31.853 回答
5

一般来说:C#以强类型的方式使用,意味着:变量被声明为特定的Type(字符串、int、用户定义的类型等),以后不能被赋予不同类型的值.

例如:在 C# 中不能有以下内容:

int i = 10;
i = "ten";

正如下面的评论,C#可以有不同的使用方式。

使用“强”类型可以让编辑器/编译器提醒您注意错误,并让编辑器给您提供缩小到您可能需要的建议。

于 2013-02-18T22:07:42.483 回答
2

是 C# 编译器的主要开发人员之一(在他写这篇文章的时候)关于这个主题的博客文章。

简而言之,这个问题本身是有缺陷的,不能以目前的形式得到合理的回答。

于 2013-02-18T21:59:17.673 回答
2

强类型和弱类型的定义有很多很多,以至于您需要在使用它时定义术语的含义。我觉得有用的一个定义是“语言是否强制我为参数之类的东西指定类型?” 这将诸如 C# 之类的语言与另一侧分隔开来,而将 Javascript 与另一侧分隔开来,我觉得这种区别很有用。

要求某人命名一个类型而不是依赖于诸如“鸭子类型”之类的东西在静态分析中创造了优势,但在指定共享通用功能的类型时却是不利的。出于这个原因,这些语言中的许多语言都发展出精细的类型关系规范系统,通常首先是基于类的编程,然后是精细的模板系统推理系统,以便程序员可以说诸如“类型 A 是类型 B 的子集”或“类型 C是一种元类型,可以应用于满足条件 D 和 E" 等的任何其他类型。

于 2013-02-18T22:03:47.230 回答
1

根据MSDN,C# 是一种强类型语言。

于 2013-02-18T21:59:52.930 回答