C#中struct与class的区别详解

 更新时间:2022年06月15日 15:39:39   作者:qq_42987967  
本文主要介绍了C#中struct与class的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.最大的区别

struct类型定义的变量是值类型,class定义的变量是引用类型。因此struct类型定义的对象是分配在栈上面的,而class定义的对象是分配在堆上的。

2.struct成员无法被声明为protected。

举例:

struct Test1
{
    protected readonly bool c;//会报错
}

3.struct是隐式的sealed类

因此struct不能被继承也无法继承其他,因此其成员也不能指定为 abstract、virtual (毕竟被密封了,无法实现虚函数跟抽象函数)。

但是struct可以实现接口。

interface i1
{
    void fun();
}
struct Test1:i1
{
    public void fun()
    {
        throw new System.NotImplementedException();
    }
}

4.struct中无法重载默认构造函数

struct Test1
{
    public int a ;
    public Test1(int A) //但是可定义非默认构造函数
    { 
        a = A; 
    }
    public Test1()//对默认构造函数重载,将报错
    {
        a = 1;
    }
}

5.关于对象的初始化

1)结构体中的变量是不能在结构体中直接赋初始值的,类的变量成员可以。

struct Test1
{
    public int a =1;//不允许赋初值,因此是错的
    public int b;//对的
 
}
class Test2
{
    public int a=1;//对的
    public int b;//对的,默认赋初值为0 
}

2)当使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。(即不使用new也是真的开辟了一个存储该struct变量的空间)

3)但是如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。如果使用默认构造函数进行new,会对数据进行默认赋值(int为0,引用类型为Null)

struct Test1
{
    public int a =1;
    public string b =1;
}
    void TestFun()
    {
        Test1 test1;
        test1.a = 1,test1.b = "1234";//必须给a跟b都赋值了才能使用test1
        Console.WriteLine(test1.a);
        Test1 test2=new Test1();//test2.a=0,test2.b=Null
    }

4)struct中的构造函数必须为所有数据成员赋初值。

struct Test1
{
    public int a ;//不允许赋初值,因此是错的
    public string b;
    public Test1(int A) { 
        a = A;
        b = "4534";//必须对所有数据成员赋初值,否则报错
    }
}

6.结构体没有析构函数,也无法自己去给结构体定义一个析构函数

毕竟struct是值类型,用析构函数也没啥鸟用。

struct Test1
{
    ~Test1() { }//错误的做法,会报错
}

到此这篇关于C#中struct与class的区别详解的文章就介绍到这了,更多相关C# struct与class内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现倒计时关闭提示框功能

    C#实现倒计时关闭提示框功能

    最近小编接到一个功能需要实现一个提示框并且能自动关闭的,看到这个需求真是懵了,四处搜集资料才搞定,接下来通过本文给大家分享C#实现倒计时关闭提示框功能,感兴趣的朋友跟随小编一起看看吧
    2019-07-07
  • Unity实现大转盘的简单笔记

    Unity实现大转盘的简单笔记

    这篇文章主要为大家分享了Unity实现大转盘的简单笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 采用C#代码动态设置文件权限

    采用C#代码动态设置文件权限

    在开发中,我们经常会使用IO操作,例如创建,删除文件等操作。在项目中这样的需求也较多,我们也会经常对这些操作进行编码,但是对文件的权限进行设置,这样的操作可能会手动操作,本文介绍一种采用代码动态对文件设置权限的操作。
    2016-12-12
  • C#获取串口列表实现实时监控串口

    C#获取串口列表实现实时监控串口

    本文主要介绍两种获取串口列表的方法,比较简单,方便大家使用,另外分享了一个已封装的API,需要的朋友可以参考下。
    2016-05-05
  • WPF如何自定义TabControl控件样式示例详解

    WPF如何自定义TabControl控件样式示例详解

    这篇文章主要给大家介绍了关于WPF如何自定义TabControl控件样式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Unity技术手册之Slider滑动器使用实例详解

    Unity技术手册之Slider滑动器使用实例详解

    这篇文章主要为大家介绍了Unity技术手册之Slider滑动器使用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • C#反射使用方法过程及步骤

    C#反射使用方法过程及步骤

    这篇文章主要为大家详细介绍了C#反射使用方法过程及步骤,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Unity3D UI Text得分数字增加的实例代码

    Unity3D UI Text得分数字增加的实例代码

    这篇文章主要介绍了Unity3D UI Text得分数字增加方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#图表算法之有向图

    C#图表算法之有向图

    这篇文章介绍了C#图表算法之有向图,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#文件非占用读取与帮助类FileHelper

    C#文件非占用读取与帮助类FileHelper

    这篇文章介绍了C#文件非占用读取与帮助类FileHelper,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论