C#变量声明

时间:2014-08-08 14:18:57

标签: 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 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;  我很感激你的帮助。

3 个答案:

答案 0 :(得分:4)

  

//这里发生了什么? Struct不是引用类型。那么这只是使用默认构造函数初始化Point变量而不将值赋给x和y?

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

  • a 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和其他几个