别再手动写GetOnly属性了!Record类型让不可变代码减少80%冗余

第一章:C# 9记录类型与不可变性的核心价值

C# 9 引入的记录类型(record)为 .NET 开发者提供了一种简洁且语义明确的方式来定义不可变的数据模型。记录类型本质上是类的特殊形式,其设计初衷是为了更好地表示数据聚合,并自动支持值语义、不可变性和清晰的构造语法。

记录类型的基本语法与行为

使用 record 关键字定义的类型默认具备不可变性,通过 init 访问器在对象初始化时赋值,之后无法更改。

public record Person(string FirstName, string LastName, int Age);

// 使用示例
var person = new Person("Alice", "Smith", 30);
// person.Age = 31; // 编译错误:属性为只读

上述代码中,Person 是一个位置记录(positional record),编译器自动生成构造函数、属性和重写的 Equals、GetHashCode 方法,确保两个具有相同值的记录被视为相等。

不可变性的优势
  • 提升线程安全性:不可变对象在多线程环境下无需额外同步机制
  • 简化调试与测试:对象状态不会意外更改,行为更可预测
  • 增强函数式编程风格:支持纯函数和无副作用的操作

记录与类的关键区别

特性记录(record)普通类(class)
默认相等性比较基于值(Value-based)基于引用(Reference-based)
可变性默认不可变(可通过定义修改)默认可变
复制操作支持 with 表达式创建副本需手动实现克隆逻辑

利用 with 表达式,可以轻松创建记录的修改副本:

var person2 = person with { Age = 31 };
Console.WriteLine(person2); // 输出: Person { FirstName = Alice, LastName = Smith, Age = 31 }

这一特性极大简化了在函数式编程或状态转换场景下的数据处理逻辑。

第二章:深入理解记录类型的不可变语义

2.1 记录类型如何实现默认不可变设计

记录类型通过编译器自动生成不可变属性和只读构造函数,确保实例状态在创建后无法修改。
不可变属性的生成
记录类型的属性在编译时被转换为只读字段,仅提供 getter 方法。例如 C# 中的记录声明:
public record Person(string Name, int Age);
上述代码等价于手动定义只读属性和构造函数,所有字段在初始化后不可更改。
值相等性与不可变性协同
记录类型自动重写 Equals 和 GetHashCode,基于属性值进行比较,而非引用。这保证了不可变对象在集合中的行为一致性。
  • 属性在构造时赋值,运行期禁止修改
  • 复制操作通过 with 表达式生成新实例
  • 线程安全得益于状态不可变

2.2 从类到记录:可变性陷阱的规避实践

在面向对象设计中,普通类常因暴露可变状态而引发数据不一致问题。通过引入不可变记录(record),可有效规避此类风险。
传统类的可变性隐患

以下Java类允许外部修改字段,导致状态不可控:

public class Person {
    public String name;
    public int age;
}

直接暴露字段或提供setter方法会破坏封装性,多个引用可能持有同一实例,造成隐式数据污染。

使用记录实现不可变性

Java 14+ 引入的 record 自动创建不可变结构:

public record Person(String name, int age) {}

该语法生成私有final字段、构造器、访问器及重写的equals、hashCode和toString方法,确保实例一旦创建便不可更改。

  • 避免共享状态带来的副作用
  • 提升并发安全性
  • 简化对象比较与序列化逻辑

2.3 with表达式与非破坏性复制机制详解

在现代编程语言中,with表达式被广泛用于实现非破坏性数据复制。它允许开发者基于现有对象创建新实例,仅修改指定属性,而原始对象保持不变。
语法结构与语义
type User struct {
    Name string
    Age  int
}

u1 := User{Name: "Alice", Age: 25}
u2 := u1 with { Age: 30 }
上述代码中,with表达式从u1创建u2,仅更新Age字段。原始u1未被修改,确保了数据不可变性。
非破坏性复制的优势
  • 提升数据安全性,避免意外副作用
  • 支持函数式编程风格的状态转换
  • 便于实现时间旅行调试、状态回滚等高级功能

2.4 编译器自动生成的不可变成员方法分析

在现代编程语言中,编译器常为不可变数据结构自动生成安全的访问方法,以确保对象状态的完整性。这些方法通常包括只读属性访问器和哈希值计算逻辑。
自动生成的方法类型
  • Getter 方法:为每个字段生成公共只读访问器
  • Equals/Hashcode:基于字段内容生成一致性比较逻辑
  • ToString():提供结构化字符串表示
代码示例与分析
type Person struct {
    Name string
    Age  int
}

// 自动生成的等价方法
func (p Person) Equals(other Person) bool {
    return p.Name == other.Name && p.Age == other.Age
}

func (p Person) HashCode() int {
    return hash(p.Name) ^ hash(p.Age)
}
上述代码展示了编译器可能为不可变结构体隐式生成的比较逻辑。通过字段组合计算哈希值,确保在集合类数据结构中行为一致。

2.5 引用相等与值语义在记录中的协同作用

在现代编程语言中,记录(record)类型通常采用值语义进行比较,而对象引用则基于引用相等。当两者共存时,理解其协同机制至关重要。
值语义下的相等判断
记录类型的实例在比较时关注的是字段的值是否一致,而非内存地址:

public record Point(int X, int Y);

var p1 = new Point(3, 4);
var p2 = new Point(3, 4);
Console.WriteLine(p1 == p2); // 输出: True
尽管 p1 和 p2 是不同对象,但由于记录默认实现值相等,只要字段值相同即判定相等。
引用相等的边界场景
  • 使用 ReferenceEquals 可绕过值语义,直接比较内存地址;
  • 在高并发或缓存场景中,需明确区分“内容相同”与“同一实例”。
这种协同设计既保障了数据一致性,又提升了逻辑表达的直观性。

第三章:不可变数据建模的最佳实践

3.1 使用记录类型构建领域模型的优势

使用记录类型(Record Types)构建领域模型能显著提升代码的可读性与维护性。其核心优势在于通过不可变数据结构表达领域实体,减少副作用。
类型安全与语义清晰
记录类型在编译期即可验证字段结构,避免运行时错误。例如在 C# 中:

public record Customer(string Id, string Name, string Email);
该定义不仅声明了构造逻辑,还自动生成相等性比较、复制和格式化方法,减少样板代码。
提升开发效率
  • 自动实现 GetHashCode 与 Equals
  • 支持 with 表达式进行非破坏性修改
  • 与模式匹配结合,增强业务逻辑表达力
这种设计使领域对象更贴近真实业务语义,强化了模型的一致性和表达能力。

3.2 不可变对象在并发编程中的安全性保障

在并发编程中,不可变对象因其状态一旦创建便无法修改的特性,天然具备线程安全优势。多个线程访问不可变对象时,无需额外的同步机制即可避免数据竞争。
不可变性的核心原则
  • 对象创建后其状态不可更改
  • 所有字段为 final 且为私有
  • 不提供任何 setter 或状态变更方法
代码示例:Java 中的不可变类
public final class ImmutablePoint {
    private final int x;
    private final int y;

    public ImmutablePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() { return x; }
    public int getY() { return y; }
}
该类通过 final 类声明防止继承,private final 字段确保内部状态不可变。多个线程读取 x 和 y 时不会发生写操作,因此无需锁机制即可保证一致性。

3.3 与EF Core等ORM框架的集成策略

在现代.NET应用中,Dapper与EF Core的协同使用可兼顾性能与开发效率。通过分层设计,将高频查询交由Dapper处理,复杂关系操作保留给EF Core。
混合使用模式
采用“读写分离”架构,EF Core负责实体跟踪与事务管理,Dapper执行只读查询:
public async Task<IEnumerable<OrderDto>> GetOrdersWithCustomerAsync()
{
    using var connection = new SqlConnection(connectionString);
    const string sql = @"
        SELECT o.Id, o.OrderDate, c.Name as CustomerName 
        FROM Orders o
        JOIN Customers c ON o.CustomerId = c.Id";
    return await connection.QueryAsync<OrderDto>(sql);
}
该查询绕过EF上下文,直接映射到DTO,显著提升读取性能。
共享事务上下文
确保两者参与同一事务:
  • 先通过EF Core开启事务
  • 将事务传递给Dapper的ExecuteAsync调用
  • 统一提交或回滚

第四章:从传统属性到记录类型的演进实战

4.1 消除手动GetOnly属性的冗余代码

在传统开发模式中,为实体类定义只读属性常需手动编写大量样板代码,导致维护成本上升。
问题示例
public class Order
{
    private readonly decimal _total;
    public decimal Total => _total; // 手动声明GetOnly
}
上述代码中,Total 属性虽仅为只读暴露,但仍需显式声明字段与属性,造成重复。
优化方案
借助自动属性初始化语法,可简化为:
public class Order
{
    public decimal Total { get; } = CalculateTotal();
}
该写法通过 get; 限定仅允许读取,并在构造时初始化,消除冗余字段声明。
  • 减少代码量,提升可读性
  • 编译器确保不可变性,增强线程安全
  • 支持表达式初始化,逻辑更集中

4.2 迁移现有POCO类至记录类型的重构技巧

在C#中,将传统的POCO类重构为记录类型(record)可显著提升不可变性和语义清晰度。记录类型通过值相等性比较简化了对象对比逻辑,适用于数据承载场景。
从POCO到记录的转换示例
public record Person(string Name, int Age);
上述代码定义了一个仅含主构造函数的记录类型,编译器自动合成属性、构造函数、Deconstruct方法及基于值的Equals实现。相比传统POCO,减少了样板代码。 若需保留可变性,可使用init属性:
public record Person
{
    public string Name { get; init; }
    public int Age { get; init; }
}
这允许在对象初始化时赋值,之后不可更改,兼顾封装与灵活性。
迁移建议步骤
  • 识别仅用于存储数据的POCO类
  • 优先使用位置记录语法简化声明
  • 对需要额外方法或验证的场景,采用完整记录语法
  • 测试相等性行为是否符合预期

4.3 在API响应与DTO中应用记录类型

在现代Web服务开发中,API响应数据的结构化表达至关重要。使用记录类型(Record Types)可显著提升数据传输对象(DTO)的清晰度与不可变性,尤其适用于只读响应场景。
不可变性的优势
记录类型天然支持不可变语义,确保API响应在传输过程中不被意外修改,增强系统安全性与可预测性。
简化DTO定义

public record UserResponse(string Id, string Name, string Email);
上述C#代码定义了一个简洁的用户响应DTO。编译器自动生成构造函数、属性访问器及值相等比较逻辑,大幅减少样板代码。
  • 自动实现Equals和GetHashCode
  • 支持解构语法,便于数据提取
  • 序列化友好,适配JSON输出
通过记录类型,API契约更明确,维护成本降低,同时提升团队协作效率。

4.4 单元测试中不可变记录的验证优势

在单元测试中,使用不可变记录(Immutable Records)能显著提升断言的可靠性与测试可预测性。由于对象状态在创建后无法更改,测试中对输出结果的验证更具确定性。
测试数据一致性保障
不可变对象确保测试过程中数据不被意外修改,避免副作用干扰测试结果。

public record User(String name, int age) {
    public User {
        Objects.requireNonNull(name);
    }
}
上述 Java 记录类一旦实例化,字段不可更改,便于在测试中安全传递和比对。
简化断言逻辑
测试时可直接比较对象整体,无需逐字段验证:
  • 减少样板代码
  • 提升测试可读性
  • 降低维护成本

第五章:总结与未来展望

技术演进的持续驱动
现代软件架构正加速向云原生和边缘计算融合。以 Kubernetes 为核心的编排系统已成标准,但服务网格(如 Istio)与 WASM 插件模型的结合正在重构流量治理方式。例如,在高并发网关中使用 WebAssembly 实现动态策略注入:

// 示例:WASM 插件处理请求头
func handleRequest(req http.Request) http.Request {
    if pluginEnabled("auth-header-inject") {
        req.Header.Set("X-Auth-Context", generateToken())
    }
    return req
}
可观测性的深度整合
分布式追踪不再是附加功能,而是系统设计的一等公民。OpenTelemetry 已成为跨语言追踪的事实标准。以下为典型微服务链路采样配置:
服务名称采样率数据导出端点
order-service10%otlp-collector-prod:4317
payment-gateway100%otlp-collector-prod:4317
AI 驱动的运维自动化
AIOps 正在改变故障响应模式。某金融客户通过 Prometheus 指标流训练 LSTM 模型,实现磁盘 I/O 异常提前 8 分钟预警,误报率低于 5%。实际部署中需注意特征归一化与滑动窗口设置。
  • 收集节点级指标:CPU、内存、磁盘队列深度
  • 使用 Kafka 流式传输至特征存储
  • 每 15 秒触发一次模型推理
  • 告警经规则引擎二次过滤后推送

监控数据流:Exporter → Agent → Stream Processor → ML Model → Alert Router

JDK17新特性解析:Record、模式匹配与密封类实战 Java语言近年来通过Record类型、模式匹配等特性显著提升了开发效率。Record作为轻量级数据载体,自动实现equals/hashCode等方法,解决了传统POJO的样板代码问题。模式匹配则通过智能类型推断简化了instanceof判断流程,配合switch表达式可构建更清晰的分支逻辑。密封类(Sealed Class)通过限制继承关系增强了类型系统安全性,特别适合构建严谨的领域模型。这些特性在微服务DTO传输、数据处理管道等场景表现优异,实测显示Record序列化性能比传统JavaBean提升15- 阅读详情

相关推荐

CarPlay wired(USB)连接方案

CarPlay的wired(USB)的连接方案要求车载设备至少要支持USB2.0 Hi-Speed,支持USB Host Mode,该模式要求车载设备能够工作在USB device模式下,因为Apple设备在CarPlay中是作为USB Host的。而通常情况下,车载设备USB是工作在USB Host模式的,而外接的USB设备是工作在USB Device模式的,因而在这种情况下的CarPlay wired(USB)连接方案中就需要进行USB的模式切换。模式切换完成后便是Apple设备(USB HOST)的枚

Ke8323的博客 1万+

Java 16 新特性:record类

以前我们定义类都是用class关键词,但从Java 16开始,我们将多一个关键词record,它也可以用来定义类。record关键词的引入,主要是为了提供一种更为简洁、紧凑的final类的定义方式。 下面就来具体了解record类的细节。配套视频教程:Java 16 新特性:使用record声明类 声明record类 声明record类的基础语法: record range(int start, int end){} 我们知道class类可以在单独文件中生命,也可以在其他类中申明。那么record类也一样,

程序猿DD 4546

最近爆火的 Ontology 本体是什么?一文看懂基础概念 + 落地实操

1993 Tom Gruber原版定义:本体是对领域概念化模型的显式形式化规范。1998 Studer完善通用定义:本体是共享、明确、形式化的领域概念模型规范。大白话翻译:本体就是机器能看懂的行业词典+业务规则手册。数据库只管存数据,本体只管定规则,知识图谱是规则+数据结合体。区别于普通开源本体工具,这款国产商用本体平台核心优势:业务沙盘推演、可控业务数据写回、全链路字段级数据血缘审计,适配企业生产级业务落地。

驽马不舍 366

Java记录(Record)

一个专门用于描述它可以自动生成 对 定义数据 进行创建、设置、访问、比较等代码,所以也被称作“数据类”。记录类 专用于(有点像JavaBean),的。记录类的对象在初始化的时候就保存了数据,以后这里面的数据是不能修改的了。

BroRiver 9234

阿里数据集(cluster-trace-v2018)提取

阿里数据集提取 本数据集采用的是阿里集群数据集-2018 详情可参考该文献:https://blog.youkuaiyun.com/weixin_41988248/article/details/92431588 CSV数据集提取操作见:https://blog.youkuaiyun.com/lucky_shi/article/details/105321149 关于read_csv包的用法见:https://blog.youkuaiyun.com/dc19971118/article/details/107721340 从阿里数据集来看,我

5-StarrySky的博客 3342

2025最新正版Autodesk 3ds Max 2022安装教程:从下载到中文环境配置全流程解析

Autodesk 3ds Max 2022是一款专业的三维建模、动画和渲染软件,广泛应用于影视制作、游戏开发、建筑可视化等领域。

waicsdn_haha的博客 1万+

深入JDK 17的语法新特性

break语句只能出现在switch语句里,不能出现在switch表达式里;yield语句只能出现在switch表达式里,不能出现在switch语句里;switch表达式需要穷举出所有的情景,而switch语句不需要情景穷举;使用冒号标识符的swtich形式,支持情景间的fall-through;而使用箭头标识符的swtich形式不支持fall-through;使用箭头标识符的swtich形式,一个case语句支持多个情景;而使用冒号标识符的swtich形式不支持多情景的case语句。

A1234543211232的博客 310

Origin绘制带差异显著性标记的分组均值条形图|科研论文图表教程(附数据格式模板)

传统柱状图虽能呈现组间均值差异,却隐藏个体数据分布;散点图虽能展示原始数据,却难以直观凸显统计显著性。带差异显著性(*)的分组均值条形图——它以“双层叙事”的创新设计,同时呈现群体特征与个体差异。

weixin_50236590的博客 1493

【Java】Java新特性--Records记录类型

这些方法都是根据Records的字段定义的。例如,如果两个Records具有相同的字段值,则它们被认为是相等的。默认的toString方法将返回包含Records的所有字段及其值的字符串。Records的字段默认是public的,并且具有与它们相应的访问器方法。例如,我们可以使用name()方法来获取name字段的值,使用age()方法来获取age字段的值。在Records的声明中,字段必须是公共的,并且必须具有与它们相应的访问器方法。除了默认的方法外,Records还可以包含自定义的方法。

qq_22744093的博客 2256

从 SM30 到 Fiori:在 SAP BTP ABAP Environment 里创建 Business Configuration 配置维护对象的完整路径

摘要 在SAP BTP的ABAP环境中,传统SAP GUI和SM30配置方式被Business Configuration (BC)替代。BC通过Fiori应用维护配置,支持传输和权限控制。配置表需满足可维护性条件,如允许数据维护、包含技术字段等。通过ADT生成Maintenance Object和Transport Object,实现配置发布与治理。权限管理需创建IAM App和Business Catalog,确保配置可维护。BC在云端延续了可控、可追溯、可发布的治理原则。 (字数:150)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 242

022、Conv-BN-SiLU 基础卷积块:构造函数参数计算,前向传播的 PyTorch 逐行实现

本文详细解析了Conv-BN-SiLU卷积块的实现细节与注意事项。作者从调试经历出发,指出bias参数冗余会导致数值不稳定,强调卷积层应设置bias=False。文章对比了SiLU与ReLU的特性差异,逐行分析了构造函数参数计算(包括自动填充、分组卷积等)和前向传播过程,特别讲解了BN层与SiLU激活的数值特性。最后分享了三个实践中的常见问题:BN的momentum设置、SiLU输出范围的影响,以及分组卷积的通道对齐要求,并提供了卷积与BN融合的推理优化技巧。全文聚焦实际工程实现中的关键细节,具有较强实操指

ai技术增长的博客 218

Java record 记录用法详解

(使用紧凑形式,无需重复赋值):java复制下载public Point { // 紧凑构造函数(无参数列表)throw new IllegalArgumentException("坐标不能为负数");// 编译器自动注入 this.x=x;this.y=y;

BillKu的博客 2058

图像质量评估和点云质量评估

本文介绍了图像质量评估和点云质量评估的基本概念和常用方法,并提供了相应的源代码示例。图像质量评估关注图像的视觉质量,常用的评估指标包括均方误差(MSE)、结构相似性指标(SSIM)和峰值信噪比(PSNR)。点云质量评估关注点云数据的准确性和完整性,常用的评估方法包括点云配准质量评估、稠密重建质量评估和离群点检测质量评估。在计算机视觉和计算机图形学领域中,图像质量评估和点云质量评估是两个重要的任务。图像质量评估旨在量化图像的视觉质量,而点云质量评估则关注于点云数据的准确性和完整性。

XsupDatabase的博客 990

Java record用法与应用场景详解

Java 14引入的record是一种简化不可变数据类定义的新特性。它自动生成final字段、构造函数、访问器方法以及equals()、hashCode()和toString()方法,大幅减少样板代码。record支持自定义紧凑构造函数、添加方法和静态字段,可实现接口但不能继承其他类。主要适用于DTO、配置参数、方法多返回值等数据载体场景,但不适合需要可变状态或复杂继承的类。相比传统JavaBean,record提供了更简洁的语法、明确的数据语义和天然的不可变性,是Java向现代化编程模式发展的重要改进。

2502_94251649的博客 624

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java 记录类(Record)详解

Java 记录类(Record)是 Java 14 引入的预览特性,并在 Java 16 中正式发布,旨在简化不可变数据载体的定义。记录类自动生成构造器、访问器、equals、hashCode 和 toString 方法,显著减少样板代码。它天生不可变,适合用于 DTO、值对象等场景。本文将全面解析记录类的语法特性、实现原理、适用场景与最佳实践。

持续输出Java相关知识 4372

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java Record类介绍及使用

Java中Record类的用法

810cheng 1743

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Record关键字

/ 输出: Person { FirstName = John, LastName = Doe, Age = 30 }// 输出: Person { FirstName = John, LastName = Doe, Age = 31 }// 输出: True (值相等)它主要用于简化不可变数据模型的创建,特别适合用于表示值类型的数据(如 DTO、实体、值对象等)。是 C# 9.0 引入的一个强大特性,用于简化不可变数据模型的创建。类型的属性默认是只读的(init-only),创建后不能修改。

songtao.yu 1302

Record类只能用于数据载体?:打破认知的5个使用边界限制

突破Java 14记录类使用限制,解锁Record类在不可变数据载体之外的5大应用场景。涵盖构造器增强、方法扩展、泛型支持等核心技巧,揭示其在领域模型、API响应、函数式编程中的灵活运用。打破只能存数据的认知误区,掌握高效编码实践,值得收藏。

DeepLens的博客 308

Java 16 引入的 record 类型

Java 16引入的public static record是数据类的精简实现,适用于DTO等场景。record自动生成构造器、equals等方法,字段不可变。定义在类内部时需加static以避免持有外部类引用。其特性包括:仅支持接口实现、不可继承、不可修改字段。在Spring Boot中特别适合用于API响应封装。这种语法大幅减少了样板代码,但仅支持Java 16及以上版本。

何哥的博客 984

深入理解 C# 中的 Record 类型

深入理解 C# 中的 Record 类型

鲤籽鲲的博客 3701

java记录类介绍

在Java中,记录类(Record)是一种特殊的数据类,用于简化不可变数据对象的创建和使用。记录类是在Java 14中作为预览功能引入的,并在Java 16中成为正式功能。

qq_27390023的博客 915

Java中的record详解

一文详解record八股

NingMaoKing的博客 1783

Java Record 记录

Java中record记录的简单介绍。

m0_74963444的博客 633

SpringBoot3笔记

一、JDK新特性 1.有用的新特性 JDK8-19新增了不少新特性: Java Record Swich 开关表达式 Text Block 文本块 var 声明局部变量 sealed 密封类 2.Java Record java14中预览的新特性叫做Record,是一种特殊类型的java类。Record相当于一个内置的,语言级别的Lombok,可用来创建不可变类,语法简短。 当创建java类,都会创建大量的样板代码如set,get,构造方法,重新hashcode,tostring,equals方法。 j

Json_xun的博客 601

Java新特性探秘记录类型(Record)如何简化你的代码

虽然记录类型自动生成许多方法,但仍可以自定义行为。例如,可以添加自定义构造函数或重写自动生成的方法:}}这展示了如何在记录类型中添加验证逻辑和自定义方法。Java记录类型通过减少样板代码、确保不可变性和提高代码可读性,显著简化了数据载体的创建。它是Java语言向更简洁、更表达性强方向发展的一个重要步骤,适用于多种数据表示场景。

lawczj的博客 314

为什么应该用record来定义DTO

DTO DTO是数据传输对象(Data Transfer Object)的简称,主要用作在进程之间传送数据。 DTO的特点是它不包含任何业务逻辑或行为。 下面是一个典型的DTO定义: publicclassUserDto { publicintId{get;set;} publicstringName{get;set;} } DTO的不变性 在实际使用中,我们并没有在进程之间来回传输具体的对象,而是使用某种形式的序列化,因此,DTO的属性不需要更改...

寒冰屋的专栏 436
上一篇: IEnumerator协程到底怎么用?3分钟彻底搞懂Unity协程机制
下一篇: 避免代码冗余,$字符串插值的6个最佳实践(资深架构师推荐)
CodeIsle
博客等级 码龄1年 145粉丝 1966原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值