重构代码之将引用类型更改为值类型

将引用类型更改为值类型的目标是将引用类型转换为值类型,通常是为了简化代码,减少副作用,提高代码的可理解性和可维护性。这个重构技术适用于那些引用类型在某些情况下表现得像值类型的场景,尤其是当引用类型不需要共享状态时。通过这种方式,可以避免复杂的引用管理,减少不必要的共享状态。

一、何时使用将引用类型更改为值类型

  • 避免共享状态:如果引用类型的实例被多个对象共享,并且没有必要共享它的状态,使用值类型可以避免这种复杂的引用管理。
  • 减少副作用:引用类型在多个地方共享时,如果一个地方修改了对象的状态,可能会影响到其他地方的行为。使用值类型可以避免这种副作用。
  • 简化设计:如果对象的生命周期不需要跨多个实例共享,可以通过使用值类型来简化设计。

二、如何进行将引用类型更改为值类型

  1. 确定要转换的对象:首先需要识别出一个对象实例,它在代码中是以引用类型存在,但实际上不需要跨多个对象共享状态。
  2. 转换类型
    • 如果这个引用类型是类(class),可以考虑将它转换为结构体(struct)。结构体是值类型,每次赋值或传递时都会创建一个副本,而不会影响其他地方的实例。
    • 如果是某些简单的值对象,可以直接替换为一个值类型,例如整数、浮点数、布尔值等。
  3. 修改引用的地方
    • 需要更新使用该对象的所有地方,确保它们现在使用的是值类型。
    • 如果原来是通过引用修改对象的属性,转为值类型后需要通过传值的方式更新,可能需要调整一些逻辑。
  4. 测试和验证
    • 确保重构后的代码行为和之前一致,且没有引入新的错误或副作用。
    • 尤其注意原本共享状态的地方,现在值类型应该不再影响其他地方的状态。

三、示例

假设有一个类 Person,它包含一个 Address 类作为属性,现在我们想将 Address 类从引用类型转换为值类型。
原始代码:

public class Address
{public string Street { get; set; }public string City { get; set; }
}public class Person
{public Address Address { get; set; }public Person(string street, string city){Address = new Address { Street = street, City = city };}
}public class Program
{public static void Main(){var person1 = new Person("123 Main St", "Springfield");var person2 = new Person("456 Oak St", "Shelbyville");person1.Address.Street = "789 Elm St"; // 影响了 person2 的 Address}
}

在这个例子中,Address 是引用类型,因此对 person1.Address 的修改会影响到其他引用同一个 Address 对象的地方。
重构后:

public struct Address
{public string Street { get; set; }public string City { get; set; }
}public class Person
{public Address Address { get; set; }public Person(string street, string city){Address = new Address { Street = street, City = city };}
}public class Program
{public static void Main(){var person1 = new Person("123 Main St", "Springfield");var person2 = new Person("456 Oak St", "Shelbyville");person1.Address.Street = "789 Elm St"; // 不会影响 person2 的 Address}
}

在重构后的代码中,Address 是一个值类型(struct),因此每次 Person 对象被创建时,Address 都会被复制,而不是引用共享。因此,对 person1.Address 的修改不会影响 person2.Address

四、注意事项

  • 性能影响:虽然值类型通常比引用类型更简单,但它们也有一定的性能开销,尤其是当它们很大时。因为每次传递值类型时,都会进行复制,可能会导致性能下降。在这种情况下,选择是否进行重构需要综合考虑性能和代码的清晰度。
  • 不可变性:值类型通常是不可变的,这意味着它们一旦创建就不能改变。对于需要频繁修改的对象,值类型可能不适合。

五、总结

将引用类型更改为值类型重构通过将引用类型转换为值类型来简化代码设计,减少共享状态和副作用。它适用于那些不需要共享状态的场景,能够提高代码的可读性和可维护性,但也需要注意性能和设计方面的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477793.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字化工厂 MES试点方案全解析(三)

目 录 三、试点实施步骤 需求分析与方案设计阶段 系统开发与测试阶段 系统部署与培训阶段 试点运行与优化阶段 总结与评估阶段 三、试点实施步骤 需求分析与方案设计阶段 1、成立由企业生产、工艺、质量、设备、IT 等多部门人员组成的项目团队,与 MES 供应商共…

ShuffleNet V2:高效卷积神经网络架构设计的实用指南

摘要 https://arxiv.org/pdf/1807.11164 当前,神经网络架构设计大多以计算复杂度的间接指标,即浮点运算数(FLOPs)为指导。然而,直接指标(例如速度)还取决于其他因素,如内存访问成本…

【Opencv学习】PART1-图像基础处理

目录 一、图像的读入、显示和保存 1、读入图像 imread函数 范例 显示控制参数 2、显示图像 imshow函数 范例 tips waitkey函数 含义 delay参数: tips destoryAllWindows函数 3、保存图像 imwrite函数 范例 实操 01-读入显示保存 代码 结果 二、图像处理入…

硬中断关闭后的堆栈抓取方法

一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段,帮助我们发现问题,识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里,除了panic问题…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验,同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏,排除了清晰度和功耗之间的平衡问题。该芯片…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台,具有简单轻量的部署方式与多样的功能,支持多种协议(如GB28181、RTSP、Onvif、RTMP)和设备类型(IPC、NVR等),提供视频直播、录像、回放…

ETAS工具导入DBC生成Com协议栈

文章目录 前言DBC配置关键属性Cobra参数配置Cobra使用isolar工程配置总结前言 ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项 DBC配置关键属性 对于普通Com报文,配置为周期发送,及其周期,NmMessage配置为No,示例如下: 对…

图形化界面MySQL(MySQL)(超级详细)

1.官网地址 MySQL :: Download MySQL Workbench 1.1在Linux直接点击NO thanks..... 下载完后是这个页面 1.2任何远端登录,再把jj数据库给授权 1.3建立新用户 进行连接 点击这个就运行了 只执行show tables;要先选中 圆圈处支持自己输入 点击这个就执…

vulhub靶场与pikachu靶场

一、搭建vulhub 环境:kaildocker 1.1 提权: :::color4 sudo su #权限升级为root ::: 1.2更新软件: :::color4 apt-get update ::: (此处我已更新过) 1.3安装HTTPS协议和CA证书: :::color4 apt-get install -y apt-transpo…

计算机网络socket编程(6)_TCP实网络编程现 Command_server

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论…

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期:20241124 学习目标:http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记: 安装requests 安装方式:pip/pip3 install requests 官网教程:Requests: HTTP fo…

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…

Docker安装ubuntu1604

首先pull镜像 sudo docker run -d -P m.daocloud.io/docker.io/library/ubuntu:16.04国内使用小技巧: https://github.com/DaoCloud/public-image-mirror pull完成之后查看 sudo docker images 运行docker sudo docker run -d -v /mnt/e:/mnt/e m.daocloud.io/…

【数据结构与算法】树和二叉树

【数据结构与算法】树和二叉树 文章目录 【数据结构与算法】树和二叉树前言一、树的基本概念二、二叉树的基本概念三、二叉树的递归遍历四、二叉树的编程五、二叉树的非递归遍历总结 前言 本篇文章将讲到树的基本概念,二叉树的基本概念,二叉树的递归遍历…

大语言模型---Llama7B和Llama8B的区别;模型参数量;权重文件的不同;嵌入层权重的不同;输入序列长度的不同;应用场景

文章目录 1.概要2. 模型参数量3. 权重文件的不同4. 嵌入层权重的不同5. 输入序列长度的不同6. 应用场景 1.概要 LLaMA(Large Language Model Meta AI)是由Meta开发的一系列语言模型,其中不同版本的参数量(如7B、8B等)…

Android Binder技术概览

Android中的Binder是一种基于远程过程调用(Remote Procedure Call, RPC)的轻量级通信机制,核心用于 Android 系统中的进程间通信(Inter-Process Communication, IPC)。Binder 是 Android 系统中不可或缺的一部分&#…

NoteExpress导入知网论文无法智能更新题录的处理方法

知网论文下载下来一般为“标题_作者.caj”,只要在导入文件时对字段默认值进行设置就行了。 其他地方下载的论文也是一样,根据文件名称设置字段默认值。

搜索二维矩阵

搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则&#xff0c…

Mysql中的 TEXT 和 BLOB 解析

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷…

2024强网拟态决赛-eBeepf

漏洞分析与利用 分析后面看情况吧&#xff0c;有时间再写吧&#xff0c;先贴个利用脚本&#xff1a; #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <…