【问题标题】:How to prevent the values of properties initialized by the constructor from being overwritten [closed]如何防止构造函数初始化的属性值被覆盖[关闭]
【发布时间】:2022-01-23 02:52:12
【问题描述】:

我是编程新手,我试图防止 Program 类覆盖由 Person 类的构造函数初始化的属性值

这是我的代码:请参阅 cmets 突出显示我想要实现的目标

using System;

namespace Test
{
    class Program
    {
        class Person
        {
            public string FName { get; set; }
            public string LName { get; set; }

            public Person(string fName, string lName)
            {
                FName = fName;
                LName = lName;
            }

            public override string ToString()
            {
                return FName + " " + LName;
            }

        }

        static void Main()
        {
            Person person = new Person("Adam", "Lake");
            person.FName = "Fabio";      // I want to prevent this 
            person.LName = "Scagliola";  // I want to prevent this 
            Console.WriteLine(person);
        }

    }
}

【问题讨论】:

  • 因此,您正在通过执行覆盖主动导致问题;你打算创建两个 Person 对象吗?或者从字面上看,您是否想知道如何将属性设为 ReadOnly,这样当您这样做时,您会看到一个编译器错误,即 Steve/Stoogie 行是不可能的(我想知道问题是什么;您不知道如何制作两个人或您不知道如何将属性设置为只读)
  • @CaiusJard - 是的,这个想法是在尝试运行 Steve Stoogie 行时抛出编译错误,因为它不应该存在,它应该只显示 Adam Lake。如果使用了 Adam Lake 以外的任何名称,我需要一个编译错误来阻止程序运行。我想我现在可能已经对它进行了排序:)
  • 实现目标的最简单、最快的方法是保护二传手:public string FirstName { get; protected set; } public string LastName { get; protected set; }
  • @FabioScagliola 我不同意。如果另一个类派生自Person 怎么办?您仍然可以更改该属性,而不是用户想要的。
  • @zaggler,我相信 Adam 正在尝试封装名字和姓氏,以防止 Program 类覆盖它们。如果是这样,我提出的解决方案将起作用。不过,我同意你的看法:这不会阻止派生类覆盖名字和姓氏。无论如何,我正在尝试改进这个问题并请求考虑重新打开它,因为 封装 主题很有趣

标签: c# encapsulation


【解决方案1】:

FirstNameLastName 的属性更改为Read-only Auto-Implemented Properties

public string FirstName { get; }
public string LastName { get; }

表示只能从Person构造函数中设置值

【讨论】:

  • 谢谢你。我按照上述进行了操作,但出现以下错误:无法将属性或索引器“Person.FirstName”分配给——它是只读的。你以前遇到过这种情况吗? :)
  • 这不是你想要的吗?
  • @Adam 因为这正是你想要的。
  • 这让我笑了; ?
  • @Adam 您现在需要做的是单击灰色复选标记将其变为绿色。这会改变仪表板问题的外观,并让人们知道您不再寻找答案
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多