在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.pswp.cn/news/277856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277856.shtml
英文地址,請注明出處:http://en.pswp.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的所有與字符有關的函數都提供兩…