我是一名试图学习C#的PHP网络程序员.
我想知道为什么C#要求我在创建变量时指定数据类型.
Class classInstance = new Class();
Run Code Online (Sandbox Code Playgroud)
为什么我们需要在类实例之前知道数据类型?
Joe*_*orn 107
正如其他人所说,C#是静态/强类型的.但我更多地提出你的问题是"为什么你希望 C#像这样静态/强类型?这对动态语言有什么优势?"
考虑到这一点,有很多很好的理由:
可读性/可维护性您现在提供有关代码如何适用于未来开发人员的更多信息.您添加特定变量旨在保存某种值的信息,这有助于程序员推断该变量的用途.
这可能就是为什么,例如,微软的风格指南建议VB6程序员使用变量名称添加类型前缀,但VB.Net程序员不这样做.
性能这是最薄弱的原因,但后期绑定/鸭子打字可能会更慢.最后,变量指的是以某种特定方式构造的内存.如果没有强类型,程序将不得不在运行时在幕后进行额外的类型验证或转换,因为您使用的是一种物理结构的内存,就像它在逻辑上以另一种方式构造一样.
我不愿意包括这一点,因为最终你经常需要用强类型语言进行这些转换.只是强类型语言将转换的确切时间和范围留给程序员,除非需要完成,否则不需要额外的工作.它还允许程序员强制使用更有利的数据类型.但这些确实是程序员的属性,而不是平台.
除了优秀的动态语言通常会比程序员做出更好的选择之外,这本身就是忽略这一点的一个弱理由.这意味着动态语言可以帮助许多程序员编写更快的程序.不过,对于优秀的程序员来说,强类型语言有可能更快.
或许你只是想知道为什么你必须为同一行上的同一个变量指定两次类名?答案是双重的:
var中,在许多情况下,您可以使用关键字而不是类型名称.以这种方式创建的变量仍然是静态类型的,但现在编译器会为您推断出类型.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++语言.在这些语言中,必须将所有变量声明为特定类型.
你需要[class name],因为有很多情况下第一个[class name]与第二个不同,比如:
IMyCoolInterface obj = new MyInterfaceImplementer();
MyBaseType obj2 = new MySubTypeOfBaseType();
Run Code Online (Sandbox Code Playgroud)
如果您不想明确指定类型,也可以使用"var"一词.
| 归档时间: |
|
| 查看次数: |
14577 次 |
| 最近记录: |