可空引用类型和构造函数警告

2024-01-08

我正在尝试在我的项目中采用 C# 8 的可为空引用类型,并使其与 EF Core 顺利配合。

下列的本指南 https://learn.microsoft.com/en-us/ef/core/miscellaneous/nullable-reference-types,我让我的实体类具有接受初始化其不可空属性所需的所有数据的构造函数:

public class MyEntity
    {
        public MyEntity(int someNumber, string name, string shortName, bool active)
        {
            SomeNumber= someNumber;
            Name = name;
            ShortName = shortName;
            Active = active;
        }

        public int SomeNumber { get; set; }
        public string Name { get; set; }
        public string ShortName { get; set; }
        public string? SomethingOptional { get; set; }
        public bool Active { get; set; }
    }

在我的业务案例中,我有时需要更新实体的所有属性。我可以使用属性设置器,但由于我想确保不会通过加倍初始化语法来省略任何内容(实际上我的实体可以有 10 个或更多属性),因此为了方便起见,我决定创建一个公共 Update() 函数并调用它而不是构造函数主体:

        public MyEntity(int someId, string name, string shortName, bool active)
        {
            Update(someId, name, shortName, active);
        }

        public void Update(int someId, string name, string shortName, bool active)
        {
            SomeNumber = someId;
            Name = name;
            ShortName = shortName;
            Active = active;
        }

现在,在创建实体时,我调用构造函数,在更改实体时,我调用 Update()。但是,现在编译器会发出可空性警告 (CS8618),表明构造函数未初始化不可为空的属性。显然无法猜测调用 Update 会初始化它们。

我可能用这个 Update() 方法过度设计了它,但现在我很好奇有没有办法让编译器相信我的构造函数将初始化属性?


它确实有点冗长,但是您可以使用[MemberNotNull] https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.membernotnullattribute?view=net-5.0.NET 5 中的属性告诉编译器该方法确保成员在返回后不为 null。

using System.Diagnostics.CodeAnalysis;
    
public class MyEntity
{
    [MemberNotNull(nameof(Name), nameof(ShortName))]
    public void Update(int someId, string name, string shortName, bool active)
    {
        SomeNumber = someId;
        Name = name;
        ShortName = shortName;
        Active = active;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可空引用类型和构造函数警告 的相关文章

  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • Google PHP 客户端不会验证代码,invalid_request

    我正在使用 Google PHP 客户端 4ae272683e18888362e1f935b813e345b99e23b8 该客户端于 8 月 9 日从 github 中提取 我觉得我的代码太简单了 不会出错 require once Go
  • Set 如何检查重复项? Java哈希集

    对于下面的代码 它输出 1 第二个代码输出 2 我不明白为什么会发生这种情况 是因为我添加了相同的对象吗 我应该如何实现所需的输出2 import java util public class maptest public static v
  • 自定义检查器将值恢复为 Unity 中 Play 上之前的值

    所以在我的游戏中我有一个需要平滑移动的对象Vector3 fromPosition to Vector3 toPosition高速float speed 然后返回到开始的地方 一切都非常简单 但是为了在设置关卡时尝试让生活变得更轻松 我决定
  • 如何使用 Python 3.6 发送电子邮件附件

    你介意帮我一下吗 我使用此页面中的所有代码如何使用Python发送电子邮件附件 https stackoverflow com questions 3362600 how to send email attachments with pyt
  • 如何使用http header发送http请求

    提前致谢 我使用此代码在 http 请求中设置 http 标头来验证 url 但我认为缺少一些东西 这就是为什么我无法得到回复 回应仍然是 需要授权 httpParameters new BasicHttpParams String aut
  • 为 iFrameExtractor 编译 ffmpeg 时出现问题

    我正在尝试使用 make 和 build 文件来编译 ffmpegiFrameExtractor 示例 https github com lajos iFrameExtractor 首先我尝试遵循 github 上的自述文件 该文件只说运行
  • 识别并描述 Scala 的泛型类型约束

    我见过 lt gt
  • 从 Dropbox 目录中提取图像并在网站库中显示

    我正在与一位摄影师客户合作创建一个简单的网站 我希望建立一个从 Dropbox 文件夹中提取的照片库 因此每当她想要更新图库中的图像时 她只需将照片从 Dropbox 文件夹中交换出来 很简单 对吧 有没有办法使用 jQuery 或 PHP
  • 如何将控制台应用程序转换为 .dll?

    我正在尝试将用 C 编写的应用程序转换为 DLL 控制台应用程序接收用户的输入 并通过调用我在项目中导入的服务的方法来重置密码 如何将控制台应用程序转换为 DLL 以便每当用户希望更改密码时就调用我的 DLL 右键单击项目 gt 属性 gt
  • Azure 是否为“cloudapp.net”提供 https?

    使用的一大优点Azure Websites是我无需执行任何操作即可获得安全的 HTTP HTTPS 我只需键入https xyz azurewebsites net它有效 我不必担心证书 因为我使用 Azure 提供的子域 在示例中它将是x
  • 在更新中使用通配符?

    我想浏览一个表 并将 notify4 N 的所有实例更改为 notify5 N 其中 N 是 1 9 之间的数字 有没有办法在 SQL 中做到这一点 在 Perl 中这会很容易 但我不确定客户的服务器上是否有 Perl 您可能正在寻找REG
  • 控制选择框中所选值的外观:有没有办法单独渲染所选项目?

    我正在与antd 选择框 https ant design components select 我尝试自定义里面的内容Option其中包含常规的text与一些 JSX 它看起来如下 这也是我在沙箱上准备的小演示 由于我已经自定义了里面的内容
  • TeamCity 构建步骤 - MSBuild 中失败

    该解决方案在我的计算机上成功构建 但在构建服务器上失败 有项目的解决方案 解决方案中的项目 https i stack imgur com mEaCH png 这是 MSBuild 输出 13 42 17 Step 2 5 MSBuild
  • FFmpeg 阻塞管道直到完成?

    我目前正在开发一个 C 程序 在 Linux 上运行 该程序应该运行 FFmpeg 作为外部实用程序 以使用以下命令将视频文件的音频流编码为 AC3popen 并通过管道捕获输出 这是我如何尝试实现此目标的示例代码 int bufferSi
  • 使用 PyYaml 将 Python 字典转换为 yaml 文档

    我有两个 python 字典 我想将它们写入一个 yaml 文件 其中包含两个文档 definitions one 1 two 2 three 3 actions run yes print no report maybe yaml 文件应
  • 如何将 Express 路由别名设置为 html 文件?

    我正在尝试使用更好的 url 端点来提供一些静态文件 例如 home将服务 public home html 我大概可以用res sendfile 在路由配置中 但 sendfile 不会在生产模式下缓存文件输出 所以我不太确定这是否是一个
  • 如何在 Graph Api 中使用 appRoleAssignment

    我正在尝试利用 beta api 将 azure 用户分配给应用程序 我查看了文档并在 C 控制台应用程序中尝试了各种尝试 使用HttpClient and WebClient并且无法成功 然后我去了微软图形浏览器https develop
  • iframe后退按钮问题(不希望后退按钮影响iframe)

    我有一个非常简单的问题 我无法自己解决 我在操作 iframe 时遇到问题 基本上就是说这个页面 http andrew koallo ca new 393NelsonSt JordanFisher http andrew koallo c
  • 可以从 Azure 网站使用新的 Azure 文件服务吗?

    标题基本概括了所有内容 微软刚刚在 Azure 上推出了新的文件服务 http blogs msdn com b windowsazurestorage archive 2014 05 12 introducing microsoft az
  • 可空引用类型和构造函数警告

    我正在尝试在我的项目中采用 C 8 的可为空引用类型 并使其与 EF Core 顺利配合 下列的本指南 https learn microsoft com en us ef core miscellaneous nullable refer