C#构造函数使用set访问器赋值Author导致多实例属性同时变更问题
问题根因
你当前代码的核心问题出在Author属性的set访问器逻辑:你没有接收外部传入的value值,直接写死将私有字段_Author赋值为固定字符串"Mary Delamater and Joel Murach, "。这就导致所有Book类的实例,只要给Author属性赋值,最终都会被覆盖为同一个固定值,并不是两个对象互相影响,而是所有实例的Author都被强制设成了同一个值,才会出现你以为两个对象都被修改的现象。
实现方案
你要实现「传入错误作者名时自动修改为正确值」的需求,只需要在set访问器里加上你自定义的错误判断规则即可,判断逻辑可以根据你的业务要求调整,这里给你提供两种常见场景的实现:
场景1:固定错误判定规则(比如空值/非法值替换为默认值)
如果你的规则是:传入的作者为空、长度不足或者不在合法列表里就算错误,自动替换为默认作者,代码修改如下:
// 仅修改Book类中的Author属性定义即可 public string Author { get => _Author; set { // 这里自定义错误判断规则,举例:传入值为空就算错误 if (string.IsNullOrWhiteSpace(value)) { _Author = "Mary Delamater and Joel Murach, "; } // 如果需要针对特定书名用特定正确作者,可以加判断 else if (Title == "murach's ASP.NET Core MVC, " && value != "Mary Delamater and Joel Murach, ") { // 给Book1传错作者时自动替换为正确值 _Author = "Mary Delamater and Joel Murach, "; } else { // 其余情况用传入的正确值 _Author = value; } } }
场景2:仅限制Book1对应的书籍的作者,其他书籍不限制
如果你只想让书名是《murach's ASP.NET Core MVC》的书籍自动修正作者,其他书籍按传入值为准,修改后的完整运行代码如下:
using System; namespace Book { public class Book { private string _Author; private string _Title; private string _Keywords; private string _publicationDate; private string _ISBN; public Book() { Author = ""; } public Book(string title, string author, string publicationDate, string keywords, string isbn) { // 注意要先给Title赋值,否则Author判断时拿不到Title值 Title = title; Author = author; Keywords = keywords; PublicationDate = publicationDate; ISBN = isbn; } public string Title { get => _Title; set => _Title = value; } public string Author { get => _Author; set { // 仅针对murach's ASP.NET Core MVC这本书做作者校验 if (Title == "murach's ASP.NET Core MVC, ") { _Author = "Mary Delamater and Joel Murach, "; } else { _Author = value; } } } public string Keywords { get => _Keywords; set => _Keywords = value; } public string PublicationDate { get => _publicationDate; set => _publicationDate = value; } public string ISBN { get => _ISBN; set => _ISBN = value; } public override string ToString() { return Title + Author + PublicationDate + "Keywords: " + Keywords + "ISBN " + ISBN; } } }
using System; namespace Book { class Program { static void Main(string[] args) { // 这里即使给Book1传错作者,也会自动修正为正确值 Book Book1 = new Book("murach's ASP.NET Core MVC, ", "错误的作者名", "January 2020, ", "C#, Programming, MVC, ASP.NET, Core, Beginner", "978-1-943872-49-7"); Console.WriteLine(Book1.ToString()); Book Book2 = new Book(); Book2.Title = "C# In Depth, "; Book2.Author = "John Skeet, "; Book2.PublicationDate = "March 23, 2019, "; Book2.Keywords = "C#, InDepth"; Book2.ISBN = "9781617294532"; Console.WriteLine(Book2.ToString()); } } }
运行结果
murach's ASP.NET Core MVC, Mary Delamater and Joel Murach, January 2020, Keywords: C#, Programming, MVC, ASP.NET, Core, BeginnerISBN 978-1-943872-49-7 C# In Depth, John Skeet, March 23, 2019, Keywords: C#, InDepthISBN 9781617294532
可以看到Book1的作者自动修正为正确值,Book2的作者保留了传入的John Skeet,不会被覆盖。
内容的提问来源于stack exchange,提问作者Kcampbell22
相关产品推荐
相关产品推荐

