C#基础--struct(结构体)

时间:2023-03-09 18:09:15
C#基础--struct(结构体)

结构体和类有点类似    我们定义一个类的时候    是class   类名   定义结构体的时候是 struct   结构体名

结构体的写法

 struct Point
    {
      //  public int x=10;   这种写法错误

        public int x ;

        public int y;

        public int X { get { return x; } set { x = value; } }

        public void SayHi()
        {
            Console.WriteLine("哈哈哈哈哈");
        }

        public Point(int x, int y)
        {

            this.y = y;

            this.X = x;  //不能为属性赋值   直接为字段赋值即可
        }

    }

结构体(struct) 和类(class)做比较

1. 结构体和类非常的相似.    结构体也是用来表示1类具有相同特征和行为的事物的.

2. 定义结构体的位置和类一样,在命名空间下.
       定义结构体的语法:
       struct 结构名称
       {

}

3. 结构体中可以定义字段.
     结构体中也可以定义方法.
     结构体中也可以定义属性
     结构体中也可以定义构造函数
     结构体只有创建对象,才可以使用对象中的成员.

4. 结构体与类到底有没有区别?
  1). 语法上的区别
        a. 定义结构体使用struct 定义类使用class
        b. 虽然结构体可以声明字段,但是在声明字段的时候不允许给字段初始值.
        c. 无参数的构造函数在结构体中总是自动存在的,所以我们不能写1个无参数的构造函数.
        d. 在结构体的构造函数中,要求为结构体对象的每1个字段赋值.
        e. 在构造函数中为属性赋值,并不认为是在为字段赋值. 要求在构造函数中直接为字段赋值.

f. 创建结构体对象 可以使用new关键字来创建,也可以不使用new关键字来创建.
         两种方式创建对象的区别.
            如果时候用new创建. 那么这个结构体对象的所有的字段就有值了. 因为new调用了构造函数,而结构体的构造函数要求为所有的字段赋值.
            就算我们调用无参数的构造函数创建对象,这个结构体对象的字段也是有值的,.所以我们不难猜出. 无参数的构造函数中为所有的字段赋默认值

如果不使用new创建. 因为没有调用构造函数, 所以这个结构体对象的字段是没有值的.
           所以在使用结构体对象的字段之前 必须要为字段赋值.

2). 结构体如何在内存中存储的?
    a. 在声明结构体变量的时候就已经在这个变量中创建好了结构体对象.
      new关键字在这里只是调用了构造函数

b. 结构体对象并不存储在堆空间中,而是存储在栈空间的变量之中.

所以结构体与类最大的区别. 结构体对象存储在栈空间中,类的对象存储在堆空间之中.

c. 结构体是值类型的. 因为结构体的对象直接存储在结构体变量中.

5. 为什么不运行为字段给初始值?
     因为就算我们为字段赋值,实际上编译器是将赋值的代码放到构造函数中去的,
     而我们创建结构体对象完全可以不调用构造函数

6. 结构体变量在相互赋值的时候. 是将源对象中的字段的值逐个的拷贝个目标对象的字段.

7. 什么时候使用结构体?
   a. 结构体对象的最大的特点 存储 在栈空间.
   b. 内存中栈空间比较小. 堆空间相对较大.
      栈空间中的数据访问速度相对较快.
     堆空间中的数据访问速度相对较慢.

c. 结构体是存储在栈空间中的.所以如果我们把对象以结构体的方式存储在栈中 那么访问速度就会快.
     但是如果结构体中有很多成员. 那么定义成结构体的话 就会在栈中占很多空间 反而会影响效率.

d. 当我们要表示1个轻量级对象(就是成员很少,特别是字段很少)的时候. 就可以定义为结构体 让其存储在栈中 提高效率.
      当我们要表示1个重量级对象.就表示为类,让对象存储在堆中