还可以在教程部分的 C# 6 交互式探索中探索这些功能。 01 只读自动属性 只读自动属性提供了更简洁的语法来创建不可变类型。...这适用于方法和只读属性。...还可以将 null 条件运算符用于数组或索引器访问。 将索引表达式中的 [] 替换为 ?[]。 ?...每当需要变量、属性或成员字段的名称时,这是让工具正常运行的好办法。...鉴于此行为,建议仔细编写 catch 和 finally 子句,避免引入新的异常。 10 使用索引器初始化关联集合 索引初始值设定项是提高集合初始值设定项与索引用途一致性的两个功能之一。
logging也变得更简单,因为它是建立的在,你再也没有任何借口不一开始就使用它 3.2 Razor Pages 无控制器Razor Pages。.... 3.5性能提升 ASP.NET Core有一些额外的与.NET Core无关的性能提升: 启动时间通过即时编译处理明显减少,虽然这不是ASP.NET Core 2的新功能; output caching...你不能将一个值分配给 ref 变量,如: 1 ref int num = 10; // error:无法使用值初始化按引用变量 2....ref 或 out 参数 3. ref 不能修饰 “属性” 和 “索引器”。...1 var list = new List();2 ref var n = ref list.Count; // error: 属性或索引器不能作为out 或 ref 参数传递 原理解析
readonly 修饰符对于只读属性是必需的。 编译器会假设 get 访问器可以修改状态;必须显式声明 readonly。...如果没有通过调用任何可用的构造函数或通过初始化表达式来设置变量,编译器将生成警告。 此外,不能向不可为空引用类型分配一个可以为 Null 的值。...不过,编译器使用流分析来确保可为空引用类型的任何变量在被访问或分配给不可为空引用类型之前,都会对其 Null 性进行检查。 异步流: 从 C# 8.0 开始,可以创建并以异步方式使用流。...返回异步流的方法有三个属性: 它是用 async 修饰符声明的。 它将返回 IAsyncEnumerable。 该方法包含用于在异步流中返回连续元素的 yield return 语句。...仅当左操作数计算为 null 时,会将其右操作数的值分配给左操作数。 非托管构造类型: 在 C# 7.3 及更低版本中,构造类型(包含至少一个类型参数的类型)不能为非托管类型。
你可以将 IEnumerable 的实例分配给 IEnumerable 类型的变量。 Contravariance 使你能够使用比原始指定的类型更泛型(派生程度更小)的类型。...你可以将 Action 的实例分配给 Action 类型的变量。 Invariance 表示只能使用最初指定的类型。 固定泛型类型参数既不是协变,也不是逆变。...你无法将 List 的实例分配给 List 类型的变量,反之亦然。 以上来自于官方文档对协变、逆变、不变性的解释 为啥C#需要协变和逆变?...,C#的协变和逆变就是主要有两种目的: 兼容性:.NET2.0就推出了泛型,而从.NET 2.0到.NET 3.5期间不支持对泛型接口中的占位符T支持隐式转换,因此在.NET4.0推出协变和逆变 为了支持更广泛的隐式类型的转换...(); IEnumerable fooBase = foo; 实际上,对于协变,有下面的约束,否则则会在编译时报错: 泛型参数占位符以out关键子标识,并且占位符T只能用于只读属性
例如: lambda表达式(它是一种可即时编写并能”俘虏”变量的匿名函数). C#还有能力通过查询表达式来执行列举动作或响应式编程....同时C#可以很简单地通过定义只读字段(field)和属性(property)来实现不可变(immutable, 或叫只读)类型....成员 C# 6里面为方法, 只读属性(property), 操作符和索引器引进了expression-bodied "宽箭头"的语法....C# 7里面把该语法扩展到了构造函数, 读写属性, 和总结器(finalizer): public class Person { string name;...ToString(); Expression-bodied 函数 它允许使用一行表达式来完成方法, 属性, 操作符, 索引器: public int TimesTwo(int x) =>
C#6中新增的功能 1get 只读属性 简洁的语法来创建不可变类型,仅有get访问器: public string FirstName { get; } public string LastName {...3Expression-bodied 函数成员 这适用于方法和只读属性。...返回异步流的方法有三个属性: 它是用 async 修饰符声明的。 它将返回 IAsyncEnumerable。 该方法包含用于在异步流中返回连续元素的 yield return 语句。...从 C# 9.0 开始,可为属性和索引器创建 init 访问器,而不是 set 访问器。...调用方可使用属性初始化表达式语法在创建表达式中设置这些值,但构造完成后,这些属性将变为只读。 仅限 init 的资源库提供了一个窗口用来更改状态。
虽然 JavaScript 对某些人来说似乎看似简单,但 C# 带来了不同的挑战 — 它是一种多功能且功能强大的语言,因其结构、类型安全性和在 .NET 生态系统中的广泛实用性而脱颖而出。...泛型 C# 中的泛型允许创建可重用、类型安全的数据结构和方法,从而减少强制转换的需求并提高性能。 7. 属性和自动实现的属性 C# 提供了用于通过封装访问类字段的属性。...索引器 索引器允许像数组一样为对象编制索引,从而在类中处理集合时提供更直观的语法。 15. 异常处理 C# 具有强大的异常处理模型,支持块正常处理错误和异常。...属性 属性提供有关代码的元数据,在各种情况下非常有用,例如反射、定义自定义行为或影响编译。 17. 反射 C# 反射允许在运行时检查程序集、类型和对象并与之交互,从而对代码进行动态控制。 18....19. .NET 生态系统 与 .NET 生态系统的集成使 C# 能够支持多个平台(通过 .NET Core/.NET 5+),从而提供对各种库和工具的访问。 20.
它是不可变的,因为在创建它后,无法修改任何属性。...属性初始值设定项可明确哪个值正在设置哪个属性。 缺点是这些属性必须是可设置的。 从 C# 9.0 开始,可为属性和索引器创建 init 访问器,而不是 set 访问器。...它会在初始化之外分配给仅限 init 的属性: // Error!...编译器将这些类型的其他转换和操作作为本机整数公开。 本机大小的整数定义 MaxValue 或 MinValue 的属性。 这些值不能表示为编译时编译时,因为它取决于目标计算机上整数的本机大小。...在 C# 9.0 之前,分部方法为 private,但不能指定访问修饰符、不能返回 void,也不能具有 out 参数。 这些限制意味着,如果未提供任何方法实现,编译器会删除对分部方法的所有调用。
在 C# 中,DI 可以通过各种形式实现,包括构造函数注入、属性注入和方法注入。 实现依赖注入的方式 构造函数注入:通过类的构造函数提供依赖关系。这是 C# 中最常见和推荐的 DI 形式。...它通过构造函数接收 IMyDependency 接口的实现,并将其分配给私有的、只读的字段 _myDependency,从而使 MyClass 能够使用 IMyDependency 而无需创建它,从而促进了松耦合并增强了可测试性...在 C# 中实现 IoC 和 DI 在 C# 中,有多种框架和工具可以实现 IoC 和 DI,其中 Microsoft.Extensions.DependencyInjection 是 .NET 生态系统中最著名的...在 C# 中设置依赖注入 我们可以通过以下步骤在项目中使用依赖注入: 步骤 1:注册服务服务通常在 .NET 应用程序的 program.cs 或 startup.cs 中使用 IServiceCollection...步骤 2:注入依赖关系通过构造函数在控制器、服务或任何其他类中注入依赖关系。
(范围和索引) C# 8.0 - 默认接口方法 C# 8 - using声明 和 异步流 .NET Core 3.0 里新的JSON API .NET Core 3.0 本地工具 .NET Core...只读struct成员 从C# 8开始,我们可以在struct的成员上使用readonly修饰符。...但是这里会出现警告,因为 ToString 访问了未标记为 readonly 的 Distance 属性。也就是需要创建防御性副本时,编译器会发出警告。...由于Distance属性不会修改状态,所以可以在它前边加上readonly修饰符以修复此警告: ? 请注意,readonly 修饰符对于只读属性是必须要添加的。...但是自动实现的属性则是一个例外;编译器将所有自动实现的 Getter 视为 readonly,因此,此处无需向 X 和 Y 属性添加 readonly 修饰符。
目录 在 C# 中使用 Span 和 Memory 编写高性能代码 .NET 中支持的内存类型 .NET Core 2.1 中新增的类型 访问连续内存: Span 和 Memory Span 介绍 C#...Span 和 Memory 结构体为数组、字符串或任何连续的托管或非托管内存块提供低级接口,它们的主要功能是促进微优化和编写低分配代码,以减少托管内存分配,从而减少垃圾收集器的负担。...Span 能够指向分配给堆栈或堆上的内存块。但是,因为 Span 被定义为 ref 结构,所以它应该只驻留在堆栈上。...Span 源代码显示它基本上包含两个只读字段: 一个本机指针和一个长度属性,表示 Span 包含的元素数。...当需要修改或处理 Memory 引用的缓冲区时,Span 属性允许开发者获得高效的索引功能。
} = "Louzi"; 匿名类型 匿名类型是C# 3后推出的功能,它无需显示定义类型,将一组只读属性封装到单个对象中。...如果两个或多个匿名对象指定了顺序、名称、类型相同的属性,编译器会把它们视为相同类型的实例。在创建匿名类型时,如果不指定成员名称,编译器会把用于初始化属性的名称作为属性名称。...6开始,对象初始化列表不仅可以初始化可访问字段和属性,还可以设置索引器。...{ get; set; } = "Property"; } 表达式体 从C# 6起,支持方法、运算符和只读属性的表达式体定义,自C# 7.0起,支持构造函数、终结器、属性、索引器的表达式体定义。...=合并赋值运算符:C# 8后可用,仅在左侧操作数的求值结果为null时,才将右操作数的值赋值给左操作数。否则,不会计算其右操作数。??=运算符的左操作数必须是变量、属性或索引器元素。 // ??
小心 C#中的只读结构体成员 https://www.cnblogs.com/broadm/p/17862169.html 本文讲述了 C#中结构体的只读属性对代码行为的影响。...通过示例展示了将结构体成员设为只读后,尝试修改其字段值时,编译器不报错但修改不成功,因为只读机制会导致字段值在堆栈上拷贝。这种隐蔽的行为可能引发 BUG,如自旋锁示例中的计数错误。...文章建议在结构体或字段需要只读时,使用 readonly 关键字直接修饰,以避免潜在问题。.../ .NET 8 提供的 Microsoft.Extensions.Telemetry.Abstractions 中包含的“LogProperties”属性的说明,该属性将属性值保留在日志中。...引入“FakeTimeProvider”,它是 .NET 8 中引入的“ITimeProvider”的伪造实现,以及“FakeLogger”,它是新引入的“ILogger”的伪造实现。
} 二、可选属性 1、属性修改器 对象类型中的每个属性都可以指定: 1)定义对象类型 2)设置属性是否是可选的 3)属性是否可以被写入 2、可选属性 type Shape = {} interface...1、概述 它不会在运行的时候改变任何行为 但是在类型检查期间 一个标记为只读的属性 是不能够被写入其他值的 2、代码演示 不同层次的只读属性 // 不同层次的只读属性 interface SomeType...// obj.prop = "hello" // 报错:无法分配到 "prop" ,因为它是只读属性。...1、概述 有时候我们不能提前知道一个类型的所有属性的名称 但是我们知道这个值的形状 这种情况,我们可以使用索引签名来描述可能的值的类型 所谓索引签名,就是知道属性值的类型,不知道属性名,定义一个类似...: string // 报错:类型“string”的属性“name”不能赋给“string”索引类型“number”。
JsonNode:新增于 .NET 6,用于动态读写 JSON 数据。它是一个抽象类,有三个具体实现:JsonObject:表示 JSON 对象。JsonArray:表示 JSON 数组。...使用 JSON DOM API 的场景主要包括:动态 JSON 操作:当 JSON 结构在编译时未知,或部分未知时,JSON DOM API 提供了灵活的读写能力。...修改数据:直接通过索引器修改或添加属性。序列化:ToJsonString 方法将节点重新序列化为 JSON 字符串。...高级用法:处理复杂 JSON对于嵌套结构较深或需要动态处理的大型 JSON 文档,可以结合 JsonNode 和 LINQ。...NET 6 的 JSON DOM API 提供了一种灵活、高效的方式操作 JSON 数据。从基础的只读操作到动态的增删改,System.Text.Json 的功能覆盖了广泛的应用场景。
和 Visual Studio 2008 一起发布于 2007 年下半年,但完整的语言功能是在 .NET Framework 3.5 版中发布的。...异常筛选器【catch (ExceptionType [e]) when (expr)】 自动属性初始化表达式【public string Foo { get; set; } = string.Empty...或元素访问?...=】 后面懒得列了…… C# 9 发布日期:2020 年 11 月 C# 9 随 .NET 5 一起发布。它是面向 .NET 5 版本的任何程序集的默认语言版本。...记录【record 关键字,只读数据类语法糖】 仅限 Init 的资源库【public int Foo { get; init; } ,只读数据类语法糖之二】 顶级语句【为了少写点代码微软也是拼了】 模式匹配增强功能
Override 是进行基类中函数的重写。Override是面向对象的概念 6、C#中索引器是否只能根据数字进行索引?是否允许多个索引器参数? 参数的个数和类型都是任意的。...接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法; 抽象类可以定义字段、属性、包含有实现的方法。 ...下列关于C#中索引器理解正确的是(c ) a) 索引器的参数必须是两个或两个以上 b) 索引器的参数类型必须是整数型 c) 索引器没有名字 d) 以上皆非 ...49、.请叙述属性与索引器的区别。 (*)没啥意义 属性 索引器 通过名称标识。 通过签名标识。 通过简单名称或成员访问来访问。 ...可以为静态成员或实例成员。 必须为实例成员。 属性的 get 访问器没有参数。 索引器的 get 访问器具有与索引器相同的形参表。
获取值可以通过索引器或TryGetValue方法;与非泛型IDictionary类型不同,如果试图用不存在的键获取值,IDictionary的索引器将抛出一个KeyNotFoundException...通常来说,返回集合的副本或只读的包装器是比较适宜的,除非方法的全部目的就是通过返回集合做出变动。 B.2 列表 从很多方面来说,列表是最简单也最自然的集合类型。...它不仅知道如何创建数组及其索引,还可以在foreach循环中直接支持它们;在使用表达式对编译时已知为数组的类型进行迭代时,将使用Length属性和数组索引器,而不会创建迭代器对象。...普通的字典实现基本上可以通过索引器提供添加或更新,通过Add方法添加或抛出异常,但ConcurrentDictionary提供了名副其实的大杂烩。...此外,IReadOnlyList的协变性意味着它不能暴露任何以T为参数的方法,如Contains和IndexOf。其最大的好处在于它暴露了一个索引器,通过索引来获取项。
我们已经介绍了50多种基本知识,以推进常见的C#面试问题和答案 2、什么是C#? C#是一种面向对象的,类型安全的托管语言,由.Net框架编译以生成Microsoft中间语言。...编译器将方法的地址存储为入口点,并使用此信息在创建任何对象之前开始执行。Void是类型修饰符,它声明方法或变量不返回任何值。 6、什么是物体? ?...我们不能在静态方法中使用’This’,因为我们只能在静态方法中使用静态变量/方法。 13、常量和只读之间有什么区别? 常量变量在编译时声明和初始化。此后无法更改该值。...System.String是不可变的。当我们修改字符串变量的值时,会将新的内存分配给新值,并释放先前的内存分配。...另一方面,Finalize()用于相同的目的,但不能保证对象的垃圾回收。 28、什么是循环引用? 循环引用是指两个或多个资源相互依赖导致锁定条件并使资源无法使用的情况。
c),但不能用于变量(var a1 = b ??c)。 目前,这个(例 3)的模式匹配版本计划于 C# 8.0 中提供,其他两个则于 8.x 中提供。...就在几个星期前,我试图清理一些大量使用 get/set 属性的代码,使其成为一个更加只读的初始化的构造函数(ctor-initialized),此时我发现我真希望该特性是这样的。...4 月,该特性从 C# 9 迁移到了 C# 8 上。 结构上的只读成员 当分配给只读字段或用作 in 参数时,结构上的方法有个性能小问题。如果我们调用结构上的方法,编译器首先会生成防御性副本。...然而,出于性能的缘故,很多结构是可变的。 根据只读示例方法提议,开发人员将能够把单个方法标记为只读。这向编译器表明,防御性副本不是必要的,没有值会被修改。...这和Pure 属性不同,只要只读方法不修改结构本身的值,那么就有明显的副作用。 自动实现属性的 getter 将被自动认为是只读的。在某些情况下,setter 也可以被标记为只读。
领取专属 10元无门槛券
手把手带您无忧上云