C#结构体和类的区别

目录

一、结构体的定义

二、结构体和类的区别


一、结构体的定义

C#中结构体的定义使用struct

struct Books
{
   //如果不使用public修饰的话,外界是无法直接访问到的
   public string title;
   public string author;
   public string subject;
   public int book_id;
};  

二、结构体和类的区别

需要用到的结构体和类

public class Book
    {
        //使用public修饰,外界可以访问
        public int id;
        public string name;
        public Book(int ID,string NAME)
        {
            id = ID;
            name = NAME;
        }

    }
    public struct student
    {
        public int Id;
        public string Name;
        public student(int id,string name)
        {
            Id = id;
             Name = name;
        }
    } 

(1)

  • 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。

简单来说就是结构体可以不使用new来进行实例化,但是类却要new进行实例化,如下:

            Book b1 = new Book(1, "书籍1");
            Book b2 = new Book(2, "书籍2");
            student b3;
            b3.Id = 1;
            b3.Name = "909";

(2)

结构体是值类型,它们是在栈上分配,因为是在栈上分配,所以它们一般是比类更轻量,适用于简单的数据表示。

类是引用类型,它们是在堆上分配内存,因为是在堆上分配内存,所以说可能会涉及更多的内存开销和管理

简单来说,结构体是值类型,就是说如果将另一个变量复制给这个变量,那么复制的是整个结构,你也可以理解成是一个新的变量,修改新变量并不会影响原来的变量。

但是类是引用类型,所以它在赋值的时候其实存储的是引用,也就是说修改新变量是会影响到原来的变量的!

static void Main(string[] args)
        {
            //类,修改新对象会影响原来的对象
            Book b1 = new Book(1, "书籍1");
            Book b2 = new Book(2, "书籍2");
            b1 = b2;
            b1.id = 100;
            //本来修改b1的id应该只有b1的ID是一百才对,但是都变成了一百
            Console.WriteLine(b1.id+" "+b1.name);
            Console.WriteLine(b2.id+" "+b2.name);

            //结构体,修改新对象不会影响原来的对象
            student s1 = new student(1, "学生1");
            student s2 = new student(2, "学生2");
            s1 = s2;
            s1.Id = 100;
            //修改s1的id并没有影响s2
            Console.WriteLine(s1.Id + " " + s1.Name);
            Console.WriteLine(s2.Id + " " + s2.Name);


        }

(3)

结构体不能有无参数的构造函数,并且结构体是不能继承其他的结构或者是类。结构体是不能直接设置为null的

类的话是可以有无参数的构造函数,如果没有提供构造函数,系统会默认提供无参数构造函数,并且类是支持继承的!类的实例默认是可以是null,因为它们是引用类型

using System;

// 结构声明
struct MyStruct
{
    public int X;
    public int Y;

    // 结构不能有无参数的构造函数
    // public MyStruct()
    // {
    // }

    // 有参数的构造函数
    public MyStruct(int x, int y)
    {
        X = x;
        Y = y;
    }

    // 结构不能继承
    // struct MyDerivedStruct : MyBaseStruct
    // {
    // }
}

// 类声明
class MyClass
{
    public int X;
    public int Y;

    // 类可以有无参数的构造函数
    public MyClass()
    {
    }

    // 有参数的构造函数
    public MyClass(int x, int y)
    {
        X = x;
        Y = y;
    }

    // 类支持继承
    // class MyDerivedClass : MyBaseClass
    // {
    // }
}

class Program
{
    static void Main()
    {
        // 结构是值类型,分配在栈上
        MyStruct structInstance1 = new MyStruct(1, 2);
        MyStruct structInstance2 = structInstance1; // 复制整个结构

        // 类是引用类型,分配在堆上
        MyClass classInstance1 = new MyClass(3, 4);
        MyClass classInstance2 = classInstance1; // 复制引用,指向同一个对象

        // 修改结构实例不影响其他实例
        structInstance1.X = 5;
        Console.WriteLine($"Struct: {structInstance1.X}, {structInstance2.X}");

        // 修改类实例会影响其他实例
        classInstance1.X = 6;
        Console.WriteLine($"Class: {classInstance1.X}, {classInstance2.X}");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜到极致就是渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值