浅析C#中结构与类的区别
作者:反骨仔(二五仔) 发布时间:2023-09-12 23:41:39
标签:C#,结构,类,区别
一、
结构:值类型,存储在堆栈中,位于计算机的内存逻辑区域中
类 :引用类型,存储在堆中,位于计算机内存的不同逻辑位置
二、
较小的数据使用结构;
将一个结构值传递到方法时,传递的是整个数据结构;
传递一个类,实际上是将引用传递到对象,即只有内存地址;
对结构修改,改变的是结构的副本,这是值类型工作方式的定义:传递值的副本;
传递一个引用到类本身意味着在类中修改值,实际上改变的是原始对象;
三、代码例子
1.新建 PointClass.cs
namespace StructAndClass
{
internal class PointClass
{
public PointClass(int x, int y)
{
X = x;
Y = y;
}
public int X { get; set; }
public int Y { get; set; }
}
}
2.新建 PointStruct.cs
namespace StructAndClass
{
internal struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}
}
3.Program.cs
using System;
namespace StructAndClass
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("PointStruct =====");
var pStruct = new PointStruct(10, 10);
Console.WriteLine("初始值:x={0},y={1}", pStruct.X, pStruct.Y);
ModifyPointStruct(pStruct);
Console.WriteLine("调用 ModifyPointStruct() 后的值:x={0},y={1}", pStruct.X, pStruct.Y);
Console.WriteLine();
Console.WriteLine("PointClass =====");
var pClass = new PointClass(10, 10);
Console.WriteLine("初始值:x={0},y={1}", pClass.X, pClass.Y);
ModifyPointClass(pClass);
Console.WriteLine("调用 ModifyPointClass() 后的值:x={0},y={1}", pClass.X, pClass.Y);
Console.Read();
}
private static void ModifyPointStruct(PointStruct point)
{
Console.WriteLine("调用方法:ModifyPointStruct");
point.X = 20;
point.Y = 20;
Console.WriteLine("修改成的值:x={0}, y={1}", point.X, point.Y);
}
private static void ModifyPointClass(PointClass point)
{
Console.WriteLine("调用方法:ModifyPointClass");
point.X = 20;
point.Y = 20;
Console.WriteLine("修改成的值:x={0}, y={1}", point.X, point.Y);
}
}
}
4.结果:
【解析】
ModifyPointStruct(PointStruct point) 调用时修改的只是结构副本,所以原来的结构并没有发生变化;
ModifyPointClass(PointClass point) 调用时所修改的对象是原对象,因为参数传递过来的是一个引用地址,这地址指向原对象
四、总结
结构是值类型并在堆栈中传递,每次使用方法进行修改的都只是结构副本;
至于类,传递的是内存地址的引用,修改的就是初始值
来源:http://www.cnblogs.com/liqingwen/p/4929057.html
0
投稿
猜你喜欢
- 1 概述Java虚拟机把描述类的数据从Class文件加载到内存, 并对数据进行校验、转化解析和初始化,最终形成可以被虚拟机直接使用的Java
- 本文实例为大家分享了Android实现支付宝支付密码输入界面的具体代码,供大家参考,具体内容如下效果图:主要代码:import java.u
- 开发环境:jdk版本:JDK8maven版本:maven-3.5.2开发工具:Itellij IDEA 2017.1前提条件:已安装以上软件
- 本文实例讲述了java实现新浪微博Oauth接口发送图片和文字的方法。分享给大家供大家参考。具体如下:基于网上很多人利用新浪api开发新浪微
- 本文实例为大家分享了Java实现答答租车系统的具体代码,供大家参考,具体内容如下项目需求: 基本界面需求:and:最后是把账单打印出来:个人
- 读取Java文件到byte数组的三种方法(总结)package zs;import java.io.BufferedInputStream;
- 1. 获取绝对文件路径System.IO.Path.GetFullPath(string path)string fileName = &q
- 数独简介数独(shù dú)是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏
- 目录题目及要求:提示:原创代码:代码思路:题目及要求:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。提示:0 <
- 这篇文章主要介绍了spring cloud gateway网关路由分配代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有
- 本文实例为大家分享了Java实现中英文词典功能的具体代码,供大家参考,具体内容如下功能如下:1、可以向词典中增加中英文单词,并提供修改和删除
- 关于springmvc上传图片的方法小编给大家整理了两种方法,具体内容如下所示:第一种:(放在该项目下的物理地址对应的位置)a. 路径写法:
- 一、默认异常处理机制默认情况下,SpringBoot 提供 /error 请求,来处理所有异常的。1.浏览器客户端,请求头里的属性是Acce
- java.math.BigDecimal及加减乘除计算BigDecimal简介BigDecimal用来对需要更大或更小的数进行任意精度的运算
- Feign调用中的两种Header传参方式在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,
- 前言基本语法首先我们要知道java的基础语法。1.由26个英文字母大小写,0-9,_或$组成2.数字不可以开头3.不可以使用关键字和保留字,
- 本文实例为大家分享了java实现顶一下踩一下功能的具体代码,供大家参考,具体内容如下效果图如下:主页面index.html:<!DOC
- 本文实例讲述了Android实现的仿淘宝购物车。分享给大家供大家参考,具体如下:夏的热情渐渐退去,秋如期而至,丰收的季节,小编继续着实习之路
- 使用HTTPclient访问url获得数据最近项目上有个小功能需要调用第三方的http接口取数据,用到了HTTPclient,算是做个笔记吧
- 前面文章介绍了如何使用JAVA的反射机制来调用蓝牙的隐藏API,本文继续来练习JAVA的反射机制,探秘TelephonyManager在Fr