Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 声明和初始化变量_C#_.net_Variables_Visual Studio 2012_Variable Declaration - Fatal编程技术网

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
语句。