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

时间:2013-02-18 21:58:01

标签: c# strong-typing weakly-typed

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

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

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

6 个答案:

答案 0 :(得分:15)

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

  

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

     

     

这无济于事。

     

我不怀疑。有趣的是,如果你把这个问题重新定义为   “和”问题,答案是一样的。

     

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

     

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

     

我很困惑。

     

我也是。也许你应该准确地告诉我你的意思   “强烈打字”和“弱打字”。

     

<强>庵。我实际上并不知道这些术语的含义,所以也许这就是我应该问的问题。它到底意味着什么?   一种语言是“弱类型”还是“强类型”?

     

“弱键入”表示“此语言使用类型验证系统   我发现令人反感的“和”强烈打字“意味着”这种语言   使用我觉得有吸引力的类型系统“。

答案 1 :(得分:9)

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

答案 2 :(得分:4)

一般:C#以强类型方式 使用,含义:声明一个特定Type的变量(要么:字符串,整数,用户定义的类型等),以后不能为其分配不同类型的值。

例如:您在C#中无法获得以下内容:

int i = 10;
i = "ten";

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

使用&#34; strong&#34;打字让编辑器/编辑器提醒你错误,并让编辑器给你建议范围缩小到你可能需要的东西。

答案 3 :(得分:2)

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

简而言之,问题本身存在缺陷,无法以目前的形式得到合理回答。

答案 4 :(得分:2)

strongly typed和弱类型的定义有很多很多,以至于您需要在使用它时定义术语的含义。我认为有用的定义是“语言是否强迫我为参数之类的东西指定类型?”这将C#等语言分离到一边,将Javascript分离到另一方,这是我觉得有用的区别。 / p>

要求某人命名类型而不是依赖“鸭子打字”之类的东西会在静态分析中产生优势,但在指定共享常用功能的类型时会有缺点。出于这个原因,许多这些语言都发展出精心设计的类型关系规范系统,通常是第一个基于类的编程以及后来精心设计的模板系统推理系统所以程序员可以说“类型A是类型B的子集”或“类型C是可以应用于满足条件D和E的任何其他类型的元类型”等等。

答案 5 :(得分:1)

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