C#类和结构体的区别

news2024/9/25 13:21:50

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 class
            y = 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.coloradmin.cn/o/1975863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Study--Oracle-07-ASM故障组管理(六)

一、ORACLE ASM提供的三冗余方式 1、三种模式:external、normal、high 一般情况下三种模式需要的最小磁盘组: external 1块 normal 3块 high 5块 2、外部冗余(external redundancy) 表示Oracle不帮你管理镜像&#xf…

计算机网络-http协议和https的加密原理

HTTP(HyperText Transfer Protocol,超文本传输协议)是用于在万维网(World Wide Web)上传输超文本的基础协议。它定义了客户端(通常是浏览器)和服务器之间的文本数据传输格式和规则。以下是HTTP的…

J030_TCP通信

一、需求描述 使用TCP协议进行通信 1.1 一发一收 1.1.1 Client package com.itheima.tcp1;import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket;public class Client {public static void main(String[] args) throws Exception {//1、…

嵌入式初学-C语言-练习三

#部分题目可能在之前的博客中有&#xff0c;请谅解&#xff0c;保证常见题型均被发出# 1.计算n以内所有正奇数的和 ? n值通过键盘输入 代码&#xff1a; 1 /*2 需求&#xff1a;计算n以内所有正奇数的和 ? n值通过键盘输入3 */4 #include <stdio.h>5 6 int main()7 …

用手机剪辑视频素材从哪里找?用手机视频素材库分享

视频编辑是一门充满创意的艺术&#xff0c;无论是制作短片、广告还是个人Vlog&#xff0c;都离不开高质量的视频素材。如果自己拍摄的素材不能完全满足创作需求&#xff0c;或者需要更多样化的内容来丰富视频&#xff0c;那么优质的视频素材来源至关重要。下面推荐几个提供高品…

LinuxC++(8):GDB调试

下载gdb gdb需要使用yum下载 yum -y install gdb 编译注意 需要在后面加上 -g &#xff0c;证明是要给可调试文件。 开始调试 gdb函数名 修改主函数参数 set args //set args "小红" "小华" "爱你" 在linux中显示行号 在vi下&#xff0c;输入…

C++自定义接口类设计器之函数解析二

关键代码 // 解析为函数 bool FunctionCreator::parse(const QString& lineFunc) {auto trimFunc lineFunc.trimmed();auto list trimFunc.split(" ");bool bHasReturn false;// 返回值和函数名解析for (const auto& key : list) {auto trimKey key.trim…

麦田物语第十八天

系列文章目录 麦田物语第十八天 文章目录 系列文章目录一、(Editor)制作 [SceneName] Attribute 特性二、场景切换淡入淡出和动态 UI 显示一、(Editor)制作 [SceneName] Attribute 特性 在本节课我们编写Unity的特性Attribute来更好的完善我们项目,具体是什么呢,就是当…

一款简单且强大的免费开源图片压缩软件

图压是一款简单易用且功能强大的图片压缩工具&#xff0c;适用于Windows和macOS两大操作系统。它能够在几乎不损害图片清晰度的情况下&#xff0c;显著减小图片的体积&#xff0c;特别适合需要在网页、PPT、Word、PDF中使用的图片压缩。图压的操作界面简洁&#xff0c;用户可以…

Kettle同步数据时如何借助Shell通过SSH连接MySQL数据库

在实际开发中&#xff0c;经常会用到KettleSpoon来同步数据&#xff0c;比如&#xff1a;需要定时将MySQL库某张表前一天的数据同步到SQL Server&#xff08;MySQL&#xff09;库中等等。一般由于安全性都会提供基于秘钥的连接方式&#xff0c;这种情况下如何在Kettle中连接数据…

Wordpress建站问题记录

从一月到七月因为工作的情况没有进行太深入的开发,想着整理一下把做一个独立站把博客多个渠道发布一下,遇到几个问题在这里记录一下. 先写一下我的配置 系统: centos7 php: 7.4 wordpress: 6.6.1 mysql:8.0.6 1. HTTP 500 Internal 这个问题出现在我将wordpress的文件夹全部…

运维变革背景下的运维工具衍化探讨

在数字化转型的浪潮中&#xff0c;运维领域正经历着前所未有的变革。这一变革不仅重塑了业务形态&#xff0c;也对运维工具和运维组织模式产生了深远影响。随着基础设施云化、容器化、微服务化等技术的兴起&#xff0c;运维对象、运维流程、协同关系等各个方面都发生了深刻的变…

J.U.C 原子类之AtomicIntegerFieldUpdate

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

MySQL:数据库用户

数据库用户 在关系型数据库管理系统中&#xff0c;数据库用户&#xff08;USER&#xff09;是指具有特定权限和访问权限的登录账户。每个用户都有自己的用户名和密码&#xff0c;以便系统可以通过认证来识别他们的身份。数据库用户可以登录数据库&#xff0c;在其中执行各种类…

第二十天学习笔记2024.8.2

安装mysql 1.安装软件包 centos7 中安装 mysql 8.x_wffkg-CSDN博客 2.解压 tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 3.卸载mariadb yum remove -y *mariadb* 4.安装&#xff08;缺什么依赖补什么&#xff09; mysql-community-server-8.0.33-1.el7.x86_64.rpm 5.…

APP逆向 day26unidbg下-pdd(anti)案例

一.前言 今天我们讲unidbg的下篇&#xff0c;也就是unidbg基础的最后一个部分&#xff0c;我们上节课也有补环境&#xff0c;比如补java环境&#xff0c;补安卓环境&#xff0c;这节课我们讲的肯定比这些都要难&#xff0c;我会给出一个之前讲过的案例&#xff0c;然后会讲一个…

如何建立与众不同的市场洞察能力【深度】

来源&#xff1a;战略研发领航 建立与众不同的市场洞察机制&#xff0c;展示了如何在组织中建立一种以数据和洞察为核心的文化&#xff0c;并通过4S周期&#xff08;架构、探查、塑造、成型&#xff09;的洞察工作方法论&#xff0c;指导领导者和团队在各个层级上进行更有效的思…

【C语言】C语言期末突击/考研--函数

目录 一、函数的声明与定义-嵌套调用 1.1.函数的声明与定义 1.2.函数的分类与调用 二、函数的递归调用 三、局部变量与全局变量 3.1.全局变量解析形参实参解析 3.2.局部变量与全局变量 四、练习题及解析 一、函数的声明与定义-嵌套调用 1.1.函数的声明与定义 函数间的…

Code Review 这件事,AI 比人类强 10 倍

1.引言 代码审查&#xff0c;也就是 Code Review&#xff08;以下简称 CR&#xff09;&#xff0c;一直是 IT 行业讨论的热门话题&#xff0c;因为它在很大程度上决定了公司的工程质量。 但是&#xff0c;人工 CR 的成本的是很高的&#xff0c;所以在实际落地场景&#xff0c…

latex换行\left[和\right]编译报错-解决方案

简而言之&#xff1a;\\ 换成 \right.\\ , & 换成 &\left. 来个例子就知道了&#xff1a; 原本的公式是&#xff1a; \begin{align}\label{up_critic} L_Q(\theta) & \mathbb{E}\left[\frac{1}{2}(Q_\theta(\mathcal{S}_{k,t}^m, {A}_{k,t}^m) - ({R}_{k,t}^m …