gpt4 book ai didi

c# - 对DTO使用可空引用类型的最佳实践

转载 作者:行者123 更新时间:2023-12-03 04:02:52 25 4
gpt4 key购买 nike

我有一个DTO,它是通过从DynamoDB表中读取来填充的。说当前看起来像这样:

public class Item
{
public string Id { get; set; } // PK so technically cannot be null
public string Name { get; set; } // validation to prevent nulls but this doesn't stop database hacks
public string Description { get; set; } // can be null
}

有什么最佳实践可以解决这个问题?我宁愿避免使用非参数构造函数,因为它与Dynamo SDK(以及其他)中的ORM配合不好。

对我来说,写 public string Id { get; set; } = "";似乎很奇怪,因为 Id是PK,并且永远不会为null,因此永远不会发生。不管怎么说, ""有什么用?

那么对此有什么最佳实践吗?
  • 我应该将它们全部都标记为string?来表示它们可以为null,即使有些绝对不能为null。
  • 我是否应该使用Id初始化Name"",因为它们永远不应为null,即使没有使用"",这也表明了它的意图。
  • 以上
  • 的某种组合

    请注意:这与C#8有关。nullable reference types 如果您不知道它们的最佳答案,那就不要回答。

    最佳答案

    作为选择,您可以将 default 文字与 null forgiving operator 结合使用

    public class Item
    {
    public string Id { get; set; } = default!;
    public string Name { get; set; } = default!;
    public string Description { get; set; } = default!;
    }

    由于DTO是从DynamoDB填充的,因此可以使用 MaybeNull/NotNull postcondition attributes来控制可空性
  • MaybeNull不可为空的返回值可以为null。
  • NotNull可为空的返回值永远不会为null。

  • 但是这些属性仅影响对带有注释的成员的调用者的可空分析。通常,您将这些属性应用于方法返回,属性和索引器 getter 。

    因此,您可以将所有属性视为非空属性,并用 MaybeNull属性装饰它们,指示它们返回可能的 null

    public class Item
    {
    public string Id { get; set; } = "";
    [MaybeNull] public string Name { get; set; } = default!;
    [MaybeNull] public string Description { get; set; } = default!;
    }


    以下示例显示了更新的 Item类的用法。如您所见,第二行不显示警告,但第三行显示警告

    var item = new Item();
    string id = item.Id;
    string name = item.Name; //warning CS8600: Converting null literal or possible null value to non-nullable type.

    或者,您可以将所有属性设置为可为空的属性,并使用 NoNull指示返回值不能是 null(例如 Id)

    public class Item
    {
    [NotNull] public string? Id { get; set; }
    public string? Name { get; set; }
    public string? Description { get; set; }
    }

    该警告将与前面的示例相同。

    还有用于输入参数,属性和索引器设置程序的 AllowNull/DisallowNull precondition attributes,其工作方式与此类似。
  • AllowNull不可为空的输入参数可以为null。
  • DisallowNull可为空的输入参数不应为null。

  • 我不认为这对您有帮助,因为您的类是从数据库填充的,但是您可以使用它们来控制属性 setter 的可空性,例如第一个选项

    [MaybeNull, AllowNull] public string Description { get; set; }

    第二个

    [NotNull, DisallowNull] public string? Id { get; set; }

    可以在此 devblog article中找到一些有用的详细信息以及后置/前提条件的示例

    关于c# - 对DTO使用可空引用类型的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59424673/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com