C#中struct与class的区别详解

目录
  • 1.最大的区别
  • 2.struct成员无法被声明为protected。
  • 3.struct是隐式的sealed类
  • 4.struct中无法重载默认构造函数
  • 5.关于对象的初始化
  • 6.结构体没有析构函数,也无法自己去给结构体定义一个析构函数

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 区分C# 中的 Struct 和 Class

    翻译自 Manju lata Yadav 2019年6月2日 的博文 <Difference Between Struct And Class In C#>,补充了一些内容和示例. 结构体(struct)是类(class)的轻量级版本.结构体是值类型,可用于创建行为类似于内置类型的对象. 比较 结构体和类共享许多特性,但与类相比有以下局限性. 结构体不能有默认构造函数(无参构造函数)或析构函数,构造函数中必须给所有字段赋值. public struct Coords { public doub

  • C#中struct和class的区别详解

    本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单. 概括来讲,struct和class的不同体现在: ● 类是引用类型,struct是值类型 ● 在托管堆上创建类的实例,在栈上创建struct实例 ● 类实例的赋值,赋的是引用地址,struct实例的赋值,赋的是

  • C#中struct与class的区别详解

    目录 1.最大的区别 2.struct成员无法被声明为protected. 3.struct是隐式的sealed类 4.struct中无法重载默认构造函数 5.关于对象的初始化 6.结构体没有析构函数,也无法自己去给结构体定义一个析构函数 1.最大的区别 struct类型定义的变量是值类型,class定义的变量是引用类型.因此struct类型定义的对象是分配在栈上面的,而class定义的对象是分配在堆上的. 2.struct成员无法被声明为protected. 举例: struct Test1

  • C++中的struct和class的区别详解

    目录 1. C++的struct和class的区别 1.1 成员访问范围的差异 struct class 1.1 继承关系访问范围的差异 struct : struct struct : class struct : private class class : class class : public class class : struct class : public struct 1.3 {}初始化的差异 struct – 纯数据+一般方法 struct – 带构造函数 struct –

  • C++ class和struct到底有什么区别详解

    C++ 中保留了C语言的 struct 关键字,并且加以扩充.在C语言中,struct 只能包含成员变量,不能包含成员函数.而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数. C++中的 struct 和 class 基本是通用的,唯有几个细节不同: 使用 class 时,类中的成员默认都是 private 属性的:而使用 struct 时,结构体中的成员默认都是 public 属性的. class 继承默认是 private 继承,而 struct 继承默

  • 基于python中staticmethod和classmethod的区别(详解)

    例子 class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod def class_foo(cls,x): print "executing class_foo(%s,%s)"%(cls,x) @staticmethod def static_foo(x): print "executing static_foo(%s)"%x a=A(

  • node.js中grunt和gulp的区别详解

    node.js中grunt和gulp的区别详解 自nodeJS登上前端舞台,自动化构建变得越来越流行.目前最流行的当属grunt和gulp,这两个光看名字挺像,功能也差不多,不过gulp能在grunt这位大哥如日中天的境况下开辟出自己的一片天地,有着她独到的优点. 易用 Gulp相比Grunt更简洁,而且遵循代码优于配置策略,维护Gulp更像是写代码. 高效 Gulp相比Grunt更有设计感,核心设计基于Unix流的概念,通过管道连接,不需要写中间文件. 高质量 Gulp的每个插件只完成一个功能

  • 基于js中this和event 的区别(详解)

    今天在看javascript入门经典-事件一章中看到了 this 和 event 两种传参形式.因为作为一个初级的前端开发人员平时只用过 this传参,so很想弄清楚,this和event的区别是什么,什么情况下用什么比较合适. onclick = changeImg(this)       vs     onclick = changeImg(event) <img src='usa.gif' onclick="changeImg(event)" /> <scrip

  • iOS中setValue和setObject的区别详解

    网上关于setValue和setObject的区别的文章很多,说的并不准确,首先我们得知道: setObject:ForKey: 是NSMutableDictionary特有的:setValue:ForKey:是KVC的主要方法 话不多说,上代码: - (void)viewDidLoad { [super viewDidLoad]; //setObject和setvalue的区别 NSMutableDictionary *dic = [NSMutableDictionary dictionary

  • python中import reload __import__的区别详解

    import 作用:导入/引入一个python标准模块,其中包括.py文件.带有__init__.py文件的目录(自定义模块). import module_name[,module1,...] from module import *|child[,child1,...] 注意:多次重复使用import语句时,不会重新加载被指定的模块,只是把对该模块的内存地址给引用到本地变量环境. 实例: pythontab.py #!/usr/bin/env python #encoding: utf-8

  • JavaScript中object和Object的区别(详解)

    JavaScript中object和Object有什么区别,为什么用typeof检测对象,返回object,而用instanceof 必须要接Object呢 这个问题和我之前遇到的问题非常相似,我认为这里有两个问题需要解决,一个是运算符new的作用机制,一个是function关键字和Funtion内置对象之间的区别.看了一些前辈的博客和标准,这里帮提问者总结一下. 1.new new运算符的作用是创建一个对象实例.这个对象可以是用户自定义的,也可以是带构造函数的一些系统自带的对象.如果 new

随机推荐