最初分配的变量

时间:2013-04-15 20:09:08

标签: c# variables variable-assignment

最初分配以下两类变量:

  • 类实例的实例变量。

  • 最初分配的结构变量的实例变量。

现在最初分配的结构变量意味着什么?

我们不是在谈论局部变量,对吧?那么我们讨论的是函数成员定义中使用的字段变量(在这两个类别中)?

澄清这一点真的很感激。并提前感谢!

3 个答案:

答案 0 :(得分:8)

  

最初分配以下两类变量:(1)类实例的实例变量和(2)最初分配的结构变量的实例变量。 “最初分配的结构变量”是什么意思?

它表示最初分配的struct type 变量。

跟着。

class C 
{
    public int i;
}
...
C c = new C();
Console.WriteLine(c.i);

c.i是类的实例变量,因此最初已分配

struct S 
{
    public int j;
}
class D 
{
    public S t;
}
...
D d = new D();
Console.WriteLine(d.t.j);

d.t是类的实例变量,因此最初是分配的。 d.t.j是结构S的实例变量,最初为d.t类型的变量S分配,因此最初也会分配d.t.j

也就是说,如果保存结构值的变量最初是本身,则最初会分配结构的字段。

相比之下:

void M()
{
    int q;
    Console.WriteLine(q); // Error
    S u;
    Console.WriteLine(u.j); // Error

最初未分配qu;他们不是任何阶级的领域。由于最初未分配u,因此u.j也不是。

现在有意义吗?

答案 1 :(得分:1)

你的问题不是很清楚。但是,始终认为分配了类或结构的字段(实例或静态)是正确的。它将具有类型的默认值,对于引用类型和可空类型,它是null,对于其他值类型,它将为“零”或类似于零的值。

相比之下,局部变量,即在方法(或构造函数或访问器等)中声明的变量必须在使用之前显式赋值。

在示例中:

class Example
{
    int field;

    void Method()
    {
        int local;
        ...
        ...
    }
}

field被认为是自动分配的,并且将具有初始值0,而变量local是未分配,必须(在后面的方法相同的方法)被分配给前它可以使用(甚至稍后用同样的方法)。

但是,未分配的局部变量可以作为方法的out参数传递。

编辑:(在有用的评论之后)

上面我的回答给出了类(静态和非静态)字段和结构静态字段的非常精确的描述。但正如评论所指出的那样,在结构的实例字段的情况下,遗漏了一些东西。

在完全分配所有实例字段时,将完全分配struct实例。鉴于以下(可变!!)结构:

struct SomeStruct
{
    public int AlphaField;
    public int BetaField;
}

然后以下是合法的:

void M()
{
    SomeStruct localSS;
    // localSS and its fields are not assigned, and can't be read yet

    localSS.AlphaField = 7;           // legal
    int useA = localSS.AlphaField;    // legal, AlphaField is assigned
    // localSS and its remaining field BetaField are not assigned

    localSS.BetaField = 13;
    string useB = localSS.ToString(); // legal, localSS variable is now fully assigned
}

即使上面的例子看起来很疯狂(因为大多数人都不鼓励使用可变结构),它仍然完全等同于结构的用户定义的实例构造函数中发生的事情。的C#规范使用这样的句子:一个结构的实例构造函数的this变量的行为完全一样的结构的out参数类型特别地,这意味着变量必须在实例构造函数的每个执行路径中明确赋值。

请注意,struct的实例构造函数分配所有字段的一种方法是使用: this(...)构造函数链接语法链接另一个实例构造函数。

另请注意,结构的实例构造函数必须带参数。表达式new SomeStruct()(带有空参数列表)等同于default(SomeStruct),并计算为明确分配的SomeStruct实例,其中所有字段都有其默认值。

答案 2 :(得分:-1)

类(在C#中)是引用类型的定义。这意味着该类的任何成员都存储为引用。

struct(在C#中)是值类型的定义。此类的任何成员都存储为值,而不是作为引用。

引用类型可以取消分配,因为在使用它们之前不需要分配它们。使用未分配的类实例成员将导致运行时错误。

值类型需要存储值,否则它们将无法确定其内存空间。使用未分配的struct成员会导致编译时错误。