为什么C#是静态输入的?

Moo*_*oon 31 c# static-typing

我是一名试图学习C#的PHP网络程序员.

我想知道为什么C#要求我在创建变量时指定数据类型.

Class classInstance = new Class();
Run Code Online (Sandbox Code Playgroud)

为什么我们需要在类实例之前知道数据类型?

Joe*_*orn 107

正如其他人所说,C#是静态/强类型的.但我更多地提出你的问题是"为什么你希望 C#像这样静态/强类型?这对动态语言有什么优势?"

考虑到这一点,有很多很好的理由:

  • 稳定性现在,在代码使其接近生产之前,编译器会自动捕获某些类型的错误.
  • 可读性/可维护性您现在提供有关代码如何适用于未来开发人员的更多信息.您添加特定变量旨在保存某种值的信息,这有助于程序员推断该变量的用途.

    这可能就是为什么,例如,微软的风格指南建议VB6程序员使用变量名称添加类型前缀,但VB.Net程序员不这样做.

  • 性能这是最薄弱的原因,但后期绑定/鸭子打字可能会更慢.最后,变量指的是以某种特定方式构造的内存.如果没有强类型,程序将不得不在运行时在幕后进行额外的类型验证或转换,因为您使用的是一种物理结构的内存,就像它在逻辑上以另一种方式构造一样.

    我不愿意包括这一点,因为最终你经常需要用强类型语言进行这些转换.只是强类型语言将转换的确切时间和范围留给程序员,除非需要完成,否则不需要额外的工作.它还允许程序员强制使用更有利的数据类型.但这些确实是程序员的属性,而不是平台.

    除了优秀的动态语言通常会比程序员做出更好的选择之外,这本身就是忽略这一点的一个弱理由.这意味着动态语言可以帮助许多程序员编写更快的程序.不过,对于优秀的程序员来说,强类型语言有可能更快.

  • 更好的开发工具如果您的IDE知道变量的类型,它可以为您提供有关变量可以执行哪些操作的额外帮助.如果必须为您推断类型,IDE就更难做到这一点.如果您从IDE获得API的细节更多帮助,那么作为开发人员,您将能够了解更大,更丰富的API,并更快地实现目标.

或许你只是想知道为什么你必须为同一行上的同一个变量指定两次类名?答案是双重的:

  1. 通常你不这样做.在C#3.0及更高版本var中,在许多情况下,您可以使用关键字而不是类型名称.以这种方式创建的变量仍然是静态类型的,但现在编译器会为您推断出类型.
  2. 由于继承和接口,有时左侧的类型与右侧的类型不匹配.

  • 不,但C#同时做到了. (15认同)
  • 静态和强类型不是一回事 (11认同)
  • +1这是一个非常周到和简洁的答案. (9认同)

Jar*_*Par 23

它只是语言的设计方式.C#是一种C风格的语言,遵循左侧类型的模式.

在C#3.0及更高版本中,您可以通过本地类型推断在很多情况下解决这个问题.

var variable = new SomeClass();
Run Code Online (Sandbox Code Playgroud)

但与此同时,你也可以争辩说你仍然在LHS上声明了一种类型.只是你希望编译器为你挑选它.

编辑

请在用户原始问题的上下文中阅读此内容

为什么我们在变量名之前需要[类名]?

我想在这个帖子中评论其他几个答案.很多人都把"C#静态类型"作为答案.虽然声明是真的(C#是静态类型的),但它几乎完全与问题无关.静态类型不需要在变量名左侧使用类型名称.当然它可以提供帮助,但这是语言设计者的选择,而不是静态类型语言的必要功能.

通过考虑其他静态类型语言(如F#),可以很容易地证明这些.F#中的类型出现在变量名的右侧,并且通常可以完全省略.还有几个反例.例如,PowerShell是非常动态的,如果包含它,则将其所有类型放在左侧.


And*_*are 21

其中一个主要原因是您可以指定不同的类型,只要赋值左侧的类型是左侧类型的父类型(或在该类型上实现的接口).

例如,给出以下类型:

class Foo { }
class Bar : Foo { }
interface IBaz { }
class Baz : IBaz { }
Run Code Online (Sandbox Code Playgroud)

C#允许您这样做:

Foo f = new Bar();
IBaz b = new Baz();
Run Code Online (Sandbox Code Playgroud)

是的,在大多数情况下,编译器可以从赋值中推断出变量的类型(就像使用var关键字一样),但它不是出于我上面所示的原因.

编辑:作为一个程序问题 - 虽然C#强类型的,但重要的区别(就这个讨论而言)是它实际上也是一种静态类型的语言.换句话说,C#编译器在编译时进行静态类型检查.


Jus*_*ier 16

C#是静态类型的,强类型,如C或C++语言.在这些语言中,必须将所有变量声明为特定类型.

  • C#无论是静态还是强类型的事实都没有回答为什么类型必须在LHS上的问题.这些都是无关的问题.以F#或OCaml为例.两者都是非常强大和静态类型的,但是程序可以在没有明确键入变量的情况下编写,如果声明它是在右侧. (10认同)
  • 我们称它为静态类型;-) (5认同)
  • 好的一点是,这些语言是强类型的动态类型检查(IE,运行时).而C#需要类型,因此它可以在编译时执行类型检查(IE,静态检查). (3认同)
  • JavaScript不是强类型的,它是弱类型的."1"+ 0将导致"10"(连接). (3认同)
  • 编辑以涵盖静态类型 (2认同)

LeW*_*ody 9

最终因为Anders Hejlsberg这么说......


GWL*_*osa 5

你需要[class name],因为有很多情况下第一个[class name]与第二个不同,比如:

 IMyCoolInterface obj = new MyInterfaceImplementer();
 MyBaseType obj2 = new MySubTypeOfBaseType();
Run Code Online (Sandbox Code Playgroud)

如果您不想明确指定类型,也可以使用"var"一词.

  • QUESTION不是"为什么C#是静态输入的".问题是:"为什么我必须指定[classname]两次?" 这个答案是:"因为它并不总是多余的." 其他人回答"其静态类型"的事实并没有提出"为什么C#是静态类型的". (4认同)
  • 当然,当我输入时,我注意到问题已被编辑.大无所事事. (3认同)