题
我是一个PHP网站编程人员试图了解。
我想知道为什么C#要求我指定的数据类型当创建一个可变的。
Class classInstance = new Class();
为什么我们需要知道的数据类型之前的一类实例?
解决方案
正如其他人所说,C# 是静态/强类型的。但我认为你的问题更多的是“你为什么要 想 C# 像这样是静态/强类型的吗?与动态语言相比,这有什么优势?”
考虑到这一点,有很多充分的理由:
- 稳定 现在,在代码接近生产之前,编译器会自动捕获某些类型的错误。
可读性/可维护性 您现在向未来阅读该代码的开发人员提供有关该代码如何工作的更多信息。您添加特定变量旨在保存某种值的信息,这可以帮助程序员推断该变量的用途。
这可能就是为什么,例如,Microsoft 的风格指南建议 VB6 程序员在变量名中添加类型前缀,但 VB.Net 程序员则不然。
表现 这是最弱的原因,但后期绑定/鸭子打字可能会更慢。最后,变量是指以某种特定方式构造的内存。如果没有强类型,程序将不得不在运行时在幕后进行额外的类型验证或转换,因为您使用的内存在物理上以一种方式构造,就像在逻辑上以另一种方式构造一样。
我犹豫是否要包括这一点,因为最终您通常还必须使用强类型语言进行这些转换。只是强类型语言把转换的确切时机和范围留给了程序员,除非需要做,否则不做额外的工作。它还允许程序员强制使用更有利的数据类型。但这些确实是 程序员, ,而不是平台。
这本身就是忽略这一点的弱理由,除非良好的动态语言通常会比程序员做出更好的选择。这意味着动态语言可以帮助许多程序员编写更快的程序。尽管如此,为了 好的 程序员,强类型语言有 潜在的 更快。
- 更好的开发工具 如果您的 IDE 知道变量的预期类型,它可以为您提供有关该变量可以执行哪些操作的额外帮助。如果 IDE 必须为您推断类型,那么这对于 IDE 来说要困难得多。如果您从 IDE 获得有关 API 细节的更多帮助,那么作为开发人员,您将能够了解更大、更丰富的 API,并更快地实现目标。
或者您可能只是想知道为什么必须为同一行上的同一变量指定两次类名?答案有两个:
- 通常你不会。在 C# 3.0 及更高版本中,您可以使用
var
在许多情况下,关键字而不是类型名称。以这种方式创建的变量仍然是静态类型的,但类型现在是 推断 由编译器为您提供。 - 由于继承和接口,有时左侧的类型与右侧的类型不匹配。
其他提示
这是语言无非是如何设计的。 C#为C风格的语言和在左侧具有类型的图案如下:
在C#3.0和高达你可以种解决这个问题在许多情况下局部类型推理。
var variable = new SomeClass();
但在同一时间,你也可以说,你仍然宣布在LHS一个类型。只是你希望编译器来接它。
修改强>
请在用户原来的问题的情况下阅读本
为什么我们需要一个变量名前[类名]
我想在这个线程其他几个答案发表评论。很多人都给予“C#是静态类型”作为回答。虽然声明是真实的(C#是静态类型),它几乎是完全无关的问题。静态类型没有必要类型名称是在变量名的左侧。当然它可以帮助但这是一个语言设计者的选择不是静态类型语言的必要特征。
这些是通过考虑其他静态类型语言如F#容易证明的。在F#类型出现在变量名的权利,往往可以完全ommitted。也有一些相反的例子。 PowerShell的例如是非常动态的,并把它的所有类型的,如果包含的话,就离开了。
其中一个主要的原因是,可以只要指定不同类型为对分配的左手边的类型被在左侧(或即在该类型实现的接口)的类型的父类型。
例如给出下面的类型:
class Foo { }
class Bar : Foo { }
interface IBaz { }
class Baz : IBaz { }
C#允许你这样做:
Foo f = new Bar();
IBaz b = new Baz();
是,在大多数情况下,编译器的能从分配推断变量的类型(如使用的 var
强>关键字),但它不为原因,我已经如上所示。
编辑:作为一个程序问题 - 而C#的是的强类型的重要区别(就这个讨论而言)是,它实际上也一个的 静态类型 强>语言。换句话说,C#编译器静态类型在编译时检查。
最终因为安德斯·海尔斯伯格这么说...
您需要[类名]在前面,因为有许多情况,其中第一个[类名]是不同于第二,如:
IMyCoolInterface obj = new MyInterfaceImplementer();
MyBaseType obj2 = new MySubTypeOfBaseType();
等。您还可以使用单词“变种”如果你不想显式地指定类型。
为什么我们需要知道数据类型 的前强>一个类的实例?
您不要! 从右至左读。您创建变量,然后将它保存在一个类型安全的变量,所以你知道什么类型的变量供以后使用。
考虑下面的代码片段,这将是一场噩梦调试,如果你没有收到错误,直到运行时。
void FunctionCalledVeryUnfrequently()
{
ClassA a = new ClassA();
ClassB b = new ClassB();
ClassA a2 = new ClassB(); //COMPILER ERROR(thank god)
//100 lines of code
DoStuffWithA(a);
DoStuffWithA(b); //COMPILER ERROR(thank god)
DoStuffWithA(a2);
}
在找你以为你可以用一个数字或字符串,其语法替换的新的Class()将使更多的意义。下面的例子可能有点冗长,但可能有助于理解为什么它的设计是它的方式。
string s = "abc";
string s2 = new string(new char[]{'a', 'b', 'c'});
//Does exactly the same thing
DoStuffWithAString("abc");
DoStuffWithAString(new string(new char[]{'a', 'b', 'c'}));
//Does exactly the same thing
C#,正如其他人指出的那样,是一种强,静态类型语言。
这说明了什么前面你打算创建类型,您会收到编译时警告,当您尝试分配的非法值。通过说明前面是什么类型的,你的方法接受参数,您会收到那些相同的编译时间警告,当你不小心通过废话到未预料到的方法。它消除了代表你的一些偏执的开销。
最后,也是相当好听,C#(和许多其他语言)不具有相同的可笑,“转换什么东西,即使它没有意义”的心态,PHP确实,这很坦率地说可以绊倒你向上的次数超过它帮助。
由于C#是强类型语言
C#是一个强类型语言,如C ++或Java。因此,它需要知道变量的类型。您可以通过var关键字捏造它在C#3.0中的位。这让编译器推断出的类型。
这是一个强类型和弱类型语言之间的差异。 C#(和C,C ++,Java中,最更强大的语言)是强类型的,所以你必须声明变量类型。
当我们定义变量来保存,我们必须指定数据的这些变量将保存的数据类型。然后,编译器检查,我们现在所用的数据做有意义的话,即遵循的规则。我们不能在一些例如存储文本 - 编译器不会允许它
int a = "fred"; // Not allowed. Cannot implicitly convert 'string' to 'int'
变量a是int类型的,和分配值“佛瑞德”,这是一个文本字符串打破基于规则编译器无法做任何类型的该字符串的转换。
在C#3.0中,你可以使用“变种”关键字 - 这种使用静态类型推断制定出变量的类型是在编译时什么
var foo = new ClassName();
变量“富”将是类型为“类名”从那时起。
还没有被提及的一种事情之一是,C#是一个CLS(通用语言规范)兼容的语言。这是一组规则,一个.NET语言具有粘附到在为了interopable与其他.NET语言。
所以,真正C#是只是保持这些规则。引用这个MSDN文章:
在CLS有助于提高和保证 通过定义语言互操作性 一组功能,开发者可以 依靠在宽的可利用 不同的语言。该CLS还 建立了CLS要求 合规性;这些帮助你确定 托管代码是否符合 在CLS和给定到什么程度 工具支持的发展 使用CLS特征托管代码。
如果您的组件仅使用CLS 它暴露的是API中的功能 其他代码(包括衍生 类),成分是保证 从任何编程访问 支持CLS语言。 即坚持以CLS组件 规则和仅使用功能 包含在CLS说是 符合CLS的组件
的CLS的一部分是CTS的通用类型系统。
如果这还不够的缩写你那么在.NET如CLI,ILASM / MSIL,CLR,BCL,整箱,
是一吨静态类型也允许编译器做出更好的优化,并跳过某些步骤。就拿超载例如,当你有多个方法或运营商使用相同的名称只能由他们的论点不同。使用动态语言,运行时需要等级每个版本,以确定哪个是最好的搭配。有了这样的静态语言,最终代码简单地直接指向适当的过载。
静态类型也有助于代码维护和重构。我最喜欢的例子是很多高端的IDE重命名功能。由于静态类型的IDE可以肯定地找到标识符的每一次出现在你的代码,并留下无关的标识具有相同的名称不变。
我没有注意到如果它尚未或没有提及,但C#4.0引入动态检查VIA的dynamic
关键字。虽然我敢肯定,你会希望避免它时,它不是必需的。
为什么C#要求我指定数据类型创建变量时。
为什么我们需要知道一个类的实例前的数据类型?
我想一两件事,大多数答案都没有提及的是,C#是原来的意思,并设计为“管理”,除其他事项外“安全”的语言和大量的那些目标通过静态的到达/编译时核查。知道了可变数据类型明确,使这个问题更容易解决。这意味着一个可以使几种自动评估(C#编译器,不JIT)有关可能的错误/不良的行为而没有允许执行。
这是可验证的副作用也给你更好的可读性,开发工具,稳定性等,因为如果自动算法可以更好地理解,而实际运行的代码会做什么,所以你也可以:)
静态类型意味着编译器可以在编译时不能在运行时执行某种检查。每个变量是在静态型尤其或强型的。 C#强烈绝对强类型。