建材城电商网站建设专业模板网站制作哪家好

news/2025/10/4 8:39:53/文章来源:
建材城电商网站建设,专业模板网站制作哪家好,百度搜索推广怎么做,天元建设集团有限公司 企查查这篇文章将介绍将C# 7类库升级到C# 8#xff08;支持可空引用类型#xff09;的一个案例。本案例中使用的项目Tortuga Anchor由一组MVVM风格的基类、反射代码和各种实用程序函数组成。之所以选择这个项目#xff0c;是因为它很小#xff0c;并且同时包含了惯用和不常用的C#…这篇文章将介绍将C# 7类库升级到C# 8支持可空引用类型的一个案例。本案例中使用的项目Tortuga Anchor由一组MVVM风格的基类、反射代码和各种实用程序函数组成。之所以选择这个项目是因为它很小并且同时包含了惯用和不常用的C#模式。关键要点 为每个项目启用可空引用类型。使用泛型时可能需要禁用可空引用类型。可以通过在本地变量中缓存属性来修复警告。公开方法仍然需要进行Null参数检查。.NET Framework和.NET Core的反序列化方式是不一样的。 这篇文章将介绍将C# 7类库升级到C# 8支持可空引用类型的一个案例。本案例中使用的项目Tortuga Anchor由一组MVVM风格的基类、反射代码和各种实用程序函数组成。之所以选择这个项目是因为它很小并且同时包含了惯用和不常用的C#模式。 项目设置 目前可空引用类型仅适用于.NET Standard和.NET Core项目。在Visual Studio 2019发布时应该也支持.NET Framework。 在项目文件中添加或修改以下配置 \u0026lt;/PropertyGroup\u0026gt;    \u0026lt;LangVersion\u0026gt;8.0\u0026lt;/LangVersion\u0026gt;    \u0026lt;NullableContextOptions\u0026gt;enable\u0026lt;/NullableContextOptions\u0026gt;\u0026lt;/PropertyGroup\u0026gt; 在保存文件后应该会看到可空性错误。如果没有看到请尝试构建项目。 指示一个类型可以为空 在接口方法GetPreviousValue中返回类型可以为空。为了显式地说明这一点可以在object后面跟上可空类型修饰符?。 object? GetPreviousValue(string propertyName); 使用这个类型修饰符注解变量、参数和返回类型就可以解决项目中的很多编译器错误。 延迟加载属性 如果一个属性的求值成本非常高可以使用延迟加载模式。在使用这个模式时如果私有字段为空表示尚未生成字段的值。 C# 8可以很好地处理这种情况。在不改变代码的情况下它能够正确地分析代码以确定getter的结果将始终非空尽管返回的变量可以为空。 string? m_CSharpFullName;public string CSharpFullName{    get    {        if (m_CSharpFullName null)        {            var result new StringBuilder(m_TypeInfo.ToString().Length);            BuildCSharpFullName(m_TypeInfo.AsType(), null, result);            m_CSharpFullName result.ToString();        }        return m_CSharpFullName;    }} 需要注意的是这里存在潜在的竞态条件。理论上另一个线程可以将m_CSharpFullName的值设置回null而编译器无法检测到。因此在处理多线程代码时要特别小心。 一个变量的可空性由另一个变量决定 在下一个代码示例中当且仅当m_ItemPropertyChanged不为空时m_ListeningToItemEvents才为true。编译器无法知道这个规则。如果是这种情况你可以将!附加到变量在本例中为m_ItemPropertyChanged后面表示它在这个时间点不会为空。 if (m_ListeningToItemEvents){    if (item is INotifyPropertyChangedWeak)        ((INotifyPropertyChangedWeak)item).AddHandler(m_ItemPropertyChanged!);    else if (item is INotifyPropertyChanged)        ((INotifyPropertyChanged)item).PropertyChanged OnItemPropertyChanged;} 使用显式强制转换纠正误报 在下一个示例中编译器错误地报告了m_Base的可空性。Values与IEnumerable的值不兼容。要移除这个警告我添加了显式强制转换。 readonly Dictionary\u0026lt;ValueTuple\u0026lt;TKey1, TKey2\u0026gt;, TValue\u0026gt; m_Base;IEnumerable\u0026lt;TValue\u0026gt; IReadOnlyDictionary\u0026lt;ValueTuple\u0026lt;TKey1, TKey2\u0026gt;, TValue\u0026gt;.Values{    get { return (IEnumerable\u0026lt;TValue\u0026gt;)m_Base.Values; }} 请注意编译器将该行标记为具有冗余强制转换。这是正常的编译器消息而不是警告但希望在发布时能够得到更正。 使用临时变量或条件强制转换纠正误报 在下一个示例中编译器指出CancelEdit所在行存在一个错误。虽然前面的if语句证明item.Value不为空但编译器不相信下次读取item.Value时它仍然是不为空。 foreach (var item in m_CheckpointValues){    if (item.Value is IEditableObject)        ((IEditableObject)item.Value).CancelEdit();} 我们可以将item.Value保存在一个临时变量中。 foreach (var item in m_CheckpointValues){    object? value item.Value;    if (value is IEditableObject)        ((IEditableObject)value).CancelEdit();} 对于这种情况我们可以通过使用条件转换as操作符后面跟上一个条件方法调用?.操作符进一步简化它。 foreach (var item in m_CheckpointValues){    (item.Value as IEditableObject)?.CancelEdit();} 泛型和可空类型 如果你经常使用泛型可能会遇到一个有问题的可空类型。看一下这个delegate public delegate void ValueChanged\u0026lt;in T\u0026gt;(T oldValue, T newValue); 这个delegate的预期设计是oldValue和newValue都可以为空。所以你会认为加几个问号就可以解决问题。但是这样做会返回下面这样的错误消息 Error CS8627 可空类型参数必须是值类型或非可空的引用类型。可以考虑添加“class”、“struct”或类型约束。如果你需要同时支持值类型和引用类型那么这个问题就没那么容易解决。由于你无法在类型约束中表达“or”你需要一个用于类的delegate和一个用于结构体的delegate。 public delegate void ValueChanged\u0026lt;in T\u0026gt;(T? oldValue, T? newValue) where T : class;public delegate void ValueChanged\u0026lt;T\u0026gt;(T? oldValue, T? newValue) where T : struct; 但是这样不起作用因为两个delegate具有相同的名称。你可以给它们起不一样的名称但你必须复制使用它们的代码。 所幸的是C#有一个转义值。你可以使用#nullable指令恢复成C #7的语义这样就可以达到预期的效果。 #nullable disablepublic delegate void ValueChanged\u0026lt;in T\u0026gt;(T oldValue, T newValue);#nullable enable 这种方法并非没有缺陷。禁用可空引用可能是个好东西但也可能什么都不是。你无法用它来让oldValue变成可空或让newValue变成不可空。 构造函数、反序列化器和初始化方法 对于下一个示例你必须知道序列化器的一些技巧。有一个鲜为人知的函数用来绕过一个叫作FormatterServices.GetUninitializedObject的类构造函数。一些序列化器如DataContractSerializer使用它来提高性能。 如果你总是要运行构造函数中的逻辑应该怎么办这个时候需要用到OnDeserializing属性。这个属性充当在GetUninitializedObject之后调用的代理构造函数。 为了减少冗余和出错的可能性开发人员通常会使用常见的初始化方法如下面的代码所示。 protected AbstractModelBase(){    Initialize();} [OnDeserializing]void _ModelBase_OnDeserializing(StreamingContext context){    Initialize();}void Initialize(){    m_PropertyChangedEventManager new PropertyChangedEventManager(this);    m_Errors new ErrorsDictionary();} 这对null检查器来说是个问题。由于构造函数中没有显式地设置上述两个变量因此它会把它们标记为未初始化。这意味着需要进行一些复制粘贴工作来移除这个错误。 还有一个风险那就是忘记包含OnDeserializing方法。由于null检查器不理解OnDeserializing方法因此如果出现意外空值就无法提醒你。 大多数开发人员发现这种行为令人困惑。因此在.NET Core中DataContractSerializer将调用构造函数。但这意味着如果你的目标是.NET Standard则需要使用.NET Framework和.NET Core测试反序列化代码以理解不同的行为。 可空参数和CallerMemberName 这个库大量使用了CallerMemberName模式。根据它使用的属性命名基本思想是在方法的末尾添加一个可选参数。编译器将看到CallerMemberName并隐式地为该参数提供一个值。 public override bool IsDefined([CallerMemberName] string propertyName null) 从理论上讲propertyNameparameter可以显式设置为null但人们普遍认为不应该这样做因为这样可能会发生意外的错误。 将这行代码转换为C# 8时可能会想要将参数标记为可空。这样具有误导性因为这个方法实际上并不是为处理空值而设计的。相反你应该用空字符串替换null。 public override bool IsDefined([CallerMemberName] string propertyName \u0026quot;\u0026quot;) 还需要空参数检查吗 如果要构建公共库即NuGet那么是的所有公开方法仍然需要检查空参数。使用库的应用程序可能不一定会使用可空引用类型。事实上他们甚至可能根本不使用C# 8。 如果你的所有应用程序代码都使用了可空引用类型那么答案仍然是“可能是”。虽然从理论上讲你不会看到任何意外的空值但由于动态代码、反射或误用!操作符它们仍然可能会出现。 结论 在一个只有不到60个类文件的项目中其中24个类文件需要更改。但没有一个是特别重要的整个过程花了不到一个小时。总之这是一个无痛的过程大多数事情都像预期的那样。我希望大多数项目都能从这个特性中获益并且在C# 8发布后就应该使用这个特性。 关于作者Jonathan Allen在90年代后期开始为一家医疗诊所做MIS项目逐步将Access和Excel应用到企业解决方案中。在花了五年时间为金融行业编写自动化交易系统之后他成为了多个项目的顾问其中包括机器人仓库的UI、癌症研究软件的中间层以及一家大型房地产保险公司对大数据的需求。在他的空闲时间他喜欢学习和写作与16世纪武术相关的东西。 英文原文https://www.infoq.com/articles/csharp-nullable-reference-case-study

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国外前端 网站wordpress怎么搭建成论坛

文章目录 前言一、物业缴费的数字化革新二、在线缴费功能的实现三、智能化缴费管理的优势四、面临的挑战与未来展望五、结语 前言 随着科技的不断进步,二维码门楼牌管理应用平台已成为物业管理的新趋势。在这样一个平台上,物业缴费的数字化革新不仅提高…

网站建设确认表国家认可的赚钱游戏

目录 计算机视觉任务 1.K近邻算法 2.得分函数 3.损失函数的作用 4.向前传播整体流程 5.反向传播计算方法 计算机视觉任务 机器学习的流程: 数据获取 特征工程 建立模型 评估与应用 计算机视觉: 图像表示:计算机眼中的图像&#…

题解:AT_wtf22_day2_b The Greatest Two

神仙题。官方题解搬运工,尽量加上自己的理解使得这篇题解更好理解。 题意: 首先会发现,每个数只要在一个区间 \([l_v,r_v]\) 中那么一定有解,并且一定是 \(v\) 更大的会套住 \(v\) 更小的形成一个树形结构。有点反…

深入解析:docker 安装 xxl-job 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

威胁狩猎实战:终端攻击行为分析与检测

本文通过Try Hack Me平台的威胁狩猎实验,详细解析了在终端攻击目标阶段如何检测恶意活动,包括键盘记录、ICMP数据外泄和系统破坏等技术的实战狩猎过程,帮助安全分析师提升威胁检测能力。Try Hack Me — 威胁狩猎:终…

2024年全国大学生信息安全竞赛安徽省赛网络高效的系统建设与运维赛项-网络构建真题

2024年全国大学生信息安全竞赛安徽省赛网络高效的系统建设与运维赛项-网络构建真题2025-10-04 08:26 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; over…

吉首网站制作wordpress搜索所有类

文章目录一、部门经理流转1. 登录dept账号2. 在待办任务中,签收任务3. 在待办任务中,办理任务3.1. 响应码5003.2. 请求的url3.3. 页面传递的参数3.4. 控制台报错信息提取3.5. 在获取代办列表FlowTaskService的104行3.6. 在获取代办列表FlowTaskService的…

西部数码创建子网站中国建设银行黑龙江支行官方网站

AcWing 785. 快速排序 文章目录 题目描述CGo模板 题目描述 给定你一个长度为 n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有…

网站的开发是使用什么技术网站域名怎么做

最常见的算法——梯度下降 当一个模型没有显示解的时候,该怎么办呢? 首先挑选一个参数的随机初始值,可以随便在什么地方都没关系,然后记为 w 0 \pmb{w_{0}} w0​在接下来的时刻里面,我们不断的去更新 w 0 \pmb{w_{0}…

详细介绍:BPEL:企业流程自动化的幕后指挥家

详细介绍:BPEL:企业流程自动化的幕后指挥家2025-10-04 08:16 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

江苏网站建站系统平台网站建设shzanen

GetKeyState、GetAsyncKeyState、GetKeyboardState函数的差别: 1、BOOL GetKeyboardState( PBYTE lpKeyState );获得全部的256个键(键盘按键、鼠标按键等等)的状态,lpKeyState是指向一个256bit的数组。存放全部键的状态。 2、SHOR…

51网站哪里去了哪个网站可以悬赏做图

[css] 如何使用css给一个正方形添加一条对角斜线? background:linear-gradient(45deg,transparent 49.5%,deeppink 49.5%,deeppink 50.5%,transparent 50.5%);个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。…

实用指南:基于Hadoop+Spark的人体体能数据分析与可视化系统开源实现

实用指南:基于Hadoop+Spark的人体体能数据分析与可视化系统开源实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

番禺区网站设计wordpress过去指定分类文章

转变过程 如图,假设将double类型能精确表示的数字落在数轴上,分别是double1、double2、double3。 这个时候,我们有十进制数字a,想要转变成double表示,这个时候得到的是double2,因为double2是距离这个十进制…

基于Hadoop的肾脏疾病风险分析系统架构设计精髓 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

乐之网站制作电影打卡WordPress模板

MFC 中, ListBox 与 ComboBox 中的项在设置了高度的情况下如何实现文本的水平居中与垂直居中???ListBox 与 ComboBox 中的数据均为动态添加文本内容含有数字、英文、中文void CMyComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemS…

实用指南:开源 C# 快速开发(十四)进程--内存映射

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

rqlite 集成sqlite-vec 简单说明

rqlite 集成sqlite-vec 简单说明rqlite 是一个基于raft 的实现的分布式sqlite,sqlite-vec 是可以直接集成rqlite的,核心是sqlite 的插件机制,以下是一个简单试用 环境准备 可以使用docker 或者直接下载二进制包运行…

英语_阅读_Water Sliding_待读

One, two, three... Goooooooh! 一、二、三……出发咯! Slide down the slope. 沿着斜坡滑下去。 Hit the pool with a splash. “扑通”一声掉进泳池。 Water-slides might seem simple. 水滑梯看起来可能很简单。 B…

实用指南:ArcGIS JSAPI 高级教程 - 高亮效果优化之开启使用多高亮样式

实用指南:ArcGIS JSAPI 高级教程 - 高亮效果优化之开启使用多高亮样式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…