首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C# 9.0引入的新特性init和record的使用思考

init init是C# 9.0引入的新的访问器,它允许被修饰的属性在对象初始化的时候被赋值,其他场景作为只读属性的存在。...而使用了init修饰的属性,则不需要定义构造函数,直接在对象初始化器赋值即可。...如上代码所示,只读属性Id的赋值并没有构造函数赋值,毕竟当一个的只读字段十分多的时候,构造函数也变得复杂。而且赋值好之后,无法修改,这和我们对只读属性通常情况下的理解是一致的。...record类型通过类型以及所有的属性及字段的方式来计算HashCode,这在整个继承层次结构增强了基于值的相等性,也就意味着两个同名同姓的人不会被认为是同一个人 Clone ?...参考: https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns

1.3K10

(持续整理)Visual Studio C# 代码分析规则集中每一项的含义 (stylecop ruleset)

(持续整理)Visual Studio C# 代码分析规则集中每一项的含义 (stylecop ruleset) 发布于 2018-02-07 13:55...但是修改规则的时候发现规则的名称都是在用我懂的每一个字描述我一点都不懂的概念,于是打算一个个尝试以找出每一个代码分析的实际意义。 整理的过程当中,发现要么是名称看不懂,要么是错误提示看不懂。...如果继承自一个已有的 Attribute,即便已经写了 AttributeUsage,此类型也应该再写一遍,以提高代码可读性和便于文档制作 CA1019 定义特性参数的访问器 自定义 Attribute...显式实现了一个接口方法,导致子类无法调用此接口方法 CA1040 避免使用空接口 意思就是“避免使用空接口”,这种接口就像是一个标记一样并没有什么作用,考虑使用自定义的 Attribute 来实现...---- 参考资料 Code Analysis for Managed Code Warnings - Microsoft Docs C# Compiler Errors - Microsoft Docs

1.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

【DDD】持久化领域对象的方法实践

概述 实践领域驱动设计(DDD)的过程,我们会根据项目的所在领域以及需求情况捕获出一定数量的领域对象。...但是这在领域驱动设计中就不好使用了,值对象成了我们考虑问题的小颗粒,而它在代码成了一个,如果直接持久化它是什么样子呢?表,使用它的实体或者聚合根也是一个表,两个表通过主外键关系链接。...回顾一下我们以前的文章《如何运用领域驱动设计 - 存储库》提到过的一句话: “领域模型是问题域的抽象,富含行为和语言;数据模式是一种包含指定时间领域模型状态的存储结构,ORM可以将特定的对象(C#...好了,来谈谈这种方案的优缺点,以及上面的回到原始面向数据库编程的问题: 先来考虑我们为什么使用领域驱动设计,为的是让项目设计的更加清晰和干净。...而考虑持久化是什么时候做的呢?需要与基础构件(比如ORM框架)交互的时期,这时领域对象编码几乎已经完成。其实在持久化之前我们已经完成了领域驱动设计的过程,所以并非是我们退回去使用面向数据库的设计。

1.6K30

了解C#的协变和逆变

前言 引用类型系统时,协变、逆变和不变性具有如下定义。 这些示例假定一个名为 Base 的和一个名为 Derived的派生。...以上来自于官方文档对协变、逆变、不变性的解释 为啥C#需要协变和逆变?...,在这里就是泛型体系中支持 C#,目前只有泛型接口和泛型委托可以支持协变和逆变, 协变(Covariance) 内置的泛型协变接口,IEnumerator、IQuerable、IGrouping...有下面的约束,否则则会在编译时报错: 泛型参数占位符以out关键子标识,并且占位符T只能用于只读属性、方法或者委托的返回值,out简而易懂,就是输出的意思 当要进行类型转换,占位符T要转换的目标类型也必须是其...协变和逆变的类型必须是引用类型,因为值类型不具备继承性,因此类型转换存在不兼容性 泛型接口和泛型委托可同时存在协变和逆变的类型参数,即占位符T 参考 泛型的协变和逆变 | Microsoft Docs

91010

C#关键字常见面试题

详情阅读:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/static 使用 static 修饰符可声明属于类型本身而不是属于特定对象的静态成员...它可以用来区分局部变量和实例变量、构造函数调用其他构造函数、传递当前对象给其他方法等。 base 关键字有什么作用? base 关键字表示的引用,可以用于访问的成员。...它可以用来子类调用的构造函数、调用的方法或属性等。 sizeof 关键字有什么作用? sizeof 运算符返回给定类型的变量所占用的字节数。...C# 的 in 关键字有什么作用? in 关键字用于参数传递时,将参数按只读引用传递。使用 in 关键字可以提高性能,避免不必要的参数复制。 C# ,in 关键字用于将参数标记为输入参数。...ref 参数进入方法时保持原始值,并在方法结束后将值带回到调用处。 C# 的 out 关键字有什么作用? 参数使用 out 关键字进行引用传递时,不需要在方法调用之前进行初始化。

14810

C++程序员转向C#时的十大陷阱

在那篇文章里,我说过C#和C++的语法很象,转移过程的困难并非来自语言自身,而是对受管制的.NET环境的适应和对庞大的.NET框架的理解。...永远不要直接调用Finalize方法(除了在你自己的Finalize里调用的Finalize方法外),垃圾收集器会帮你调用它。 C#的析构器句法上酷似C++的析构器,但它们本质不同。...C#,结构是一个简单的用户自定义类型,一个非常不同于的轻量级的可选物。尽管结构支持属性、方法、字段和操作符,但结构并不支持继承或析构器之类的东西。...() {"} } C++,Window新的虚方法Sort将会作为ListBox虚方法的方法。...(theAge) // 初始化 salaryLevel(theSalaryLevel) // 初始化成员变量 { // 构造器体 } C#,这个构造器是非法的。

2.1K10

.NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

前言 作为.net程序员,使用过指针,写过不安全代码吗? 为什么使用指针,什么时候需要使用它,以及如何安全、高效地使用它? 如果能很好地回答这几个问题,那么就能很好地理解今天了主题了。...C#构建了一个托管世界,在这个世界里,只要不写不安全代码,不操作指针,那么就能获得.Net至关重要的安全保障,即什么都不用担心;那如果我们需要操作的数据不在托管内存,而是来自于非托管内存,比如位于本机内存或者堆栈上...通过上面的总结如何用C#操作任何类型的内存,相信大多数同学都能够很好地理解这两个的设计,但我心里是没底的,因为使用了不安全代码和指针,这些操作是危险的、不可控的,根本无法获得.net至关重要的安全保障...,然后再从原始字符串复制字符集给它,而使用span可以实现Non-Allocating、Zero-coping,下面是我做的一个基准测试: ?.../dotnet/2017/11/15/welcome-to-c-7-2-and-span https://docs.microsoft.com/zh-cn/dotnet/api/system.span-

1.3K40

通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

通俗来说,虽然c#和vb是两个不同的语言,但此处c#写的可以vb当做自家写的一样正常使用。...比如我vb写了一个针对String的首字母大写的扩展方法,将其编译后的dll引用至C#项目中。 C#项目中,可以像自身代码一样正常使用来自vb这个dll的扩展方法。...比如我C#定义了一个里面包含一个公开的指针类型的成员,我想在vb中继承这个,并访问这个公开的成员。...再比如,C#语言中,对名是区分大小写的,我C#定义了两个,一个叫BaseBusiness,另一个叫baseBusiness。我vb中去继承这个BaseBusiness。...为什么值类型存储栈上 不同的类型拥有不同的编译时规则和运行时内存分配行为,我们应知道,C# 是一种强类型语言,每个变量和常量都有一个类型,.NET,每种类型又被定义为值类型或引用类型

4.1K30

通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

通俗来说,虽然c#和vb是两个不同的语言,但此处c#写的可以vb当做自家写的一样正常使用。...比如我vb写了一个针对String的首字母大写的扩展方法,将其编译后的dll引用至C#项目中。 C#项目中,可以像自身代码一样正常使用来自vb这个dll的扩展方法。...比如我C#定义了一个里面包含一个公开的指针类型的成员,我想在vb中继承这个,并访问这个公开的成员。...再比如,C#语言中,对名是区分大小写的,我C#定义了两个,一个叫BaseBusiness,另一个叫baseBusiness。我vb中去继承这个BaseBusiness。...为什么值类型存储栈上 不同的类型拥有不同的编译时规则和运行时内存分配行为,我们应知道,C# 是一种强类型语言,每个变量和常量都有一个类型,.NET,每种类型又被定义为值类型或引用类型。

2.7K63

CQRS+ES项目解析-Equinox

:应用程序服务层,提供了对Domain层接口的封装,注重数据交换,DTO对象该层定义 Domain:领域层,项目的核心部分,领域对象、领域服务该层实现 Infra:基础设施层,项目的公共部分(数据访问...)、切片(身份认证、消息发布、依赖注入)部分在该层实现 通过项目分层,我们已经对该项目有了一个大致的轮廓,当从Presentation、Services层接收到来自客户端的请求后,将会调用Application...当业务逻辑执行完成用,用于数据库事物 Command/CommandHandler 和 Event/EventHandler CQRS和ES的核心部分,Command、Event被定义为消息,拥有共同的...Bus 消息通信,Equinox项目中使用MediatR实现的基于内存的消息通信。...、工作单元,Bus实现了InMemoryBus等。

60150

C# Struct 和 Class 的区别总结

结构体可以使用 new 操作符的情况下实例化。例如: 结构体不能继承于另一个结构体或者也不能继承结构体。...结构体不能是,因此,结构体不能是 abstract 的,且总是隐式密封的(sealed)。...结构体可以用作 nullable type(即:Nullable 的 T),对其赋值 null 值,参考【Nullable Struct (https://docs.microsoft.com...view=netcore-3.1)】 什么时候使用结构体或? 要回答这个问题,我们应该很好地理解它们的差异。...序号 结构体(struct) (class) 1 结构体是值类型,可以栈(stack)上分配,也可以包含类型内联分配。 是引用类型,堆(heap)上分配并垃圾回收。

1.1K20

C++学习知识点

C++与C#的区别 (1)C++的申明时,不能给数据成员赋值,通常使用构造函数来完成。而C#可以。还有C++种成员函数可以定义外,而C#的则不行,C#是完全面向对象的编程语言。...而C#刚好相反。 (4)C++的纯虚函数C#叫虚构函数。...为什么函数形参多是const修饰的引用 使用引用是防止值传递,值传递之前会将实参堆栈产生一份拷贝,而引用则不会,因此引用传递会改变实参的值。...为什么类型指针在被子类对象赋值后不能访问子类的成员函数呢?...对于定义对象什么时候用new,什么时候不用new的认识 (1) 构造函数只适用于成员的初始化,与分配对象的空间无关; (2) 隐式执行默认构造函数,初始化申明栈上的对象,直接申明,不要使用

1.7K20

一文看懂 .NET 的异常处理机制、原则以及最佳实践

什么时候该抛出异常,抛出什么异常?什么时候该捕获异常,捕获之后怎么处理异常?你可能已经使用异常一段时间了,但对 .NET/C# 的异常机制依然有一些疑惑。那么,可以阅读本文。...本文适用于已经入门 .NET/C# 开发,已经开始在实践抛出和捕获异常,但是对 .NET 异常机制的用法以及原则比较模糊的小伙伴。...然而大多数情况下我们都考虑使用 .NET 自带的异常,因此可以充分利用 Exception 的已有属性特殊情况下报告更详细的利于调试的异常信息。...任何情况下都不应该抛出这些异常: 过于抽象,以至于无法表明其含义 Exception 这可是顶级,这都抛出来了,使用者再也无法正确地处理此异常了 SystemException 这是各种异常的,...and Exception Handling - C# Programming Guide - Microsoft Docs Design Guidelines for Exceptions - Microsoft

59841

是什么让C#成为最值得学习的编程语言

以下将从6个方面阐述为什么 C# 成为最值得学习的编程语言,甚至可以说 C# 是给初学编程最值得推荐的语言。...Microsoft入门C# - 免费交互式教程。 具备现代语言的所有特点 .NET Core 有一些顶级功能: 强类型。 强大的库。 异步编程 - 易于使用的异步/等待模式。...例如,我无法想象没有 Jetbrains 的 Resharper 的生活。.NET 生态系统存在数十种极好的的工具,既包括开源的,也包含商业产品的。 标准化库 .NET 带有了一套非常好的库。...各种各样的库减少了对外部包的需求。Microsoft 也乐于像 JSON.NET 这样的社区项目一样,成为大多数项目中广泛使用的关键库。...总结:微软 .Net Core 的推出,无疑给具备庞大基数的 .Net 平台开发者们,提供了绝佳的机会,可以预见,未来的几年内,使用 C# 语言基于 .Net Core 平台开发势必成为流行。

2K70

C# 继承、多态性、抽象和接口详解:从入门到精通

C# 继承 C# ,可以将字段和方法从一个继承到另一个。我们将“继承概念”分为两:派生(子类) - 从另一个继承的(父) - 被继承的要从一个继承,使用 : 符号。...Ford Mustang为什么以及何时使用“继承”?...为什么以及何时使用接口?1) 为了实现安全性 - 隐藏对象的某些细节,仅显示重要的细节(接口)。2) C# 不支持“多继承”(一个只能继承一个)。...但是,可以通过接口实现多继承,因为可以实现多个接口。注意:要实现多个接口,请使用逗号分隔它们(见下面的示例)。为什么以及何时使用抽象和方法?为了实现安全性——隐藏某些细节,只显示对象的重要细节。...注意:抽象也可以通过接口实现C# 接口接口是 C# 实现抽象的另一种方式。

30210

如何将.NET项目迁移到.NET Core

和Web API 直接或间接继承同一个 ControllerBase,提供可使用的API也一致化 b) 比如:旧ASP.NET时代,写全局filter需要针对MVC 和Web API 分别编写代码...1、查询命名空间、库在哪个nuget package包定义(第一次查询比较慢) 地址:https://packagesearch.azurewebsites.net/ 2、查询 NET API 各版本实现...地址:https://apisof.net/catalog/ 结果图如下: image.png image.png 库项目、应用项目如何选择框架类型 1.如何组织一个同时面向多目标框架的 C# 项目解决方案....NET Framework 和 .NET Core”上运行,但ASP.NET Core 3.0 以及更高版本只能在 .NET Core 运行。...-679c-4316-b2bb-baea26c94205 为什么我的会话状态ASP.NET Core不工作了?

1.7K40

.NET如何避免让线程摸鱼,请用异步技术 async await 拿捏他~

; 可以看到 60ms ,线程摸鱼 50ms。...概念与理论 接下来为了更有效地沟通和提示逼格,我们还是使用专业的术语。 复习一下线程的阻塞,睡眠,挂起。 主要是弄明白阻塞的定义,和什么时候会发生阻塞。...await 运算符 微软官方文档:async(C# 参考): 异步方法同步运行,直至到达其第一个 await 表达式,此时会将方法挂起,直到等待的任务完成。...也就是说单单使用 async 还不够,还得必须同时使用 await Task 通常来说,我们使用 httpClient.GetAsync,都是希望能处理返回的数据。...写例子的过程,发现 HttpClient 这个很多方法都是异步方法了,依稀记得以前还有同步方法和异步方法提供选择的,看来微软是逼大家进步啊~

19810

C#反射与特性(三):反射类型的成员

上一篇文章,介绍如何获取 Type 类型,Type 类型是反射的基础。 本篇文章,将使用 Type 去获取成员信息,通过打印出反射获取到的信息,为后续操作反射打好基础。...目录 1,获取类型的信息 1.1 类型的和接口 1.1.1 1.1.2 获取实现的接口 1.1.3 获取泛型接口 1.2 获取属性、字段成员 1.2.1 构造函数 1.2.2 属性 1.2.3...1.1.1 C# ,一个类型只能继承一个类型(类型),使用实例的 Type.BaseType 属性,可以获取到此类型的类型。...,可以参考这里 https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.constructorinfo?...参考资料地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.reflection.methodinfo?

99240

C#泛型的逆变协变之个人理解

我有个朋友, 使用的过程中发现一个问题 IFace item = new Face(); // CS0266 public interface IFace {...A:   这就要讲到C#泛型里的逆变协变了 Q:   细嗦细嗦 逆变协变 C#泛型的逆变(in)协变(out)对于不常自定义泛型的开发来说(可能)是个很难理解的概念, 简单来说其表现形式如下 逆变(..., 什么时候可以用协变, 这两个东西用起来有什么限制?...A:   协变的表现形式为将子类赋值给, 当进行输出相关操作时, 输出的对象类型为, 是将子类转为, 你可以说子类是; 逆变的表现形式为将赋值给子类, 当进行输入相关操作时, 输入的对象为子类..., 是将子类转为, 这个时候你也可以说是子类; 如果同时支持逆变协变, 若先进行子类赋值给的操作, 此时输出的是, 子类转为并不会有什么问题, 但进行输入操作时就是转为子类,

17120
领券