C#:我需要帮助来创建有效的 ISBN 属性

C#: I need Help in Creating valid ISBN property

我有一本书 class,它的构造函数有一个 isbn 参数:

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

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

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

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

c#

验证输入

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

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

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 编号有一些规则,例如长度和 afaik 校验和。验证规则很简单,google 搜索将为您提供所有详细信息。 S.a。 https://en.wikipedia.org/wiki/International_Standard_Book_Number

ISBN 数据类型

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

C# 记录

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

public record Book(string ISBN);

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