首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始赋值变量

初始赋值变量
EN

Stack Overflow用户
提问于 2013-04-15 20:09:08
回答 3查看 553关注 0票数 3

最初分配了以下两类变量:

  • 类实例的实例变量。
  • 初始赋值结构变量的实例变量。

现在,最初赋值的结构变量意味着什么?

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

澄清这一点将是非常感谢的。提前谢谢!

EN

回答 3

Stack Overflow用户

发布于 2013-04-15 20:59:47

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

它意味着结构类型的初始赋值变量。

跟着走。

代码语言:javascript
复制
class C 
{
    public int i;
}
...
C c = new C();
Console.WriteLine(c.i);

c.i是类的一个实例变量,因此它最初是被分配的。

代码语言:javascript
复制
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的实例变量,而类型S的变量d.t最初是赋值的,因此d.t.j也是最初分配的。

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

相比之下:

代码语言:javascript
复制
void M()
{
    int q;
    Console.WriteLine(q); // Error
    S u;
    Console.WriteLine(u.j); // Error

最初没有分配qu;它们不是任何类的字段。由于最初没有分配u,所以也没有分配u.j

现在说得通了?

票数 8
EN

Stack Overflow用户

发布于 2013-04-15 20:13:50

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

相反,局部变量,即在方法(或构造函数或访问器等)中声明的变量。必须在使用前显式分配给它。

在本例中:

代码语言:javascript
复制
class Example
{
    int field;

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

field被认为是自动赋值的,并且将具有初始值0,而变量local是未赋值的,必须分配给(稍后在同一方法中),然后才能使用它(甚至以后在同一方法中)。

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

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

我上面的答案给出了类的(静态和非静态)字段和结构的静态字段的相当精确的描述。但是,正如评论所指出的,在结构的实例字段中,缺少了一些东西。

当结构实例的所有实例字段都被完全分配时,结构实例将被完全赋值。给出以下内容(可变!!)结构:

代码语言:javascript
复制
struct SomeStruct
{
    public int AlphaField;
    public int BetaField;
}

那么,以下内容是合法的:

代码语言:javascript
复制
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参数完全相同--特别是,这意味着必须在实例构造函数的每个执行路径中明确分配变量。

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

还请注意,结构的实例构造函数必须接受参数。表达式new SomeStruct() (带有空参数列表)等价于default(SomeStruct),并计算为指定的SomeStruct实例,其中所有字段都有其默认值。

票数 1
EN

Stack Overflow用户

发布于 2013-04-15 20:13:21

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

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

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16023890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档