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

C#类和结构体的区别

1、类class是引用类型,多个引用类型变量的值会互相影响。存储在堆(heap)上

2、结构体struct是值类型,多个值类型变量的值不会互相影响。存储在栈(stack)上

结构
关键字classstruct
类型引用类型值类型
存储位置托管 堆(heap)上栈(stack)上
语法都使用new来说明实例都使用new来说明实例

using System;
using System.Collections.Generic;
using System.Text;namespace VariableScopeSample3
{class Vector{int value;public  int Value { get; internal set; }}
}
using System;
using System.Collections.Generic;
using System.Text;namespace VariableScopeSample3
{struct Point{public int X { get; internal set; }public int Y { get; internal set; }}
}
using System;namespace VariableScopeSample3
{class Program{static int j = 20;static int Main(string[] args){int j = 30;Console.WriteLine(j);// return 0;Vector x, y;x = new Vector();x.Value = 30;//value is a field defind in Vector classy = x;Console.WriteLine(y.Value);y.Value = 50;Console.WriteLine(x.Value);Console.WriteLine("--------------------");Point a,b;a = new Point();a.X = 30;b = new Point();//下面有赋值,所以这里可省略b = a;Console.WriteLine(b.X);b.X = 50;Console.WriteLine(a.X);Console.WriteLine(b.X);return 0;}}
}

在C#中,结构体(struct)是值类型,这意味着它们在赋值时是通过值复制的方式来传递的

  1. Point a, b; 声明了两个 Point 类型的变量 a 和 b。由于结构体是值类型,这两个变量会被初始化为默认值(在本例中,X 和 Y 都是 0)。

  2. a = new Point(); 创建了一个新的 Point 实例,并将其赋值给变量 a

  3. a.X = 30; 将 a 的 X 属性设置为 30

  4. b = new Point(); 创建了另一个新的 Point 实例,并将其赋值给变量 b。这一步实际上不是必需的,因为你紧接着就重写了 b 的值。

  5. b = a; 将 a 的值复制给 b。由于结构体是按值传递的,这里发生的是 a 的值(此时 X 是 30)被复制给 b

  6. Console.WriteLine(b.X); 打印 b 的 X 属性,输出 30

  7. b.X = 50; 将 b 的 X 属性设置为 50。由于 b 是 a 的一个副本,这个操作不会影响 a

  8. Console.WriteLine(a.X); 打印 a 的 X 属性,输出 30,因为 a 和 b 是独立的副本。

  9. Console.WriteLine(b.X); 再次打印 b 的 X 属性,输出 50

关于 b = new Point(); 这一行代码可以省略的问题:

因为在执行 b = a; 之前,b 的值并不重要,因为它会被立即覆盖。省略这一行代码不会影响程序的行为,因为 b 会在赋值时得到 a 的副本。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2.MySQL库的操作
  • C++ 智能指针简单介绍及用法
  • 微调(二)
  • Java与Python谁更适合后端开发?
  • 计算机网络-七层协议栈介绍
  • Qt pdf文件操作
  • 学习记录day18——数据结构 算法
  • Hadoop学习(三)
  • AI PC处理器架-低功耗、NPU算力、大模型
  • Java面试题--多线程
  • Java基础总结
  • html+css+js前端作业英雄联盟首页1个页面带js
  • 测试面试宝典(四十一)—— 接口自动化的优缺点
  • 关闭窗口工具类 - C#小函数类推荐
  • C++四种类型转换
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Apache的基本使用
  • codis proxy处理流程
  • css属性的继承、初识值、计算值、当前值、应用值
  • in typeof instanceof ===这些运算符有什么作用
  • input实现文字超出省略号功能
  • laravel5.5 视图共享数据
  • Rancher如何对接Ceph-RBD块存储
  • spring + angular 实现导出excel
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • web标准化(下)
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 简单数学运算程序(不定期更新)
  • 力扣(LeetCode)56
  • 那些被忽略的 JavaScript 数组方法细节
  • 深入 Nginx 之配置篇
  • 运行时添加log4j2的appender
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​如何使用QGIS制作三维建筑
  • #define,static,const,三种常量的区别
  • #NOIP 2014# day.1 T2 联合权值
  • #Z0458. 树的中心2
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (1)Nginx简介和安装教程
  • (13):Silverlight 2 数据与通信之WebRequest
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (三)mysql_MYSQL(三)
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (一)kafka实战——kafka源码编译启动
  • (一)SvelteKit教程:hello world