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;如果你能帮助我,我会很感激的。

c#变量声明

//这里发生了什么?结构不是引用类型。所以这只是初始化点变量与默认构造函数没有分配值给x和y吗?

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

  • a class:内存空间被擦除到所有0,然后调用任何自定义构造函数,这也可能涉及字段初始化器
  • 一个没有自定义构造函数的struct调用:内存空间被擦除到所有0
  • 一个struct调用一个自定义构造函数:自定义构造函数是必需的分配所有字段
  • 一个struct变量,不调用构造函数:这实际上是一个东西,但是调用代码必须写到所有的字段,然后才能对它做任何其他事情;因为大多数结构体不公开它们的字段,所以这很少起作用

第二个简短问题。当我写这样的代码:

   int x = 10;

我可以说我创建了一个integer类的实例,其值为10,名称为x;如果你能帮助我,我会很感激的。

不完全是,因为在c#术语中,int不是一个类(它可能在IL术语中)。简单地说:您已经声明了一个名称为xint类型的局部变量,并将其赋值为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和少数其他类型也是如此