C#变量的声明
我从C#开始了我的旅程,但我意识到,在变量声明方面,我在一些关于内存的基本信息方面存在一些问题。看看我是否正确C#变量的声明,c#,memory,declaration,C#,Memory,Declaration,我从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 k
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没有值
现在点p1=新点();//这里发生了什么?
Struct不是引用类型。那么,这只是使用默认构造函数初始化点变量,而不给x和y赋值吗
第二个简短的问题。当我编写代码时,如:
int x = 10;
int x = 10;
我可以说我创建了integer类的实例,值为10,名称为x;
非常感谢您的帮助。在C#中,默认结构构造函数将结构内存设置为0,有效地将所有变量设置为其默认值
在int
s的情况下,它将是0
。对于引用类型,它将导致null
(换句话说,对于任何类型的
T
,它都将是default(T)
)
请注意,在结构中编写自定义构造函数时,必须初始化所有成员字段。在C#中,默认结构构造函数将结构内存设置为0,有效地将所有变量设置为其默认值
在int
s的情况下,它将是0
。对于引用类型,它将导致null
(换句话说,对于任何类型的
T
,它都将是default(T)
)
请注意,在结构中编写自定义构造函数时,必须初始化所有成员字段
//这里发生了什么?结构不是引用类型。那么,这只是使用默认构造函数初始化点变量,而不给x和y赋值吗
没有;这里有4种可能的情况:
- a
:将内存空间擦除为所有0,然后调用任何自定义构造函数,这也可能涉及字段初始值设定项class
- 在没有自定义构造函数的情况下调用的
:内存空间被擦除为所有0struct
- 使用自定义构造函数调用的
:需要自定义构造函数来分配所有字段struct
- 一个
变量,在没有调用构造函数的情况下使用:这实际上是一件事,但调用代码必须先写入所有字段,然后才能对其执行任何其他操作;由于大多数结构不公开它们的字段,所以这种方法很少起作用struct
int x = 10;
int x = 10;
我可以说我创建了integer类的实例,值为10,名称为x;如果能得到帮助,我将不胜感激
不太可能,因为在C#术语中,int
不是一个类(它可能是IL术语)。简单地说:您已经声明了一个名为x
的int
类型的局部变量,并为其赋值10
,如果这是在方法中的话。如果这是一个类字段,那么:您已经声明了一个名为x
的int
类型的私有实例字段,字段初始值设定项将其值设置为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'; }
}
这将避免一系列的问题
//这里发生了什么?结构不是引用类型。那么,这只是使用默认构造函数初始化点变量,而不给x和y赋值吗
没有;这里有4种可能的情况:
- a
:将内存空间擦除为所有0,然后调用任何自定义构造函数,这也可能涉及字段初始值设定项class
- 在没有自定义构造函数的情况下调用的
:内存空间被擦除为所有0struct
- 使用自定义构造函数调用的
:需要自定义构造函数来分配所有字段struct
- 一个
变量,在没有调用构造函数的情况下使用:这实际上是一件事,但调用代码必须先写入所有字段,然后才能对其执行任何其他操作;由于大多数结构不公开它们的字段,所以这种方法很少起作用struct
int x = 10;
int x = 10;
我可以说我创建了integer类的实例,值为10,名称为x;如果能得到帮助,我将不胜感激
不太可能,因为在C#术语中,int
不是一个类(它可能是IL术语)。简单地说:您已经声明了一个名为x
的int
类型的局部变量,并为其赋值10
,如果这是在方法中的话。如果这是一个类字段,那么:您已经声明了一个名为x
的int
类型的私有实例字段,字段初始值设定项将其值设置为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'; }
}
这将避免大量问题。当您编写
intx代码>
这类似于
点p1=新点()代码>(考虑到已定义点结构)
在这两种情况下,所有整数变量的默认值均为0且不为null,这基本上就是C#中用于表示“nothing”的值,并且只能分配给引用类型
同样,在c#中,一切都是一个类,所以当你编写
intx=10代码>
您正在创建类Int32
的实例,尽管运行时会将其作为值类型处理,而不是作为特殊情况的ref类型
对于其他基本类型也是如此,例如,Long、DateTime
和很少其他类型
intx代码>
这类似于
点p1=新点()代码>(考虑到已定义点结构)
在这两种情况下,所有整数变量的默认值均为0且不为null,这基本上就是C#to中使用的值