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

ops/2024/11/26 16:32:59/

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

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

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

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

  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.ppmy.cn/ops/136870.html

相关文章

RLC串联谐振,品质因数的影响

串联谐振 电路谐振是正弦稳态电路的一种特定的工作状态,通常发生在电感L,电容C和电阻R构成的电路。当高频信号通过电感或者电容的时候会产生感抗或者容抗,电感的感抗随着频率的增加而增加,电容的容抗随着频率的增加而降低。 对于串…

Excel的图表使用和导出准备

目的 导出Excel图表是很多软件要求的功能之一,那如何导出Excel图表呢?或者说如何使用Excel图表。 一种方法是软件生成图片,然后把图片写到Excel上,这种方式,因为格式种种原因,导出的图片不漂亮&#xff0c…

随手记:鼠标触顶方法

// 鼠标触顶方法 scrollMethod() { window.onscroll () > { let t document.documentElement.scrollTop || document.body.scrollTop; if(t > 10) { this.positionStyle.top 0px; }else{ this.positionStyle.top 128px; } } },

【大模型-智能体】AutoGen Studio测试和导出工作流程

1. 测试工作流程 AutoGen Studio允许用户针对任务交互式地测试工作流程,并审查由此产生的成果物(如图像、代码和文档)。此外用户还可以查看Agent工作流程在处理任务时的“内心独白”,并查看诸如运行成本(如回合数、令牌…

大语言模型提示词工程学习--写小说系列(文心一言豆包通义千问):2~确定核心谜团

在上一篇 大语言模型提示词工程学习--写小说系列(文心一言&豆包&通义千问):1~创作前的准备工作 中,我们已经使用AI确定了进行小说创作的8个步骤,在接下来的章节中,我们将一步一步按照AI给出的步骤&…

环形缓冲区

什么是环形缓冲区 环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个"环"。…

Linux(Ubuntu)升级openssh至9.6版本

前言: 修复 Openssh 命令注入漏洞(CVE-2020-15778)、OpenSSH ssh-agent远程代码执行漏洞(CVE-2023-38408)、OpenSSH 安全漏洞(CVE-2021-41617)、OpenSSH 信息泄漏漏洞 (CVE-2023-51385)将Openssh升级至9.6p1即可。 升级 OpenSSH 版本需要谨慎,特别是生…

跨境出海安全:如何防止PayPal账户被风控?

今天咱们聊聊那些让人头疼的事儿——PayPal账户被风控。不少跨境电商商家反馈,我们只是想要安安静静地在网上做个小生意,结果不知道为什么,莫名其妙账户就被冻结了。 但其实每个封禁都是有原因的,今天就来给大家分享分享可能的原…