当前位置: 首页 > news >正文

C# 中类和结构的区别

类:
类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
类有构造和析构函数
类可以继承和被继承
结构:
结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
结构没有构造函数,但可以添加。结构没有析构函数
结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的(以下摘录):
C#结构体和类的区别问题:在C#编程语言中,类属于引用类型的数据类型,结构体属于值类型的数据类型,这两种数据类型的本质区别主要是各自指向的内存位置不同。传递类的时候,主要表现为是否同时改变了源对象。
C#结构体和类的区别技术要点:
    ◆类在传递的时候,传递的内容是位于托管内存中的位置,结构体在传递的时候,传递的内容是位于程序堆栈区的内容。当类的传递对象修改时,将同时修改源对象,而结构体的传递对象修改时,不会对源对象产生影响。
    ◆在一个类中,可以定义默认的、不带参数的构造函数,而在结构体中不能定义默认的、不带参数的构造函数。两者都可以定义带有参数的构造函数,通过这些参数给各自的字段赋值或初始化

代码运行如下:类中赋值以后,两个对象中的值都发生变化,而结构体原来对象的值为发生变化

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    public enum Gender
    { 
        男,
        女
    }

    public struct sPerson 
    {
        public string name;
        public int age;
        public Gender sex;

        public void say() {
            Console.WriteLine("Hello , my name is {0} , i am {1} years old", this.name,this.age);
        }

        public sPerson(string name,int age,Gender sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }

        public sPerson() {
            this.name = "default";
            this.age = 0;
            this.sex = Gender.男;  
        }
    }

    public class Person
    {
        public string name;
        public int age;
        public Gender sex;

        public void say() {
            Console.WriteLine("Hello , my name is {0}, i am {1} years old", this.name,this.age);
        }

        public Person(string name,int age,Gender sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }

        public Person() {
            this.name = "default";
            this.age = 0;
            this.sex = Gender.男;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            sPerson sp1 = new sPerson("jack", 25, Gender.男);
            sp1.say();
            sPerson sp2 = new sPerson();
            sp2.say();
            Person p1 = new Person();
            p1.say();
            Person p2 = new Person("mick", 30, Gender.男);
            p2.say();
            Console.ReadKey();
        }
    }
}

 

转载于:https://www.cnblogs.com/xiaoliwang/p/9508826.html

相关文章:

  • vue-cli 3.0 初体验
  • 谷歌 Fuchsia 上手体验,将取代Android/win10
  • dokcer安装gitlab
  • mysql启动失败
  • mybatis 源码分析二
  • 聊聊sentinel的DegradeSlot
  • 前端UI框架选择区别对比推荐
  • 解压缩软件居然还有多种工作模式!长见识了
  • 小白科普:分布式和集群
  • dubbo与springcloud初识
  • Android 5.1 预制输入法
  • Python游戏《外星人入侵》来了~
  • win10装双系统图文教程
  • 第10章神经网络基础
  • MpVue 致力打造H5与小程序的代码共用
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 345-反转字符串中的元音字母
  • crontab执行失败的多种原因
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Mocha测试初探
  • Redis在Web项目中的应用与实践
  • Spring Cloud Feign的两种使用姿势
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue 2.3、2.4 知识点小结
  • 程序员最讨厌的9句话,你可有补充?
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 目录与文件属性:编写ls
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用 @font-face
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 在Unity中实现一个简单的消息管理器
  • 正则与JS中的正则
  • Python 之网络式编程
  • ​一些不规范的GTID使用场景
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C++20) consteval立即函数
  • (Java数据结构)ArrayList
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (层次遍历)104. 二叉树的最大深度
  • (九)One-Wire总线-DS18B20
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三十五)大数据实战——Superset可视化平台搭建
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .Net 4.0并行库实用性演练
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net web项目 调用webService
  • .net的socket示例
  • .net访问oracle数据库性能问题
  • .NET基础篇——反射的奥妙
  • .NET序列化 serializable,反序列化