声明和初始化变量

时间:2015-06-12 20:10:26

标签: 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;
    private void Form1_Load(object sender, EventArgs e)
    {
        b = "something";
    }

我一直在寻找答案,为什么我们不能使用第一种方式。但是我找不到答案。

4 个答案:

答案 0 :(得分:1)

在C#中,一个类可以包含以下成员的声明......

Constructors Destructors Constants Fields Methods Properties Indexers Operators Events Delegates Classes Interfaces Structs

为变量赋值将被视为statement。同样,陈述也被分类为各种类型。 现在,您的问题在Declaration statementsExpression statements之间产生了混淆。

声明声明:声明声明用于引入fields,其中常量字段需要分配,而变量则是可选的。从技术上讲,Declaration statements使用Expression statements作为其中的一部分。

表达式语句:另一方面,表达式语句的职责是将值赋给变量。但创建一个变量不是它的责任。

因此,为了声明类Declaration Statements的字段和常量,请参考并在技术上将Expression Statements作为其中的一部分。但是独立Expression Statements以及其他语句只能是方法,属性或事件声明的一部分。

您可以从here获取有关课程的更多信息 以及来自here

的陈述

答案 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”移动到某些方法,包括构造函数。内部初始化代码在创建新对象时运行,在调用构造函数之前,我们可以将其视为构造函数的一部分。