我用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的结构。 Beacuse struct是一种值类型,它再次在计算机上为它保留了内存。 Howewer x和y没有价值。
Now Point p1 = new Point(); // what is happening here?
Struct不是引用类型。那么这只是使用默认构造函数初始化Point变量而不将值赋给x和y?
第二个简短的问题。当我编写如下代码时:
int x = 10;
我可以说我创建了类整数的实例,其值为10且名称为x; 我很感激你的帮助。
答案 0 :(得分:4)
//这里发生了什么? Struct不是引用类型。那么这只是使用默认构造函数初始化Point变量而不将值赋给x和y?
没有;这里有4种可能的情况:
class
:将内存空间擦除到全0,然后调用任何自定义构造函数,这也可能涉及字段初始值设定项struct
:将内存空间擦除为全0 struct
名为,自定义构造函数:自定义构造函数 是 分配所有字段struct
变量在没有调用构造函数的情况下使用:这实际上是一个东西,但是调用代码必须写入所有字段才能用它做任何其他事情;由于大多数结构都不暴露它们的领域,这很少有效第二个简短的问题。当我写一个代码,如:
int x = 10;
我可以说我创建了类整数的实例,其值为10并且命名为x;我很感激你的帮助。
不是真的,因为在C#术语中,int
不是一个类(它可能是IL术语)。简单地说:您已声明名为int
的{{1}}类型的局部变量,并为其指定了值x
,如果这是在方法中。如果这是一个类字段,那么:您已声明一个名为10
的{{1}}类型的私有实例字段,其字段初始值设定值为int
。
顺便说一句,你应该避免一般的公共字段和结构上的可变字段。您可能更喜欢:
x
这将避免一系列问题。
答案 1 :(得分:1)
在C#中,默认的struct构造函数将struct memory设置为0,有效地将所有变量设置为默认值。
如果是int
s,则为0
。对于参考类型,它将产生null
。
(换句话说,对于任何类型T
,它都是default(T)
)。
请注意,在结构中编写自定义构造函数时,必须初始化所有成员字段。
答案 2 :(得分:1)
当你写作
int x;
这类似于
Point p1 = new Point();
(已经定义了Point结构)
在这两种情况下,所有整数变量都将具有默认值0而不是null,这基本上是在C#中用来表示“无”,并且只能分配给引用类型。
同样,在c#中,一切都是一个类,所以当你写的时候
int x = 10;
你正在创建一个类Int32
的实例,尽管运行时将把它作为值类型而不是ref类型处理,视特殊情况而定。
其他基本类型也是如此,Long, DateTime
和其他几个