C#值类型和引用类型,类和结构体

ops/2024/10/22 11:03:57/

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

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

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 的副本。


http://www.ppmy.cn/ops/88991.html

相关文章

如何在 Android 设备上更改您的位置?

一、简述 全球定位系统 (GPS) 是一种基于卫星的导航系统,用于确定设备在地球上的当前位置。Android 设备配备了 GPS 接收器,可与绕地球运行的卫星进行交互。一旦设备锁定至少四颗卫星,它就可以通过计算信号从每颗卫星传输到设备所需的时间来三…

iOS 隐藏UITextView 、UITextField 长按弹出菜单栏

iOS 17之后,长按会有一个自动填充的菜单,以及文本选中后的菜单改如何隐藏呢?可以用如下方法来隐藏。 创建一个类,继承UITextView或者UITextField重新相关方法 canPerformAction:withSender:与buildMenuWithBuilder 相关代码如下…

CF1997D Maximize the Root

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 感谢伟大的洛谷。 [Solution] \color{blue}{\texttt{[Solution]}} [Solution] 显然,这题直接求解非常麻烦。 考虑一些技巧,我们发现答案是有单调性的&…

Python中json模块的编码和解码

在Python中,可以用json模块处理JSON的编码和解码问题。json的全程是 javascript object notation, 翻译一下就是javascritpt 对象表示法。json是一种轻量级的数据交换格式,容易阅读和编写,支持的数据类型有:字符串、数字、数组和对…

大数据Flink(一百零七):阿里云Flink的应用场景

文章目录 阿里云Flink的应用场景 一、​​​​​​​背景信息 二、​​​​​​​​​​​​​​部门场景 三、​​​​​​​​​​​​​​技术领域 1、​​​​​​​​​​​​​​实时ETL和数据流 2、​​​​​​​​​​​​​​实时数据分析 3、​​​​​​​事…

【给嵌入式新人的几条建议(共勉):三-C语言基础怎么补?】

给嵌入式新人的几条建议(共勉):三-C语言基础怎么补? 前言1、先回答一个问题,对C语言的害怕到底在哪?(纠正认知)2、C语言基础,要补全部吗?No2.1 先看下自己属于…

ATTCK实战系列-红队评估 (一)Vulnstack三层网络域渗透

目录 一、搭建环境 1.靶场下载地址: 2、网络拓扑 3、环境配置 Win7(外网服务器 ) Win2008(域控) Win2003(域成员) 4、启动环境 二、信息收集 1、端口扫描 2、目录扫描 三、漏洞利用…

《LeetCode热题100》---<5.③普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第五道:缺失的第一个正数(困难) 第五道:缺失的第一个正数(困难) 方法一:将数组视为哈希表 class Solution {public int firstMissingPosi…