为什么C#是静态类型的?

为什么C#是静态类型的?,c#,static-typing,C#,Static Typing,我是一名PHP网络程序员,正在努力学习C 我想知道为什么C#要求我在创建变量时指定数据类型 Class classInstance = new Class(); 为什么我们需要知道类实例之前的数据类型?,因为C是强类型的语言< /P> < P> C是一个语言,如C语言或C++语言。在这些语言中,所有变量都必须声明为特定类型。< P> C是一种强类型语言,如C++或java。因此,它需要知道变量的类型。在c#3.0中,您可以通过var关键字对其进行一些篡改。这让编译器推断出类型。这就是强类型语言

我是一名PHP网络程序员,正在努力学习C

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

Class classInstance = new Class();

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

,因为C是强类型的语言< /P> < P> C是一个语言,如C语言或C++语言。在这些语言中,所有变量都必须声明为特定类型。

< P> C是一种强类型语言,如C++或java。因此,它需要知道变量的类型。在c#3.0中,您可以通过var关键字对其进行一些篡改。这让编译器推断出类型。

这就是强类型语言和弱类型语言的区别。C++(C,C++,java,最强大的语言)是强类型的,所以必须声明变量类型。

前面需要[class名字],因为有很多情况下第一个[类名]不同于第二个类,比如:

 IMyCoolInterface obj = new MyInterfaceImplementer();
 MyBaseType obj2 = new MySubTypeOfBaseType();

如果不想明确指定类型,也可以使用“var”一词。

这只是语言的设计方式。C#是一种C风格的语言,它遵循在左边有类型的模式

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

var variable = new SomeClass();
但同时你也可以争辩说你仍然在LHS上声明一个类型。只是希望编译器为您选择它

编辑

请结合用户的原始问题阅读本文

为什么在变量名之前需要[class name]

我想在这篇文章中对其他几个答案发表评论。很多人给出了“C#是静态类型”的答案。虽然这句话是真的(C#是静态类型的),但它几乎与问题完全无关。静态类型不需要类型名位于变量名的左侧。当然,这会有所帮助,但这是语言设计者的选择,而不是静态类型语言的必要特性


通过考虑其他静态类型语言(如F#),这些问题很容易得到证明。F#中的类型出现在变量名的右侧,并且通常可以一起输入。还有几个反例。例如,PowerShell非常动态,并且将其所有类型(如果包括)都放在左侧

当我们定义变量来保存数据时,我们必须指定这些变量将保存的数据类型。然后,编译器检查我们对数据所做的操作是否对它有意义,即遵循规则。例如,我们不能将文本存储在一个数字中——编译器将不允许这样做

int a = "fred"; // Not allowed. Cannot implicitly convert 'string' to 'int' 
变量a的类型为int,将其赋值为文本字符串“fred”违反了规则-编译器无法对此字符串进行任何类型的转换。

在C#3.0中,您可以使用“var”关键字-这使用静态类型推断来计算编译时变量的类型

var foo = new ClassName();

从那时起,变量“foo”将是“ClassName”类型。

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

例如,给定以下类型:

class Foo { }
class Bar : Foo { }
interface IBaz { }
class Baz : IBaz { }
C#允许您执行以下操作:

Foo f = new Bar();
IBaz b = new Baz();
是的,在大多数情况下,编译器可以从赋值中推断变量的类型(如使用
var
关键字),但由于我上面所示的原因,它不能推断变量的类型

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

C#,正如其他人所指出的,是一种强静态类型语言

通过预先声明要创建的类型,当您尝试分配非法值时,将收到编译时警告。通过预先说明在方法中接受哪种类型的参数,当您意外地将无意义传递给不需要它的方法时,您会收到同样的编译时警告。它代表你消除了一些妄想症的负担

最后,很好地说,C#(和许多其他语言)不像PHP那样具有荒谬的“将任何东西转换成任何东西,即使它没有意义”的思维方式,坦白说,这会让你绊倒很多次,而不会有任何帮助。

正如其他人所说,C#是静态/强类型的。但我认为你的问题更像是“为什么你希望C#像这样是静态/强类型的?与动态语言相比,它有什么优势?”

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

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

    例如,这可能就是为什么Microsoft的样式指南建议VB6程序员使用变量名作为类型前缀,而VB.Net程序员不这样做的原因

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

    我不愿意把这一点包括在内,因为ultima
     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);
     }
    
       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