在Teams app代码中enable nullable

昨天讲了一下如何把代码升级到 net6,今天我优化了好几个小时更新代码,enable了nullable。

c#的nullable我一直非常喜欢,它可以帮助开发人员,让开发人员去思考,哪些地方需要可以为null,哪些地方不需要。它并不是万能的灵丹妙药,但是它的确可以大大的提高代码质量。我自己通过在LuckyDraw里enable了nullable,从而发现了好几个潜在的bug。现在一些其他语言,比如typescript也有类似功能,所以我觉得这个会是以后开发语言的一种趋势。

这篇文章我来分享一下我遇到的一些nullable的问题,和如何解决的,希望对大家有一点点帮助。

首先,我们需要在csproj文件中加上 <Nullable>enable</Nullable> 来让编译器知道我们希望打开nullable开关。

<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net6.0</TargetFramework><LangVersion>10</LangVersion><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings></PropertyGroup>...

保存csproj文件后,稍等几秒钟后,你就会发现你的代码里多了很多警告,这就是 c# 编译器发现的一些可能是潜在的问题。

首先是和json相关的,比如:

var editForm = JsonSerializer.Deserialize<CompetitionEditForm>(str);
editForm.abc ...;

这里的warning在第二行,原因是 JsonSerializer.Deserialize<T>() 的返回值可能为 null,所以我们不能直接就开始使用 editForm,我们需要做一个判断:

var editForm = JsonSerializer.Deserialize<CompetitionEditForm>(str);
if (editForm != null)
{editForm.abc ...;
}

当然这种改发稍微有点麻烦,每个地方都需要加上 if 判断。我的做发是增加一个新的 method,如下:

public static class JsonHelper
{public static TValue Deserialize<TValue>(string json, JsonSerializerOptions? options = null){var value = JsonSerializer.Deserialize<TValue>(json, options);if (value == null){throw new Exception($"A non-null value is expected, but the result of Deserialize<{typeof(TValue).FullName}>() is null.");}return value;}
}

这样我们确保我们这个方法不会返回 null,所以之前的代码就可以改成下面这样,没有warning。

var editForm = JsonHelper.Deserialize<CompetitionEditForm>(str);
editForm.abc ...;

另外还有一块也是和json相关的,因为目前teams bot sdk还是使用Newtonsoft.JSON,所以我们的teams app里还是有很大一部分代码还是会和 Newtonsoft.JSON 发生关系。比如:

public static string GetBotMessagePreviewAction(this Activity activity)
{var value = (JObject)activity.Value;var botMessagePreviewAction = (string)value.GetValue("botMessagePreviewAction");return botMessagePreviewAction;
}

因为 activity 的 Value 是 JObject,而 JObject 的 GetValue() 可能会返回空,所以上面的代码需要对 botMessagePreviewAction 进行是否为 null 的判断。不过因为我在其他地方做过判断,只要调用这个方法,就说明 JObject 里肯定有 botMessagePreviewAction 这个属性。所以我采用了一个简单的改法,使用 !,在语句最后加了 !,来告诉编译器,我确定不会为 null。

var botMessagePreviewAction = (string)value.GetValue("botMessagePreviewAction")!;

上面只是在我的项目里遇到的两个常见问题,以及我的修改方法。仅供参考。

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

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

相关文章

shiro(一)简介、理论知识

2019独角兽企业重金招聘Python工程师标准>>> 开涛学shiro&#xff1a;http://jinnianshilongnian.iteye.com/blog/2018398 shirospirngmvc参考: https://www.cnblogs.com/sharpest/p/5865732.html http://peirenlei.iteye.com/blog/2086639 https://blog.csdn.net/c…

2019.04.24笔记

*&#xff09;关于swing 今天同学误解了我的意思&#xff0c;以为我要用java代码做页面和图形&#xff0c;给我推荐了swing。 swing真是眼熟&#xff0c;大学课程里的。通过后台代码操作页面和图形。记得当年大学时&#xff0c;swing就已经沦为一种过时的技术了。到现在&#x…

Teams 的 Meeting App

Teams 的 Meeting App 已经正式推出了一段时间&#xff0c;相应的文档也已经较为完善了&#xff0c;我接下来会写一系列的文章&#xff0c;来介绍如何开发一个自己的Meeting app。这篇文章作为这个系列的第一篇&#xff0c;将介绍 meeting app 是如何被使用的&#xff0c;有哪些…

Github上最受欢迎的Python轻量级框架Flask入门

flask最近终于发布了它的1.0版本更新&#xff0c;从项目开源到最近的1.0版本flask已经走过了8个年头。# app.py from flask import Flask app Flask(__name__)app.route("/") def hello():return "Hello World!"if __name__ "__main__":app.ru…

mysql表关联

mysql的表关联&#xff1a; left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) 只返回两个表中联结字段相等的行 转载于:https://www.cnblogs.com/bloghua…

开发第一个Meeting App

今天我们来看一下如何使用c# net6 来开发一个 teams的 meeting app。首先先确保本地安装了最新版本的 net6。创建一个目录&#xff0c;然后在目录下输入下面的命令行&#xff0c;让 dotnet 来生成一个初步的asp.net core 代码框架。 dotnet new razor代码框架生成如下的目录和…

solrCloud搭建

一.什么是solrCloud&#xff1f; SolrCoud(solr云)是solr提供的分布式搜索方案。当一个系统搜索请求并发很高的时候&#xff0c;就需要使用solrCloud来满足这些需求 solrCloud是基于solr和zookeeper的分布式的搜索方案&#xff0c;它的主要思想是使用zookeeper作为挤集群配置的…

Linux 添加新用户账号并赋予root权限

除了root用户之外&#xff0c;通常需要为每个管理创建各自的用户账号&#xff0c;方便每个管理员登录使用&#xff0c; 步骤如下&#xff1a; 1. 添加新用户账号 useradd mary.lee 2. 为新用户账号设置密码 passwd mary.lee 3. 为新用户账号赋予root权限 usermod -a -G root…

如何获取 Teams Meeting 的上下文信息

我们上一篇文章讲了如果使用 net6 和 c# 来快速开发一个最简单的 teams meeting app。为了让大家比较容易理解&#xff0c;上个sample非常简单&#xff0c;简单到没有什么功能&#xff0c;那我们现在就来慢慢扩展这个app的功能&#xff1a;看看如何获取 meeting 的上下文。 打…

php的运行流程

1、Zend引擎&#xff1a;Zend整体用纯C实现&#xff0c;是PHP的内核部分&#xff0c;他将PHP代码翻译&#xff08;词法、语法解析等一系列编译过程&#xff09;为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构&#xff08;如&#xff1a;hashtable、OO&#x…

内置方法

isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object):pass obj Foo() isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object):pass class Bar(Foo):pass issubclass…

会议中的Meeting App

接着我们上两篇博客文章&#xff0c;我们说了如何开发会议前和会议后的 meeting app&#xff0c;那如何开发一个会议中的 app 呢&#xff0c;实际上比较简单&#xff0c;我们只需要在 tab 的配置项中勾选下面这两个选项即可。 勾选后&#xff0c;我们安装app到我们的一个会议中…

0-2岁的app开发人员必读,Android开发APP前的准备事项

2019独角兽企业重金招聘Python工程师标准>>> 随着移动互联网的兴起&#xff0c;各行各业对移动应用的需求越来越大&#xff0c;从事APP开发的人也越来越多&#xff0c;APP开发行业可以说是方兴未艾。APP开发是比较复杂的事情&#xff0c;涉及产品、美工设计、服务器…

FixedThreadPool吞掉了异常

为了方便遍描述问题&#xff0c;如下是简化后的 public class RunException {public static void main(String[] args) { ExecutorService readerPool Executors.newFixedThreadPool(3); readerPool.submit(new Runnable() { public void run() { throw new RuntimeException(…

Teams Meeting App的 task 弹出框

前几篇文章我们介绍了 Teams Meeting App 的各种类型和如何从无到有的使用 net6 和 c# 来开发一个 Teams Meeting app&#xff0c;那今天我们开始讨论一些 meeting app 的高级互动&#xff1a; task 弹出框。我们先来快速修改一下之前的代码&#xff0c;看看什么是 task 弹出框…

react 学习

react官网地址&#xff1a;http://facebook.github.io/react/ webpack官网地址&#xff1a;http://webpack.js.org/ 英文 https://www.webpackjs.com/ 中文 参考资料&#xff1a; React 入门实例教程-阮一峰 webpack的学习 学习列表&#xff1a; 了解react的语法&#x…

如何获取Teams Meeting 详情

最近有一些朋友问我&#xff0c;有没有可能获取到会议的详情&#xff0c;我搜索了目前所有的 teams 文档&#xff0c;发现有一个api可以获取&#xff0c;不过在我写这篇文章的时候&#xff0c;这个 api 还在 preview 阶段&#xff0c;可能在正式发布前&#xff0c;还会有一些变…

C++ : 内联函数和引用变量

一.内联函数 内联函数和普通函数的使用方法没有本质区别&#xff0c;我们来看一个例子&#xff0c;下面展示了内联函数的使用方法&#xff1a; #include <iostream> using namespace std; //下面展示内联函数的使用 inline double square(double x) {return (x*x);} int…

Teams Meeting 实时事件通知

Microsoft Teams最近推出了很多新的功能和api&#xff0c;我们今天就来一起看一下 teams 会议的实时事件通知&#xff0c;我觉得有了这个功能&#xff0c;我们的app&#xff0c;我们的bot又可以有很多可以实现的场景了。 我们来看看如何在 c# 里处理会议开始和结束这两个事件。…

error记录 | 不能将参数 1 从“const char [5]”转换为“LPCTSTR

Windows使用两种字符集ANSI和UNICODE&#xff0c;前者就是通常使用的单字节方式&#xff0c;但这种方式处理象中文这样的双字节字符不方便&#xff0c;容易出现半个汉字的情况。而后者是双字节方式&#xff0c;方便处理双字节字符。Windows NT的所有与字符有关的函数都提供两…