C# 9 With表达式冷知识曝光,90%开发者不知道的底层实现机制

第一章:C# 9记录类型与With表达式概述

C# 9 引入了记录类型(record)这一全新特性,旨在简化不可变数据类型的定义与使用。记录类型本质上是类的特殊形式,专为存储数据而设计,支持值语义相等性判断,并内置了简洁的语法来创建和复制实例。

记录类型的基本定义

使用 record 关键字可快速声明一个不可变的数据容器。与传统类不同,记录会自动重写 Equals()、GetHashCode() 和 ToString() 方法,基于值而非引用进行比较。
// 定义一个表示用户信息的记录类型
public record Person(string FirstName, string LastName, int Age);

// 实例化记录
var person1 = new Person("张", "三", 30);
var person2 = new Person("张", "三", 30);

// 输出 True,因为记录按值比较
Console.WriteLine(person1 == person2); // True

With 表达式的用途

记录类型配合 with 表达式,可实现非破坏性修改——即在不改变原对象的前提下创建一个修改后的副本。
// 使用 with 表达式创建新实例并更新部分属性
var updatedPerson = person1 with { Age = 31 };

Console.WriteLine(person1.Age);      // 输出 30
Console.WriteLine(updatedPerson.Age); // 输出 31

记录类型的优势总结

  • 减少样板代码:自动生成相等性逻辑和只读属性
  • 提升代码可读性:清晰表达“此类型用于保存数据”
  • 支持函数式编程风格:结合 with 表达式实现不可变更新
  • 与模式匹配良好集成:适用于现代 C# 的多种语言特性
特性说明
值相等性两个记录若所有属性值相同,则视为相等
不可变性位置参数自动转为只读属性
With 表达式支持克隆并修改指定属性

第二章:With表达式的核心机制解析

2.1 记录类型的不可变性设计原理

记录类型的不可变性源于函数式编程对数据安全与线程一致性的追求。一旦创建,其状态不可更改,确保在并发环境中无副作用共享。
不可变性的核心优势
  • 避免竞态条件:多线程访问时无需加锁
  • 简化调试:对象生命周期内状态恒定
  • 支持结构化比较:基于值而非引用判断相等性
代码示例:Java record 的不可变实现
public record Person(String name, int age) {
    public Person {
        if (age < 0) throw new IllegalArgumentException();
    }
}
上述代码中,Person 的字段自动设为 final,构造逻辑通过隐式初始化器校验。编译器自动生成 equals()、hashCode() 与 toString(),所有访问器均为纯函数,不改变内部状态。
内存与性能权衡
特性影响
对象不可变每次修改需新建实例
线程安全消除同步开销

2.2 With表达式背后的副本创建过程

在函数式编程中,`With` 表达式常用于基于原对象生成一个修改后的副本,而不改变原始数据。该机制的核心在于不可变性(immutability)与结构共享(structural sharing)。
副本生成流程
当调用 `With` 表达式时,系统会创建原对象的浅拷贝,并仅替换指定字段,其余部分指向原对象的引用,从而提升性能。
type User struct {
    Name string
    Age  int
}

func (u User) WithName(name string) User {
    u.Name = name
    return u // 返回副本
}
上述代码中,`WithName` 方法接收值类型 `User`,修改后返回新实例,原对象保持不变。参数传递采用值拷贝,确保隔离性。
内存优化策略
  • 利用结构共享减少内存复制开销
  • 编译器可对无副作用的副本操作进行内联优化

2.3 编译器如何生成隐式Clone方法

在某些现代编程语言中,编译器会根据类型定义自动合成隐式 `Clone` 方法。这一过程发生在类型满足特定条件时,例如所有字段均支持复制操作。
自动生成的触发条件
  • 结构体或类的所有成员均实现 `Clone` trait 或接口
  • 未显式定义 `clone()` 方法
  • 类型被标记为可复制(如 Rust 中的 `#[derive(Clone)]`)
代码示例与分析

#[derive(Clone)]
struct Point {
    x: i32,
    y: i32,
}
上述代码中,编译器自动为 `Point` 生成 `clone()` 方法。其逻辑等价于:

impl Clone for Point {
    fn clone(&self) -> Self {
        Point { x: self.x.clone(), y: self.y.clone() }
    }
}
每个字段调用自身的 `clone()`,确保深拷贝语义正确。该机制减少样板代码,提升开发效率。

2.4 基于值语义的相等性比较联动机制

在现代编程语言中,基于值语义的类型通过其内部字段的值来判断相等性,而非引用地址。这种机制广泛应用于结构体、元组和值对象中,确保逻辑一致性。
相等性判定流程
当两个值语义对象进行比较时,系统逐字段递归比较其内容:
  • 字段数量必须一致
  • 对应字段类型兼容
  • 每个字段的值相等
代码示例:Go 中的结构体比较
type Point struct {
    X, Y int
}

p1 := Point{1, 2}
p2 := Point{1, 2}
fmt.Println(p1 == p2) // 输出: true
上述代码中,Point 是值类型,== 操作符自动比较各字段。只要所有字段值相同,即判定为相等,无需重写比较逻辑。
联动更新机制
某些框架利用值语义的不变性实现自动状态同步,当检测到值变化时触发视图刷新或事件广播,提升响应式编程效率。

2.5 With表达式在继承记录中的行为分析

在C#中,`with`表达式用于创建基于现有记录的副本,并可选择性地修改部分属性。当涉及继承记录时,其行为需特别关注类型推断与成员覆盖。
继承结构中的With语义
派生记录使用`with`时,实际操作的是声明类型的属性。若基记录与派生记录包含同名属性,虚特性将影响最终结果。

record Base { public string Name { get; init; } }
record Derived(string Name, int Age) : Base(Name);
var d1 = new Derived("Tom", 25);
var d2 = d1 with { Age = 26 };
上述代码中,`d2`为新实例,`Name`沿用`d1`值,`Age`更新为26。`with`仅作用于`Derived`显式声明的`init`或`set`属性。
属性阴影与数据一致性
若派生命题重写基属性,`with`表达式依据静态类型决定修改目标,可能引发预期外行为,需谨慎设计属性继承结构。

第三章:底层IL代码与性能特征

3.1 反编译探查With表达式的实际调用逻辑

在 .NET 中,`using` 表达式通过 `IDisposable` 接口实现资源的确定性释放。编译器会将 `using` 语句转换为 `try-finally` 块,确保 `Dispose()` 方法被调用。
反编译示例代码

using (var file = File.Open("data.txt", FileMode.Read))
{
    Console.WriteLine(file.Length);
}
上述代码经编译后等价于:

FileStream file = File.Open("data.txt", FileMode.Read);
try
{
    Console.WriteLine(file.Length);
}
finally
{
    if (file != null)
        ((IDisposable)file).Dispose();
}
调用逻辑分析
  • 编译器自动插入 try-finally 结构,保障异常安全;
  • Dispose 调用置于 finally 块中,确保执行;
  • 对象需实现 IDisposable 接口,否则编译失败。

3.2 IL指令层面的对象复制与字段重载

在.NET运行时中,对象复制与字段重载的底层行为由IL(Intermediate Language)指令直接控制。通过分析生成的IL代码,可以深入理解引用复制与值复制的本质差异。
对象复制的IL实现
使用ldobj和stobj指令可实现值类型的逐字段复制,而引用类型则通过ldarg.0加载引用实现共享。例如:
ldarg.0      // 加载目标对象
ldarg.1      // 加载源对象
cpobj        // 执行对象复制
该指令序列用于结构体赋值,执行深拷贝语义,适用于值类型对象。
字段重载的多态机制
字段本身不支持重载,但方法对字段的访问可通过虚方法表实现动态绑定。以下为典型场景:
IL指令作用
callvirt调用虚方法,支持继承链查找
ldfld加载指定字段值
通过组合callvirt与ldfld,可在运行时根据实际类型获取对应字段逻辑,实现伪“字段重载”效果。

3.3 性能开销评估与内存分配模式

在高并发系统中,内存分配模式直接影响性能表现。频繁的动态内存申请会引发内存碎片和GC停顿,尤其在Go等带自动垃圾回收的语言中尤为显著。
对象复用与sync.Pool
使用`sync.Pool`可有效减少堆分配压力,提升对象复用率:

var bufferPool = sync.Pool{
    New: func() interface{} {
        return new(bytes.Buffer)
    },
}

func getBuffer() *bytes.Buffer {
    return bufferPool.Get().(*bytes.Buffer)
}
该模式通过池化机制将临时对象重复利用,降低GC频率。New函数用于初始化新对象,Get方法优先返回已回收实例,否则调用New创建。
内存分配对比
模式分配延迟GC影响
直接new低高
sync.Pool极低低

第四章:典型应用场景与最佳实践

4.1 在函数式编程中实现状态无副作用更新

在函数式编程中,状态的变更应避免直接修改原始数据,而是通过纯函数返回新的状态副本。这种方式确保了每次状态变化都是可预测且无副作用的。
不可变性与纯函数
通过纯函数处理状态更新,输入相同则输出一致,不依赖也不修改外部状态。例如,在 JavaScript 中使用对象展开语法实现不可变更新:

const updateUserName = (state, newName) => ({
  ...state,
  user: {
    ...state.user,
    name: newName
  }
});
该函数不修改原 `state`,而是返回一个新对象。`...state` 保留原有字段,嵌套的 `user` 对象也被展开以确保深层不可变性。`name` 字段被更新为 `newName`,其余属性保持不变。
优势对比
  • 避免意外的副作用导致的状态紊乱
  • 便于调试和测试,因函数无外部依赖
  • 支持时间旅行调试,利于开发工具追踪状态变迁

4.2 结合LINQ进行不可变数据集合转换

在函数式编程范式中,不可变集合与LINQ的结合使用能够显著提升代码的可读性与安全性。通过LINQ查询表达式,开发者可以在不修改原始数据的前提下完成过滤、映射和聚合等操作。
基本转换操作
使用`Select`、`Where`等标准查询操作符,可对不可变集合进行声明式转换:

var numbers = new List<int> { 1, 2, 3, 4, 5 };
var squares = numbers.Where(n => n % 2 == 0)
                    .Select(n => n * n)
                    .ToList();
上述代码从原集合中筛选偶数并计算平方值,生成新列表`squares`,原始`numbers`未被修改。`Where`用于条件过滤,`Select`实现投影转换,两者均返回新序列。
链式操作的优势
  • 操作具有清晰的语义分离
  • 每一步转换都保持数据不可变性
  • 便于单元测试与调试

4.3 领域模型中使用With表达式构建变体实例

在领域驱动设计中,实体常需基于原始状态生成变体实例。C# 中的 `with` 表达式提供了一种简洁、不可变的方式创建记录(record)类型的副本,并修改指定属性。
With 表达式的基本用法
public record Person(string Name, int Age);

var person1 = new Person("Alice", 30);
var person2 = person1 with { Age = 31 };
上述代码中,`person2` 是基于 `person1` 创建的新实例,仅 `Age` 属性更新为 31。`with` 表达式利用“复制并修改”语义,确保原对象不变,符合函数式编程原则。
嵌套对象的变体构建
当领域模型包含嵌套记录时,`with` 可结合路径更新实现深层复制:
  • 适用于配置快照、版本控制等场景
  • 提升对象克隆的安全性与可读性

4.4 多线程环境下安全共享数据的实践策略

数据同步机制
在多线程编程中,共享数据的访问必须通过同步机制控制,以避免竞态条件。常见的手段包括互斥锁、读写锁和原子操作。
  • 互斥锁(Mutex)确保同一时间只有一个线程可访问临界区;
  • 读写锁允许多个读操作并发,但写操作独占资源;
  • 原子操作适用于简单变量更新,避免锁开销。
var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()
    defer mu.Unlock()
    counter++ // 安全地修改共享数据
}
上述代码使用 sync.Mutex 保护对全局变量 counter 的写入。每次调用 increment 时,线程必须先获取锁,确保其他线程无法同时修改该值,从而保障数据一致性。
内存可见性与同步工具
除了互斥访问,还需确保一个线程的修改对其他线程立即可见。现代语言通过内存屏障和 volatile 或高级同步原语(如 sync.WaitGroup、channel)实现。

第五章:未来展望与进阶学习建议

拥抱云原生与微服务架构
现代应用开发正加速向云原生演进。掌握 Kubernetes 和 Docker 已成为后端工程师的核心竞争力。例如,在部署一个高可用 Go 服务时,可通过以下 Dockerfile 实现轻量构建:
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o main ./cmd/api

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
持续深化系统设计能力
面对复杂业务场景,良好的架构设计至关重要。建议通过参与开源项目提升实战能力,例如分析 etcd 的分布式一致性实现,或贡献 gin 框架的中间件优化。
  • 深入理解 CAP 定理在实际系统中的权衡
  • 掌握事件驱动架构(EDA)与消息队列(如 Kafka)的集成
  • 实践可观测性建设:日志、指标、链路追踪三位一体
构建个人技术成长路径
制定阶段性学习目标有助于避免知识碎片化。可参考以下进阶路线:
阶段重点方向推荐资源
初级进阶HTTP/3, gRPC, Redis 高级用法《Designing Data-Intensive Applications》
中级突破服务网格(Istio)、Serverless 架构Cloud Native Computing Foundation (CNCF) 技术栈
参与真实项目以锤炼工程素养
加入 CNCF 或 Apache 基金会孵化项目,不仅能接触工业级代码库,还能学习标准化的 CI/CD 流程与贡献规范。例如,为 prometheus 编写自定义 exporter,将极大提升对监控生态的理解。
C#工业级无人值守地磅系统设计与落地实践 无人值守地磅系统本质是工业现场高可靠闭环控制系统,其核心在于硬件通信稳定性、业务逻辑刚性约束与零接触运维能力的协同实现。基于C#构建的地磅上位机,依托.NET对Windows工控生态的原生支持、IOCP驱动的确定性实时响应,以及Windows服务+配置分离的分层架构,可有效应对电磁干扰、传感器漂移、断网断电等真实工况。技术价值体现在串口容错状态机、车牌识别自适应预处理、可热更新防作弊规则引擎等工程化设计;典型应用于钢铁厂、物流园区、砂石料场等地磅自动化称重场景。本文聚焦UartAssist.cfg硬件参数调 阅读详情

相关推荐

安装Quartus-II 13 和Modelsim

目录一、Quartus-II安装1.Quartus-II 13下载2.Quartus-II 13安装3.Quartus-II 13注册二、Modelsim安装 实验目的:安装Quartus-II 13 和Modelsim 实验环境:Windows10 参考资料:Quartus-II安装及使用 一、Quartus-II安装 1.Quartus-II 13下载 正点原子官方资料下载 百度网盘下载链接: https://pan.baidu.com/s/1a9d-bq9RZmWrRV542X4IEA 提取码:

qqq080的博客 8627

C# 9.0 record和with的定义及使用

record类型的实际是一个引用类型 ,但具备值类型的行为。重写了Equals等对象类型的比较方法,在两个不同引用的record对象的内容相同时,对两者进行==比较,判断两者相等为true。重写了ToString()方法,便于输出属性内容。还重写了和Equals()方法。1)定义record类型创建使用:用对象初始化器进行初始化,则在属性中使用init关键字,如下,init;init;注意:由于有set。

风清扬的专栏 1391

别再只做游戏了!用虚幻引擎5(UE5)给你的工厂车间做个数字双胞胎(附数据对接教程)

本文详细介绍了如何利用虚幻引擎5(UE5)构建工业数字孪生系统,实现工厂车间的智能可视化。通过UE5的高质量渲染和实时数据处理能力,结合OPC UA和MQTT协议,打造高效的数据对接方案,提升异常识别和设备管理效率。文章还分享了模型优化、可视化设计及典型工业场景的实战案例,助力企业迈向工业4.0。

weixin_33738555的博客 206

C# "with" 关键字

vb(vb.net) 的with关键字,不仅仅是减少代码冗余,对结构化和作用域以及编译器代码优化有很大的关系。 关于代码冗余,这个不用说,意义也不是很大。 但对于结构化、作用域和编译器优化,可以简单的举例进行解释: 例如程序中有两个PictureBox 对象 如果没有with语句,大家可能这么写: PictureBox pbA = new PictureBox(); PictureBo...

weixin_33854644的博客 725

从仿真到打样:PMOS栅极泄放电路设计全流程复盘与三个踩坑点总结

本文详细复盘了PMOS栅极泄放电路从仿真到打样的全流程设计,重点总结了三个关键踩坑点:三极管BE结过压击穿、静态功耗超标和栅极振荡现象。通过优化缓启动电路、改进保护设计和布局调整,最终实现18ms开通时间、190μs关断时间和8μA静态功耗的工业级性能指标,为类似电源开关设计提供实用参考。

weixin_28693683的博客 371

ABAP BOM展开避坑指南:CS_BOM_EXPL_MAT_V2函数参数配置详解

本文深入解析了SAP ABAP开发中用于物料清单展开的核心函数CS_BOM_EXPL_MAT_V2。针对其复杂的参数配置,如CAPID、STLAN、DATUV和MEHRS,提供了详细的避坑指南和最佳实践,帮助开发者避免数据错误与性能陷阱,实现高效、准确的BOM多层展开。

pea55的博客 855

With语句

with语句的作用是将代码的作用域设置到一个特定的对象中具体用法: with(expression) statement; let qs = location.search.substring(1); let hostName = location.hostname; let url = location.href; 使用with语句后: with(location){ let qs = sa...

lin_forget的博客 663

SMPLify-x-master | 复现记录

由于毕业设计中将会用到smpl模型,而smplify方法的各环境依赖版本比较老,复现不太容易,因此便进行了smplifyx方法使用smplx的方法。由于在过程中遇到较多坑,因此进行记录和分享。

qq_44916003的博客 5100

C# 9.0新特性详解系列之五:记录(record)和with表达式

1 背景与动机 传统面向对象编程的核心思想是一个对象有着唯一标识,表现为对象引用,封装着随时可变的属性状态,如果你改变了一个属性的状态,这个对象还是原来那个对象,就是对象引用没有因为状态的改变而改变,也就是说该对象可以有很多种状态。C#从最初开始也是一直这样设计和工作的。但是一些时候,你可能非常需要一种恰好相反的方式,例如我需要一个对象只有一个状态,那么原来那种默认方式往往会成为阻力,使得事情变得费时费力。 当一个类型的对象在创建时被指定状态后,就不会再变化的对象,我们称之为不可变类型。这种类型是线程安全的

chinaherolts2008的博客 2461

推理篇第3节:TensorRT基础——Builder、Engine、ExecutionContext生命周期

TensorRT模型优化与推理流程摘要 TensorRT是NVIDIA的深度学习推理优化器,通过Builder、Engine和ExecutionContext三阶段实现高效推理。Builder负责编译模型,执行图优化和kernel选择;Engine是优化后的推理计划;ExecutionContext管理运行时执行。编译期进行重量级优化(如算子融合、kernel调优),运行时快速执行。TensorRT 10.x引入新API,推荐使用buildSerialized方法。构建流程包括创建Builder、网络定义、

PeterPan的博客 503

30天入门 SAP BTP 开发系列之十四: 将 SAP Business Application Studio 里开发好的 Node.js 应用部署到 Cloud Foundry 环境中

本教程详细介绍了如何将SAP Business Application Studio中的Node.js应用部署到Cloud Foundry环境。在完成本地开发和测试后,通过cf login命令连接Cloud Foundry环境,配置manifest.yml文件指定应用参数和路由信息。使用cf push命令完成应用的上传和部署,最终使应用运行在SAP BTP的云端环境中。教程包含从路由创建到部署验证的完整流程,确保开发者能够成功将Node.js应用发布到生产环境。

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

【C#】说说 C# 9 新特性的实际运用

说说 C# 9 新特性的实际运用

德仔 1073

【2025软考高级架构师】论文篇——4、论可靠性系统中软件容错技术的应用

软件容错技术对软件的稳定性起着至关重要的作用,尤其是针对互联网性质的软件并发高存在流量峰值等问题,软件容错技术的应用的重要性就不言而喻了。经过这次我所采用的软件容错技术的方法和措施的实施效果后,使我也看到了自己身上的不足之处,我会在今后的架构设计过程中,不断更新自己的知识,不断完善自己的架构设计领域,设计出更好的软件架构,更好的支撑业务平台的运行,提高公司的竞争力,为公司为社会尽一份绵薄之力。

qq837993702的博客 618

Java 10 var类型推断陷阱曝光:90%开发者忽略的编译隐患

掌握Java 10局部变量类型推断var的正确用法,避开编译隐患。详解var在局部变量声明中的适用场景与限制,揭示类型推断失败的常见原因及规避策略。提升代码可读性与安全性,90%开发者忽略的细节全解析,值得收藏。

CompiShoal的博客 276

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据科学团队成功的关键:构建业务导向的数据价值流

数据科学团队的本质不是技术执行单元,而是驱动业务结果的价值转化系统。其核心原理在于将数据从原始采集、可信化处理、业务洞察生成、模型构建验证,到部署监控与反馈闭环,形成一条可度量、可协作、可追责的工程化流水线。技术价值体现在缩短决策周期、提升指标可解释性、保障模型长期有效;典型应用场景覆盖金融风控提效、电商留存优化、IoT预测性维护等高价值领域。实践表明,脱离业务语义的数据契约缺失与阶段职责模糊,是导致90%团队陷入‘分析-上线-失效’死循环的根本原因。本文聚焦Data Science Teams如何通过结构

weixin_30596165的博客 445

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Gemini 3 Pro幻觉真相:不是bug,是LLM的本质工作方式

大型语言模型(LLM)并非知识库,而是基于统计规律预测下一个词的概率引擎。其核心机制决定了‘AI幻觉’并非系统错误,而是当输入模糊、边界不清或需填补信息缺口时,模型以高置信度生成看似合理却无事实依据内容的必然表现。这种现象在文献生成、长上下文推理和实时数据任务中尤为突出,技术价值在于揭示了人机协同的新范式——不追求模型零幻觉,而通过结构化指令、外部验证接口与人工熔断机制构建可控工作流。本文聚焦谷歌Gemini 3 Pro在科研场景中的典型幻觉行为,结合AI幻觉、大型语言模型等关键概念,提供可落地的识别、过滤

weixin_34242819的博客 414

机器学习研究员的真实工作流:数据工程、工具链与职业生存指南

机器学习研究员的核心能力远不止模型设计与论文写作,而是扎根于数据工程、系统调试与跨领域协作等基础技术实践。从数据清洗、基线复现到分布式训练排障,真实工作80%时间消耗在数据管道构建、工具链适配与生产环境落地等‘脏活’上。这些环节直接受限于数据质量、框架版本兼容性、硬件拓扑与部署算子支持度等底层因素。掌握数据血缘追踪、梯度流可视化、混合精度通信优化等硬技能,不仅能提升实验效率,更是保障模型从实验室走向工业场景的关键。本文聚焦ML研究员在实际项目中高频遭遇的数据加载瓶颈、DDP同步失效、Triton部署崩溃等典

weixin_34228387的博客 427

盘点一些实用性很强的C#语法

从C# 10开始,with 表达式左侧操作数也可以为 struct 类型(https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/struct) 或 匿名类型(https://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/types/anonymous-types)。C#中的 with 和 VB.NET中的 With 用法不同。

2401_82584055的博客 1012

关于property装饰器

关于property装饰器 @property装饰器修饰的是原本的getter方法,这个被修饰的方法的getter方法名就是之后我们要用的属性名。 setter方法和deleter方法分别用 @属性名.setter 和 @属性名.deleter方法来修饰,由于装饰器是对函数包装之后返回一个新的东西,并且复制给原本的东西。所以这两个被修饰的方法的方法名都是属性名。 至少在我测试的过程中如果 @属性名.setter 和 @属性名.deleter方法来修饰的方法名不是属性名,那么属性会变成只读属性,如果赋值的话会

ice_cream985的博客 287

C# 9的一些新特性

模式匹配的增强,包括新的逻辑运算符、新的 is 表达式、新的 switch 表达式等。新的类型推断语法,包括 var 和 target-typed new 表达式。新的 Lambda 表达式的语法,包括更简洁的参数列表和更灵活的类型推断。新的记录类型(record types),可以用于快速创建不可变对象。新的 with 表达式,可用于基于现有记录类型创建新的记录类型。新的 init-only 属性,使属性只能在初始化时赋值。函数成员可以是顶层语句,无需在类中定义。

AsiWorld的博客 1116

C#9 和 .NET5 高级教程(一)

原文:Pro C# 9 with .NET 5 协议:CC BY-NC-SA 4.0 一、C# 和 .NET(Core)5 简介 微软的。NET 平台和 C# 编程语言大约在 2002 年正式引入,并迅速成为现代软件开发的中流砥柱。的。NET 平台使得大量的编程语言(包括 C#、VB.NET 和 F#)能够相互交互。用 C# 写的程序可以被用 VB.NET 写的另一个程序引用。本章稍后将详细介绍这种互操作性。 2016 年,微软正式推出。NET 核心。比如。网,。NET Core 允许语言之间的互操作(

龙哥盟 2339

with 表示“复制并修改”

with 表示“复制并修改”

xie__jin__cheng的博客 311

C# 9 新功能“源代码生成器”,你用了吗?

在开发的过程中常常会出现必须重写之前代码的情况,如果能尽量降低对代码的扰动,我们就会使用相关技术来复用代码,但是也会经常出现这些技术不管用的情况,这样就会导致程序不如预想的方案运行,否则就需要开发人员牢记必须准确实现的规范和模式。本例中,为了创建映射,如果我们无法创建Destination对象的实例,那我们就创建一个新的DiagnosticDescriptor来声明可得到的构造器是必须的。我们可以自动创建映射代码,更进一步的,我们想直接映射属性而不是使用基于反射的方法,因为反射的方法不够快。

.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 2637

C# 二十年语法变迁之 C#9参考

自从 C# 于 2000 年推出以来,该语言的规模已经大大增加,我不确定任何人是否有可能在任何时候都对每一种语言特性都有深入的了解。因此,我想写一系列快速参考文章,总结自 C# 2.0 以来所有主要的新语言特性。我不会详细介绍它们中的任何一个,但我希望这个系列可以作为我自己(希望你也是!)的参考,我可以不时回过头来记住我使用的工具工具箱里有。:)

寒冰屋的专栏 492

C#with

with(math) document.write(cos(35)); document.write(cos(80)); 若不使用with则引用时相对要复杂些: document.write(Math.cos(35)) document.write(math.sin(80)) 转载于:https://www.cnblogs.com/lishenglyx/archi...

weixin_30558305的博客 281
上一篇: C# 11原始字符串新特性详解:3分钟搞懂多行文本处理最佳实践
下一篇: C# 6插值格式说明符深度解析(高级开发者私藏技巧曝光)
DevPath
博客等级 码龄1年 179粉丝 2176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值