[英]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,从而有效地将所有变量设置为其默认值。
如果是int
, int
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.