C# 声明和初始化变量
我想知道为什么我们不能这样做:C# 声明和初始化变量,c#,.net,variables,visual-studio-2012,variable-declaration,C#,.net,Variables,Visual Studio 2012,Variable Declaration,我想知道为什么我们不能这样做: public partial class Form1 : Form { string b; b = "something"; public Form1() { InitializeComponent(); } 然而,我能够做到这一点: public partial class Form1 : Form { string b = "something"; 或 我一直在寻找答案,为什么我们不能用第一种
public partial class Form1 : Form
{
string b;
b = "something";
public Form1()
{
InitializeComponent();
}
然而,我能够做到这一点:
public partial class Form1 : Form
{
string b = "something";
或
我一直在寻找答案,为什么我们不能用第一种方法呢。但是我还没有找到答案。在C#中,一个类可以包含以下成员的声明
构造函数
析构函数
常数
领域
方法
性质
索引器
操作员
事件
代表
班级
接口
结构
将值赋给变量被视为语句
。同样,语句也被分类为各种类型。
现在,您的问题引起了声明语句
和表达式语句
之间的混淆
声明语句:声明语句用于引入字段
,其中常量字段需要赋值,变量字段可选赋值。从技术上讲,声明语句
使用表达式语句
作为其一部分
表达式语句:另一方面,表达式语句的职责是为变量赋值。但创建一个变量并不是它的责任
因此,为了声明类的字段和常量,声明语句
参与其中,并且从技术上讲,将表达式语句
作为其一部分。但是独立的表达式语句
以及其他语句只能是方法、属性或事件声明的一部分
您可以从中获得有关该类的更多信息
关于本声明中的声明:
string b;
b = "something";
string b = "something";
是一个初始化语句。类主体中只允许初始化和声明/定义
本声明:
string b;
b = "something";
string b = "something";
是赋值语句,一种表达式类型。它实际上“返回”了一些东西,b
本声明:
string b;
b = "something";
string b = "something";
这也是一个初始化语句。你之所以可以写这个,但不能写赋值语句,是因为c#的形式语言不允许你写。我还没有看到正式的语言定义,但我想它看起来像这样
InitializationStatement => TypeExpression Symbol {AssignmentExpressionStatement | ';'}
AssignmentExpressionStatement => '=' EvaluatableExpression ';'
花括号表示里面的内容是可选的,而管道表示或。
这就是使语言成为编译器可以理解的语言的原因。这些规则越灵活,为它编写编译器就越困难,为它编写开发软件就越困难,代码就越混乱
TLDR:您不能将它们放入,原因与您不能将2+2放入类声明相同 我一直在寻找答案,为什么我们不能用第一种方法呢 嗯,基本上是因为C#团队认为这样做不是个好主意,或者因为他们一开始就没有这个想法 但是让我们先说一下: 当然,您可以将其作为功能请求。在这一点上,他们将平衡赞成者和反对者。让我们这样做,并考虑下面的代码:
public class Foo
{
int x = 12;
int y;
y = 12 + MyMethod();
public Foo()
{
y = MyMethod();
}
public int MyMethod()
{
//***
return x + 1;
}
}
现在,初始化Foo时将调用构造函数Foo
。那么,初始化后,y
的值是多少?我们会调用多少次MyMethod?如果我们添加第二个构造函数会发生什么
我想说这是相当令人困惑的,所有这些困惑其实都不是必要的,因为有一些好的构造(“构造函数”和字段赋值缩写)已经允许您使用大约相同数量的代码来做必要的事情
所以有缺点,没有优点
总之,我不希望在我的代码中包含这些类型的构造,这就是为什么我怀疑这是否会得到支持。在C语言中,可执行表达式应该驻留在方法中。类本身不是可执行的。它们为对象提供了如何行为的蓝图。类只能具有、方法和属性。在C#属性中,类中还允许事件和委托。但在内部,属性、事件和委托也是方法和变量
public partial class Form1 : Form
{
string b;
b = "something";
public Form1()
{
InitializeComponent();
}
}
在这里,字符串b;是一个变量声明。b=“something”是一个可执行表达式。因此,您不能直接在类中包含b=“something”。
但是字符串b=“某物”;是一种称为初始化的特殊语法。这是用C语言定义的。否则,您应该将b=“something”移动到包含构造函数的某个方法。内部初始化代码在创建新对象时运行,然后调用构造函数,我们可以将其视为构造函数的一部分。
b
是与类Form1
关联的字段,而不是正常意义上的变量。只能在方法、属性或构造函数中重新分配变量。我相信有一个更为技术性的解释涉及C语言规范。当您在一个步骤中声明和初始化时,该值被指定为声明的一部分。正如@ryanyyu所说,b=“某物”代码>是一个完整的语句,它在执行语句的正常构造之外。“b=”something“;”是语句,并且语句不能存在于方法、属性或事件声明之外。你不能把它放在你拥有它的地方,而不仅仅是在那里有一个if
语句。