【问题标题】:C#: I need Help in Creating valid ISBN propertyC#:我需要帮助来创建有效的 ISBN 属性
【发布时间】:2021-12-29 11:20:33
【问题描述】:

我有一个带有 isbn 参数的构造函数的 Book 类:

public class Book
    public Book (long ISBN)
        {
           this.ISBN = isbn; 
        }

ISBN 是 10-13 位数字 - 每本书都有唯一的 ISBN,它存储在私有支持字段中(由编译器自动生成)。 我需要对将返回 ISBN 号的只读属性进行编码。这个数字作为参数提供给我上面写的构造函数。

public long ISBN { get; } // Need to Fix/Finish this code block

我需要帮助来完成/更正此代码块。我是否需要以某种方式强制/验证此属性的 10-13 位数字条件(可能通过某种方式使用微软的 BarcodeSymbologies.Isbn 属性)?提前谢谢你。

c#

【问题讨论】:

  • ISBN 不是 整数。它们应被视为预先格式化的十进制字符串。
  • @Dai docs.microsoft.com/en-us/uwp/api/…那微软为什么要给它uint类型呢?
  • That property you're linked to 不存储 ISBN 或 EAN;它只是(本质上)一个导出的 const 值,例如 enummagic number,用于在其他模式中引用 ISBN 或 EAN 的 concept。看看它是如何成为 static 属性的?
  • @Dai 我明白了。谢谢

标签: c# properties


【解决方案1】:

验证输入

这取决于你需要什么样的验证结果。

为了确保你没有得到无效数据,你可以在写入数据时简单地添加检查,这样你就可以在构造函数中添加它:

public class Book
    public Book (long isbn)
        {
           if(!IsIsbnValid(isbn)) throw new ArgumentException( message: "Invalid ISBN", paramName: nameof(isbn) );
           this.ISBN = isbn; 
        }

另一方面,当使用例如asp.net,您想向用户显示错误消息等...在这种情况下,您可以创建一个自定义验证属性,如下所述:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-6.0#custom-attributes

注意区别:在第一种情况下,我们确保不能创建无效对象。在第二种情况下,我们允许创建对象,但有一个允许我们检查对象数据是否有效的生态系统。

验证 ISBN

ISBN 编号有一些规则,例如长度和校验和。验证规则很简单,谷歌搜索将为您提供所有详细信息。公司https://en.wikipedia.org/wiki/International_Standard_Book_Number

ISBN 数据类型

虽然 ISBN 是数字,但将它们视为字符串可能更实用,尤其是。在处理用户输入时。您通常不想搜索“大于 1234”的 ISBN。如果您需要 "starts with"、"contains"、... 条件,这些条件可能更适用于字符串数据类型。如果您使用字符串,我建议您删除可选的分隔符。

C# 记录

看起来您正在使用不可变类型。在这种情况下,您可以使用新的 C# 记录来简化您的代码:

public record Book(string ISBN);

见:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/record

【讨论】:

  • 赞成使用不变性。
  • 并将long isbn 更改为string isbn,还要考虑ISBN 值存在于其他EAN.URN 命名空间(如“bookland”)中的情况。有几十篇关于该主题的 GS1 论文:
  • 更好的是:使用细化类型表示 ISBN
  • 我喜欢单独的类型,但应该记住,这可能需要额外的努力才能使其与序列化或例如如果我们想在 asp.net 路由等中使用此类类型...
  • “需要额外的努力” - 相当轻描淡写 :) C#/.NET 中的自定义细化类型通常同时是在程序模型中表示域规则的最佳方式,但也会引入大量乏味的低级可以说 C# 的价值工作应该能够为我们自己完成,但仍然不能,*grumble*
猜你喜欢
  • 1970-01-01
  • 2021-03-29
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多