c#变量声明
本文关键字:声明 变量 | 更新日期: 2023-09-27 18:17:20
我开始了我的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是一种值类型,所以它在计算机上也为它保留了内存。但是x和y没有值。
Now Point p1 = new Point(); // what is happening here?
Struct不是引用类型。所以这只是初始化点变量与默认构造函数没有分配值给x和y吗?
第二个简短问题。当我写这样的代码:
int x = 10;
我可以说我创建了integer类的实例,其值为10,名称为x;如果你能帮助我,我会很感激的。
//这里发生了什么?结构不是引用类型。所以这只是初始化点变量与默认构造函数没有分配值给x和y吗?
没有;这里有4种可能的情况:
- a
class
:内存空间被擦除到所有0,然后调用任何自定义构造函数,这也可能涉及字段初始化器 - 一个没有自定义构造函数的
struct
调用:内存空间被擦除到所有0 - 一个
struct
调用与一个自定义构造函数:自定义构造函数是必需的分配所有字段 - 一个
struct
变量,不调用构造函数:这实际上是一个东西,但是调用代码必须写到所有的字段,然后才能对它做任何其他事情;因为大多数结构体不公开它们的字段,所以这很少起作用
第二个简短问题。当我写这样的代码:
int x = 10;
我可以说我创建了一个integer类的实例,其值为10,名称为x;如果你能帮助我,我会很感激的。
不完全是,因为在c#术语中,int
不是一个类(它可能在IL术语中)。简单地说:您已经声明了一个名称为x
的int
类型的局部变量,并将其赋值为10
(如果这是在方法中)。如果这是一个类字段,那么:你已经声明了一个int
类型的私有实例字段,命名为x
,字段初始化器给它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#中,默认的结构构造函数将结构内存设置为0,有效地将所有变量设置为默认值。
如果是int
s,则为0
。对于引用类型,它将产生null
。
(换句话说,对于任何类型T
,它将是default(T)
)。
注意,当你在struct中编写自定义构造函数时,必须初始化所有成员字段。
当你写int x;
这与Point p1 = new Point();
(考虑到Point结构已经定义)
在这两种情况下,所有整数变量的默认值都是0而不是null,这基本上是c#中用来表示"无"的,并且只能赋值给引用类型。
同样,在c#中一切都是一个类,所以当你写int x = 10;
你正在创建一个Int32
类的实例,尽管运行时将把它作为值类型而不是ref类型来处理,作为特殊情况。
对于其他基本类型,如Long, DateTime
和少数其他类型也是如此