如何选择使用结构或类

struct是值类型,隐式继承自System.ValueType,struct实例被分配在堆栈上,由系统内存回收;class是引用类型,class的实例被分配在托管堆上,由GC回收。

struct不可以有无参构造函数,只能有带参构造函数;class当然可以有无参构造函数。

struct和class都可以通过new关键字创建实例。

struct不能用abstract修饰,可以在class前面加abstract关键字。

struct作为参数传递时,传递的是值,而class传递的是引用地址。

来看一个struct和class类型作为参数传递的例子。

    class Program
    {
        static void Main(string[] args)
        {
            PointStruct structPoint = new PointStruct();
            structPoint.x = 10;
            structPoint.y = 10;

            Console.WriteLine("struct的初始值是:x={0},y={1}",structPoint.x, structPoint.y);
            ChangeStructPoint(structPoint);
            Console.WriteLine("struct的初始值改变后是:x={0},y={1}", structPoint.x, structPoint.y);

            Console.WriteLine();

            PointClass pointClass = new PointClass(10, 10);
            Console.WriteLine("class的初始值是:x={0},y={1}", pointClass.x, pointClass.y);
            ChangeClassPoint(pointClass);
            Console.WriteLine("class的初始值改变后是:x={0},y={1}", pointClass.x, pointClass.y);

            Console.ReadKey();
        }

        static void ChangeStructPoint(PointStruct pointStruct)
        {
            pointStruct.x = 20;
            pointStruct.y = 20;
            Console.WriteLine("正在改变struct的值是:x={0},y={1}", pointStruct.x, pointStruct.y);
        }

        static void ChangeClassPoint(PointClass pointClass)
        {
            pointClass.x = 20;
            pointClass.y = 20;
            Console.WriteLine("正在改变class的值是:x={0},y={1}", pointClass.x, pointClass.y);
        }
    }



    public struct PointStruct
    {
        public int x;
        public int y;


        public PointStruct(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }

    public class PointClass
    {
        public int x;
        public int y;

        public PointClass(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }

结果是:

以上, struct和class的结构相似,当struct实例作为方法参数传递时,在堆栈上拷贝了一份传递给方法,在方法内改变其值,改变的是另一份struct实例的值;而class实例作为参数传递时,在堆栈上拷贝了一份传递给方法,堆栈上的2个实例指向同一个引用地址,改变托管堆上实例的值,也就相当于同时改变了堆栈上2个class实例的值。

总结:class完全可以替代struct能实现的所有功能,但,对于一些相对小的数据结构,应该考虑使用struct。

时间: 2024-08-09 21:59:25

如何选择使用结构或类的相关文章

C#中结构与类的区别

一.类与结构的示例比较: 结构示例: 1 public struct Person 2 { 3 string Name; 4 int height; 5 int weight 6 public bool overWeight() 7 { 8 //implement something 9 } 10 } 类示例: 1 public class TestTime 2 { 3 int hours; 4 int minutes; 5 int seconds; 6 7 public void passti

CSS3 结构伪类选择器 详解

1 CSS3 结构伪类选择器 1.E:root 匹配E元素所在的根元素 即:html 2. E:nth-child(n) (1)匹配E元素的父元素中第n个子元素,(2)且该位置的子元素类型必须是E类型.否则无效 p:nth-child(1){color:red} <div> <p>这是红色的<p> </div> <div> <h1>这是第一个子元素 但不是P类型,不是红色</h1> < p>这是黑色的 注意对比

.net(C#)中结构和类的区别

static void Main(string[] args) { //类型 //结构:值类型 //类:引用类型 //声明的语法:class struct //在类中,构造函数里,既可以给字段赋值,也可以给属性赋值.构造函数是可以重载的 //但是,在结构的构造函数当中,必须只能给字段赋值. //在结构的构造函数当中,我们需要给全部的字段赋值,而不能去选择的给字段赋值 //调用: PersonClass pc = new PersonClass(); //结构是否可以New? //在栈开辟空间 结

结构伪类选择器的误解(nth-of-type,nth-child等等结构伪类选择器应用在孙子辈元素上出现错误)

结构伪类选择器适用的是父元素和子元素之间的选择,以前错误的理解为元素和后代元素 具体例子: html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <ul> <li><a>1</a></li> <li&g

枚举、结构、类

C++中,枚举类型.结构类型.类类型是三种用户自定义的符合数据类型. 5.1 简单数据类型与构造式数据类型 简单数据类型,又基本数据类型.原子数据类型:该类型的数据是单一的一个值,不可再细分为若干部分.包括int, float, char等: 构造式数据类型:数据内部有多个组成部分,可以分别访问这些组成部分.包括枚举.结构.类. 5.2 枚举类型 若想建立一种数据类型,其值域由程序员自定义,可以使用enum定义: enum <枚举类型名> {<枚举元素表>}; 如: enum Da

几何对象的结构和类

为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类.这些结构和类分别定义在头文件windef.h和afxwin.h中. 1.点 1)点结构POINT 点数据结构POINT用来表示一点的x.y坐标: typedef struct tagPOINT { LONG x; LONG y; } POINT; 2)点类CPoint 点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种: CPoint( ); CPoint( int initX, i

CSS3新增(选择器{属性选择器,结构伪类选择器,伪元素选择器})

1.属性选择器 属性选择器,可以根据元素特定的属性来选择元素,这样就不用借助 类 或者 id选择器. E [ att ]   选择具有 att 属性的 E 元素   例如:input [ value ] E [ att = 'val' ]   选择具有 att 属性且属性值等于 val 的 E元素 E [ att = 'val' ]   选择具有 att 属性且属性值等于 val 的 E元素 E [ att ^= 'val' ]   选择具有 att 属性且属性值以 val 开头的 E元素 E

表单,音视频,语义化标签与属性选择器,结构伪类选择器,伪元素选择器(按钮禁止点击)

HTML5简介 万维网的核心语言,标准通用标记语言的写一个应用超文本标记语言(HTML)的第五次重大修改,作为新HTML语言,具有新的元素,属性和行为:广义的HTML是包含HTML5本身 + CSS3 + JavaScript,虽然不被所有浏览器所支持,但它是一种趋势: 新增语义化标签 <header></header> <!-- 头部标签 --> <nav></nav> <!-- 导航标签 --> <article>&l

shell脚本编程的选择分支结构

选择执行结构: if语句单分支结构:如果条件为真,则执行then后的命令,否则,不做任何操作: if CONDITION :then STATEMENT fi 或 if CONDITION ; then STATEMENT1 STATEMENT2 ... fi 注意:想要执行then后面的STATEMENTS,前提条件是CONDITION部分为真: if语句的双分支结构:如果条件为真,就执行then后面的命令:否则就执行else后面的命令: if CONDITION ; then STATEME