Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#变量的声明_C#_Memory_Declaration - Fatal编程技术网

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

我从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没有值

现在点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
    class
    :将内存空间擦除为所有0,然后调用任何自定义构造函数,这也可能涉及字段初始值设定项
  • 在没有自定义构造函数的情况下调用的
    struct
    :内存空间被擦除为所有0
  • 使用自定义构造函数调用的
    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
    class
    :将内存空间擦除为所有0,然后调用任何自定义构造函数,这也可能涉及字段初始值设定项
  • 在没有自定义构造函数的情况下调用的
    struct
    :内存空间被擦除为所有0
  • 使用自定义构造函数调用的
    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中使用的值