惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Simon Willison's Weblog
Simon Willison's Weblog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Proofpoint News Feed
A
Arctic Wolf
T
Threat Research - Cisco Blogs
Apple Machine Learning Research
Apple Machine Learning Research
V
Visual Studio Blog
博客园 - Franky
Cyberwarzone
Cyberwarzone
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Scott Helme
Scott Helme
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Cisco Blogs
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
AWS News Blog
AWS News Blog
IT之家
IT之家
MongoDB | Blog
MongoDB | Blog
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
Know Your Adversary
Know Your Adversary
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Vercel News
Vercel News
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 司徒正美
C
Check Point Blog
T
The Exploit Database - CXSecurity.com
I
Intezer
P
Palo Alto Networks Blog
爱范儿
爱范儿
The Hacker News
The Hacker News
Microsoft Azure Blog
Microsoft Azure Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
Securelist
Security Latest
Security Latest
The GitHub Blog
The GitHub Blog
H
Help Net Security
B
Blog RSS Feed
量子位
Martin Fowler
Martin Fowler
I
InfoQ

博客园 - 寻找无名的特质

开源轻量级工作流WorkflowCore介绍 C# 使用SpecFlow创建BDD测试用例 开源的.Net 工作流引擎Elsa初试——创建工作流服务器和图形化工作流配置管理应用 Asp.Net Core Identity 多数据库支持 创建NuGet本地包源 使用Visual Studio 2022开发前端 Kendo UI Grid 批量编辑使用总结 Kendo UI Grid 使用总结 使用PostMan Canary测试受Identity Server 4保护的Web Api GoJS 使用笔记 Asp.Net Core: Swagger 与 Identity Server 4 VS Code开发TypeScript 使用Xamarin开发移动应用示例——数独游戏(八)使用MVVM实现完成游戏列表页面 使用Xamarin开发移动应用示例——数独游戏(七)添加新游戏 使用Xamarin开发移动应用示例——数独游戏(六)使用数据库 使用Xamarin开发移动应用示例——数独游戏(五)保存游戏进度 使用Xamarin开发移动应用示例——数独游戏(四)产生新游戏算法改进 使用Xamarin开发移动应用示例——数独游戏(三)添加回退和计时功能 使用Xamarin开发移动应用示例——数独游戏(二)创建游戏界面
c# 一些警告的处理方法
寻找无名的特质 · 2022-04-27 · via 博客园 - 寻找无名的特质

在使用.Net 6开发程序时,发现多了很多新的警告类型。这里总结一下处理方法。

CS8618 在退出构造函数时,不可为 null 的 属性“Name”必须包含非 null 值

经常遇到的有CS8618警告:如果定义属性可能为空时,在编译时会报这个警告,比如下面的代码:

    public class Play
    {
        public string Name { get; set; }

        public Play()
        {

        }

警告如下:
CS8618 在退出构造函数时,不可为 null 的 属性“Name”必须包含非 null 值。请考虑将 属性 声明为可以为 null。
处理办法是将属性声明为可以为空:

    public class Play
    {
        public string? Name { get; set; }

        public Play()
        {

        }
    }

或者,给属性设置初始值:

    public class Play
    {
        public string Name { get; set; } = "";

        public Play()
        {

        }
    }

但遇到下面的情况,这两种办法就不能用了:


public class GameSocialDbContext : DbContext
{
  public DbSet<GameMessage> GameMessages { get; set; }
  public DbSet<Player> Players { get; set; }
  public GameSocialDbContext(DbContextOptions<GameSocialDbContext> options) : base(options)
  {
  }

}

这种情况下,可以将属性设置default!来避免警告:

        public DbSet<Game> Games { get; set; } = default!;
        public DbSet<Player> Players { get; set; } = default!;

CS1998 此异步方法缺少await运算符

这种情况通常出现在重载或者实现某个异步方法时,没有可调用的异步函数。比如下面的方法:

        public async Task RemoveAsync(Player player)
        {
            Players.Remove(player);
        }

这种情况下,可以在退出前增加 await Task.CompletedTask;来避免警告。
如果需要返回值,比如:

        public async Task<List<Player>> GetAllAsync()
        {
            return colTemp.AsQueryable<Player>().ToList();
        }

这时,可以使用await Task.FromResult()作为返回值:

        public async Task<List<Player>> GetAllAsync()
        {
            return await Task.FromResult(colTemp.AsQueryable<Player>().ToList());
        }

CS8602 解引用可能出现空引用

如果采用as进行转换,可能出现这个警告:

 await (handler as IEventHandler).HandleEvent(data);

可以改为强制转换:

 await ((IEventHandler)handler).HandleEvent(data);

也可以使用!操作符:

 await (handler as IEventHandler)!.HandleEvent(data);

还可以在调用前判断是否为空,如果为空,抛出异常。

CS8603 可能返回null引用

这种警告多出现在过滤时,比如:

        public async Task<Player> GetPlayerByNameAsync(string name)
        {
            return await gameDbContext.Players
                .Include(p => p.SentFriendRequests)
                .Include(p => p.ReceievedFriendRequests).FirstOrDefaultAsync(p => p.UserName == name);
        }

由于FirstOrDefault可能返回空值,所以会出现警告。可以改为使用First:

        public async Task<Player> GetPlayerByNameAsync(string name)
        {
            return await gameDbContext.Players
                .Include(p => p.SentFriendRequests)
                .Include(p => p.ReceievedFriendRequests).FirstAsync(p => p.UserName == name);
        }

或者允许返回值为空:

        public async Task<Player?> GetPlayerByNameAsync(string name)
        {
            return await gameDbContext.Players
                .Include(p => p.SentFriendRequests)
                .Include(p => p.ReceievedFriendRequests).FirstOrDefaultAsync(p => p.UserName == name);
        }

最后需要说明的是,警告是为了提示程序可能的潜在问题,消除警告时,需要结合具体情况确定使用哪种方式,不要为了去掉警告忽略潜在的问题。