繁体   English   中英

变量的C#声明

[英]C# declaration of variable

我从C#开始,但是我意识到在声明变量时,有关内存的一些基本信息存在一些问题。 看看我是否正确。

int x; // I declared variable of type int, which name is x. Compiler will provide memory for it but we dont have known value of it.
x=10; // Now memory location is still the same but value now kept there is 10;

public struct Point {
    public int x, y;
}

现在,我定义一个名为Point的结构。 由于struct是一个值类型,因此它在计算机上再次为其保留了内存。 Howewer x和y没有价值。

Now Point p1 = new Point(); // what is happening here? 结构不是引用类型。 那么,这仅仅是使用默认构造函数初始化Point变量,而没有将值分配给x和y吗?

第二个简短的问题。 当我编写如下代码时:

int x = 10;

我可以说我创建了一个整数类的实例,该实例的值为10,名称为x; 我将不胜感激。

//这里发生了什么? 结构不是引用类型。 那么,这仅仅是使用默认构造函数初始化Point变量,而没有将值分配给x和y吗?

没有; 这里有4种可能的情况:

  • 一个class :将内存空间擦除为全0,然后调用任何自定义构造函数,这也可能涉及字段初始化程序
  • 在没有自定义构造struct调用的结构:内存空间被擦除为全0
  • 自定义构造struct调用的结构: 需要自定义构造函数来分配所有字段
  • 无需调用构造struct使用的struct变量:这实际上是一件事,但是调用代码必须先写入所有字段,然后才能对其进行任何其他操作; 由于大多数结构都不会公开其字段,因此这种方法很少起作用

第二个简短的问题。 当我编写类似的代码时:

  int x = 10; 

我可以说我创建了一个整数类的实例,该实例的值为10,名称为x; 我将不胜感激。

并非如此,因为在C#术语中int不是类(它可能在IL术语中)。 简单来说:如果在方法中,您已经声明了一个名称为x int类型的局部变量,并为其分配了值10 如果这是一个类字段,则:您已经声明了一个名为x int类型的私有实例字段,并使用field-initializer为其赋予了10值。

顺便说一句,您应该避免一般使用公共字段,而应避免使用结构上的可变字段。 您可能更喜欢:

public struct Point {
    private readonly int x, y;
    public int X { get { return x; } }
    public int Y { get { return y; } }
    public Point(int x, int y) { this.x = x; this.y = y'; }
}

这样可以避免各种各样的问题。

在C#中,默认的struct构造函数将struct内存设置为0,从而有效地将所有变量设置为其默认值。

如果是intint 0 对于引用类型,它将导致null
(换句话说,对于任何类型T ,它将是default(T) )。

请注意,在结构中编写自定义构造函数时, 必须初始化所有成员字段。

当你写int x;

这类似于Point p1 = new Point(); (考虑到Point结构已经定义)

在这两种情况下,所有整数变量的默认值均为0,而不是null,这基本上是C#中用来表示“无”的值,并且只能分配给引用类型。

同样,在c#中,所有内容都是一个类,因此,当您编写int x = 10;

您正在创建Int32类的实例,尽管在特殊情况下运行时会将其作为值类型而不是ref类型进行处理。

其他基本类型(例如Long, DateTime和其他一些类型)也是如此

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM