惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - Rock Wang

Asp.Net Core Web Api基于cookie的安全验证 C#语言新特性(6.0-8.0) iOS真机调试之免费预配(Free provisioning) iOS真机调试 Spring Boot学习笔记(1) Java学习笔记(9) Java学习笔记(7) Java学习笔记(6) Java学习笔记(5) Java学习笔记(4) Idea常用功能汇总 Java学习笔记(3) Java学习笔记(2) Java学习笔记(1) 如何开发NPM包 c#抓屏功能在DPI缩放后,截到的图片不完整的问题 支持续传功能的ASP.NET WEB API文件下载服务 ASP.NET MVC 阻止通过Url直接访问服务器上的静态文件 VS2013/VS2015/VS2017通过oschina托管代码
C#中Struct和Class的区别
Rock Wang · 2020-04-06 · via 博客园 - Rock Wang

在C#中,struct和class都是用户定义的数据类型,struct和class有许多不同之处,但主要的区别是:

Class是引用类型,它保存在堆上并且能够被垃圾回收;然而stuct是值类型,它保存在栈上或者内嵌在它的包含类型之中。因此,从总体上来说struct比class节省内存。

下图是Class和Struct的14个不同之处:

详解Class与Stuct的不同之处

1.struct用"struct"关键字来声明,而class用"class"关键字声明(好像是废话)

2.由于struct是值类型,所以struct的变量直接包含了数据本身;而class是引用类型,所以class的变量只是包含了对数据的引用(其实就是一个指针)

3.class类型的变量,其内存分配在堆上并且能够被垃圾回收,然而stuct类型的变量的内存分配在栈上或者内嵌在它的包含类型中

4.class的对象需要通过"new"关键字来创建,而创建struct的对象时,可以用也可以不用"new"关键字。如何实例化struct时没有用"new", 则用户不允许访问其方法、事件和属性。

5.每个struct变量都包含它的数据的一个copy(ref和out参数是个例外),所以对一个变量的修改不会影响别的变量;然则对于class来说,所有变量(通过赋值声明的变量)都指向同一对象,对一个变量的修改会影响别的变量。

通过正面的例子可以加深理解

using System;
namespace structAndClass
{
    //creating structure
    public struct Demo
    {
        public int x, y;
        //parameterized constructor
        public Demo(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }
    public class StructDemo
    {
        public static void Main(string[] args)
        {
            Demo a = new Demo(50, 50);
            Demo b = a;
            a.x = 100;
            Console.WriteLine("Value of a.x = "+a.x);
            Console.WriteLine("Value of b.x = "+b.x);
        }
    }
}

输出

using System;
namespace structAndClass
{
    public class Demo
    {
        public int x, y;
        public Demo(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }
    public class StructDemo
    {
        public static void Main(string[] args)
        {
            Demo a = new Demo(50, 50);
            Demo b = a;
            a.x = 100;
            Console.WriteLine("Value of a.x = "+a.x);
            Console.WriteLine("Value of b.x = "+b.x);
        }
    }
}

输出

 6.struct比class节省内存

7.struct不能有无参数构造函数,可以有有参数的或者static构造函数;而class默认会有一个无参数的构造函数

8.struct不能有析构函数,而class可以有

9.struct不能从另一个struct或者class继承而来,也不能作为基类使用;而class可以继承自其他class,也可以作为基类使用。总之,stuct不支持继承,class支持继承。

10.struct的成员不能声明成abstract, virtual或者protected, 而class可以

11.class的实例称为对象(object), struct的实例称为结构变量

12.如果未指定访问指示符,对class而言,其成员默认是private,而对struct而言,默认是public

13.class通常用于复杂的数据结构的场景,而struct通常用于小数据场景