我想知道为什么我们不能这样做:
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;
private void Form1_Load(object sender, EventArgs e)
{
b = "something";
}
我一直在寻找答案,为什么我们不能使用第一种方式。但是我找不到答案。
答案 0 :(得分:1)
在C#中,一个类可以包含以下成员的声明......
Constructors
Destructors
Constants
Fields
Methods
Properties
Indexers
Operators
Events
Delegates
Classes
Interfaces
Structs
为变量赋值将被视为statement
。同样,陈述也被分类为各种类型。
现在,您的问题在Declaration statements
和Expression statements
之间产生了混淆。
声明声明:声明声明用于引入fields
,其中常量字段需要分配,而变量则是可选的。从技术上讲,Declaration statements
使用Expression statements
作为其中的一部分。
表达式语句:另一方面,表达式语句的职责是将值赋给变量。但创建一个变量不是它的责任。
因此,为了声明类Declaration Statements
的字段和常量,请参考并在技术上将Expression Statements
作为其中的一部分。但是独立Expression Statements
以及其他语句只能是方法,属性或事件声明的一部分。
答案 1 :(得分:1)
我一直在寻找答案,为什么我们不能使用第一种方式。
好吧,主要是因为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?如果我们添加第二个构造函数会发生什么?
我说这很混乱,所有这些混乱并不是必需的,因为有很好的结构(“构造函数”和字段赋值缩写)已经允许你用相同数量的代码做必要的事情。
所以有缺点,没有专业人士。
总而言之,我不希望在我的代码中使用这些类型的构造,这就是为什么我怀疑这将得到支持。
答案 2 :(得分:0)
本声明:
string b;
是一个初始化语句。在类体中只允许初始化和声明/定义。
本声明:
b = "something";
是赋值语句,一种表达式。它实际上“返回”了一些东西,b。
本声明:
string b = "something";
这也是一个初始化语句。你可以写这个,但不是赋值语句的原因是因为c#的形式语言不允许你。我没有看到正式的语言定义,但我想它看起来像这样
InitializationStatement => TypeExpression Symbol {AssignmentExpressionStatement | ';'}
AssignmentExpressionStatement => '=' EvaluatableExpression ';'
花括号表示内部是可选的,管道是指或。 这使得该语言成为编译器可以理解的语言。这些规则越灵活,编译器就越难,为它制作开发软件越困难,代码就越混乱。
TLDR:你不能因为你不能在课堂声明中加入2 + 2而将它们放入。
答案 3 :(得分:0)
在C#语言中,可执行表达式应该驻留在方法中。类本身不可执行。它们为对象提供了如何表现的蓝图。类只能有方法和属性。在C#属性中,类中也允许使用事件和委托。但内部属性,事件和委托也是方法和变量。
public partial class Form1 : Form
{
string b;
b = "something";
public Form1()
{
InitializeComponent();
}
}
在这里,字符串b;是一个变量声明。 b =“something”是一个可执行的表达式。所以你不能直接在课堂上使用b =“something”。 但字符串b =“某事”;是一种称为初始化的特殊语法。这是用C#语言定义的。否则你应该将b =“something”移动到某些方法,包括构造函数。内部初始化代码在创建新对象时运行,在调用构造函数之前,我们可以将其视为构造函数的一部分。