You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:06:03