【问题标题】:Is C# a strongly typed or a weakly typed language? [duplicate]C# 是强类型语言还是弱类型语言? [复制]
【发布时间】:2013-02-03 11:00:27
【问题描述】:

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

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

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

【问题讨论】:

  • 投反对票的人是否想给出一个理由,以便@Mrshll187 知道将来要避免做什么?
  • @Servy,不,我想我正在寻找更多。您可能会注意到 Mrshll187 也发表了评论,说他在 google 上搜索并没有得到很好的结果。谷歌搜索然后如果你没有运气来这里似乎是一个非常合理的方法。顺便说一句,我认为像你这样的冷嘲热讽让我们所有人花时间尝试帮助人们的地方都不那么愉快了。我敢肯定你不在乎,但那是我的两分钱。干杯。
  • @Mrshll187:本可以在你原来的问题中这样说,而不是让我们问。
  • @AbeMiessler 好吧,谷歌搜索这个问题的确切标题会产生几个结果,这些结果非常清楚地回答了我心中的这个问题。如果 OP 无法理解他看到的结果,那么他应该更详细地解释他的发现、他为什么感到困惑等等。事实上,这个问题清楚地表明没有研究工作。如果您觉得给出的 cmets 不够详细,那么也许您可以自己提供该细节,或者要求其他人提供更详细的信息,而不是假装没有人提供任何 cmets。
  • Uhhh...that's 不是我上一条评论所指的。

标签: c# strong-typing weakly-typed


【解决方案1】:

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

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

是的。

这没什么用。

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

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

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

我很困惑。

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

嗯。我实际上不知道这些术语是什么意思,所以也许这就是我应该问的问题。它的真正含义是什么 一种语言是“弱类型”还是“强类型”?

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

【讨论】:

  • @Mrshll187 好吧,这是我唯一没有说明可证明错误的答案栏。考虑到所提出的问题,这里的所有内容肯定与预期的一样正确。当您搜索答案时,该链接也应该在 Google 中为您显示。
  • 维基百科几乎证实“强类型”和“弱类型”通常没有任何意义,一个用来赞美语言,另一个用来批评它。那篇文章比大多数人都更有主见。
【解决方案2】:

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

【讨论】:

  • 为什么要否决这个答案。这是完全正确的。如果您选择投反对票,请发表评论。这样我就可以理解你为什么不喜欢这个答案了。
  • There isn't any if's/and's/but's to this argument." 好吧,由于“强类型”没有明确的含义,因此无法说明它是否适用于给定的语言。
  • 我给了你一个赞成票,但我猜 dw 来自你断言“这个论点没有任何 if's/and's/but's。”我可以给你一些线索,说明为什么这不是一件好事你在断言某事。第二:肯定有如果和但是:如果 SO 保持其几乎恒定的质量水平,请参阅 Gideon 的答案,该答案将很快被接受。
  • 感谢您的精彩反馈。我已经根据反馈调整了我的答案。也许我可以把这些积分赚回来。
  • 您引用的强类型定义并不是特别有意义,我认为现有的任何语言都不符合它的标准。这也不是一个普遍认同的定义。请注意,dynamic 专门告诉编译器停止进行类型检查,因此您以后定义的类型检查由编译器完成是违反了它的存在。
【解决方案3】:

一般:C#使用是一种强类型化的方式,意思:一个变量被声明为一个特定的Type(或者: string, int, 用户定义的类型等),以后不能被赋予不同类型的值。

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

int i = 10;
i = "ten";

和下面的 cmets 一样,C# 可以以不同的方式使用。

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

【讨论】:

  • 根据该定义,不可能有非强类型的语言,因为所有变量几乎总是属于某种类型,例如表示“任何东西”的变体。
  • @Servy 也许我不清楚。我的意思是变量将被永久设置为某种类型。与 JavaScript 相反,其中变量可以是字符串,然后是 int 等。
  • 你的意思是在 C# 中我可以将字符串分配给object 类型的变量,然后再分配int 给它?
  • 实际上,即使使用object,C# 也是部分强类型的——你不能简单地引用变量的属性。例如不能先设置object i = "ten";再获取i.Length
  • @ispiro 如果您使用dynamic,您可以。同样,您可以使用强制转换来告诉编译器从i 中的对象中获取Length 属性。事实上,从本质上讲,强制类型转换违反了强类型。它的全部目的是让你违反编译器的类型系统。
【解决方案4】:

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

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

【讨论】:

  • 然而,在许多地方,C# 允许您所说的“鸭子类型”是非强类型语言的一个特征。最常见的例子是foreach 循环,它适用于任何具有GetEnumerator 方法的对象。
  • @Plynx 实际上是这样;它基于名称/签名,而不是特定的接口。其他示例包括 LINQ 和 await
  • @Plynx(带有您的评论编辑)不,您不正确。 foreach 不需要这些接口。这些接口保证这些签名,但即使没有它们,该功能也能正常工作。
  • @Plynx 认为 (foreach) 从 C# 1.2 开始就是这种情况,甚至可能在此之前(我手头没有 1.0 规范)。 LINQ 出现在 3.5 中。
  • 请注意,这只是一个示例,也是众所周知的示例。还有很多其他的。 Marc 提到了一些,当然还有dynamic,除此之外,unsafe 代码中可以做的所有事情都可以完全破坏对托管代码中程序状态的任何假设。跨度>
【解决方案5】:

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

【讨论】:

  • 这就是存在票数接近的原因:P
  • @BoltClock 好吧,答案是没有答案,而不是“我们谁都无法弄清楚答案是什么”。对于为什么没有任何答案,实际上可以给出一个相当好的解释,这就是为什么我没有投票结束。
【解决方案6】:

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

【讨论】:

  • MSDN 也是错误的,因为编写一个非强类型的 C# 程序是微不足道的。 C#可以编写强类型程序,但没有什么强迫你这样做。
猜你喜欢
  • 2023-03-11
  • 2014-02-03
  • 1970-01-01
  • 2016-05-10
  • 2018-11-12
  • 2015-08-15
  • 2012-12-12
  • 2018-08-05
  • 2010-10-05
相关资源
最近更新 更多