【问题标题】:Change Private Property of Class改变类的私有财产
【发布时间】:2013-04-27 05:59:15
【问题描述】:

我的人物类:

 class Person
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public int Age { get; private set; }

    public Person(string firstName,string LastName,int age)
    {
        this.FirstName = firstName;
        this.LastName = LastName;
        this.Age = age;


    }

    public override string ToString()
    {
        return this.FirstName + " " + this.LastName + " " + this.Age;

    }



}

主要:

 class Program
{
    static void Main(string[] args)
    {
        Person sallyPerson = new Person("Sally", "Solomon",23);

    }
}

假设我想更改此人的名字和年龄,我该怎么做? FirstName 和 Age 属性是私下设置的。

【问题讨论】:

  • 如果您需要从课堂外更改它们,为什么还要使用私人设置器?
  • 这没有意义,但你可以创建一个公共方法并在其中调用 set。
  • 这些集合是私有的有原因吗?如果是这样,那么您可能应该尊重这些原因,而不是尝试将它们设置在课堂之外(但可能应该有一条评论说明为什么不这样做。)否则,是的,只要将它们公开,如果您希望能够设置它们而且没有任何理由不...

标签: c#


【解决方案1】:

您可以将属性公开 -

class Person
{
    // changed private set; to set;
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

【讨论】:

    【解决方案2】:

    所以我刚刚意识到,所有答案都假设您所问的问题是字面意思您所问的问题,而不仅仅是一个示例。但是也许您只是将它用作示例,而您实际上需要设置一个您无法控制其来源的对象的私有属性?在这种情况下,我会说,这通常是一个坏主意,但如果你真的需要这样做,有办法。这种方式被称为“反射”(如果你真的想要,这只是你可以用反射做的许多粗略的事情之一)。 This 是您可能想要查看的问题,如果这实际上是您所追求的。

    不过,更可能的是,如果您控制该类的源并且想要更改它们,则正确的响应是不要将属性设为私有。

    【讨论】:

      【解决方案3】:
      class Program
      {
          static void Main(string[] args)
          {
              Person sallyPerson = new Person("Sally", "Solomon",23);
      sallyPerson = new Person("Newname", "Newvalue", 23);
      
          }
      }
      

      这是一种方式,另一种方式是在 Person 对象中添加方法:

      public void UpdateFirstName(string newName)
      {
      this.FirstName = newName;
      }
      

      然后做sallyPerson.UpdateFirstName("newName");

      或者将属性public 设为公共set 和get

      【讨论】:

        【解决方案4】:

        该类已设置为不可变,这意味着一旦构造了此类的实例,它的属性就无法修改。如果您希望能够构建此类并且他们修改它的属性,您需要使类设置属性为公共,如下所示:

        class Person
        {
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int Age { get; set; }
        }
        

        【讨论】:

          【解决方案5】:

          我希望这是一个家庭作业问题,否则@Brandon Cuff 的答案是显而易见的。

          或者,您可以公开设置字段的方法:

          class Person
          {
              public void SetFirstName(string value)
              {
                 this.FirstName = value;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-05-18
            • 1970-01-01
            • 2016-11-17
            • 2023-03-17
            • 1970-01-01
            • 2011-12-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多