【问题标题】:Private Accessor in C#C# 中的私有访问器
【发布时间】:2013-07-21 23:14:02
【问题描述】:

我对 C# 中的访问器有点困惑。我假设可以为私有访问者做这样的事情:

private string m_name =
{
    get { return m_name; } // Not sure if this is actually correct. Maybe use 'this'
    set { m_name = value } // Not even sure if this is correct
} 

我不确定上面的代码是否有效。我没有在 C# 中使用过访问器。

相反,文档规定这样做:

class Employee
{
     private string m_name;

     public string Name
     {
         get { return m_name; }
         protected set { m_name = value; }
      }
}

为什么要这样做,因为从我的角度来看,用户仍然可以通过 Name 访问私有 m_name 属性。这不会破坏私有(甚至受保护)属性的意义吗?

在第一个示例中,编译器是否不应该知道它的私有并因此在幕后创建方法(就像我相信它在编译时所做的那样)?

【问题讨论】:

标签: c#


【解决方案1】:

您的第一个示例会给您一个 StackOverflowException,您需要使用单独的成员来存储您的数据或使用自动属性。

为了回答您的问题,这样做的原因是为了有效地将属性readonly 提供给类外的每个人,但允许类内运行的任何代码仍然设置该属性。

class Employee
{
     public Employee(string name)
     {
         Name = name;
     }

     private string m_name;

     public string Name
     {
         get { return m_name; }
         protected set { m_name = value; }
     }

     public void ChangeName(string name)
     {
         Name = name;
     }
}

public class Ceo : Employee
{
    public Ceo(string name) : base(name)
    {
    }

    public void VoteOut()
    {
         Name = Name + " (FIRED)";
    }
}


static class MainClass
{
    static void Main(string[] args)
    {
        var employee = new Employee("Scott Chamberlain");

        Console.WriteLine(employee.Name) //Displays Scott Chamberlain;

        //employee.Name = "James Jeffery"; //Has a complier error if uncommented because Name is not writeable to MainClass, only members of Employee can write to it.

        employee.ChangeName("James Jeffery");

        Console.WriteLine(employee.Name) //Displays James Jeffery;
    }
}

【讨论】:

  • 只读因素很好,但更大的好处是封装。您如何确定Name 可以很灵活。
  • 那么为什么 setter 不是私有的而不是受保护的呢?
  • @Kashif 如果您每个人都想创建一个派生类,还需要设置值。查看我对新 Ceo 类的更新。它将文本 (FIRED) 添加到基类 EmployeeName 属性的末尾。如果Name 是私有的,Ceo 只能读取Name 而不能将其设置为新值。
  • 感谢@ScottChamberlain!
【解决方案2】:

有一个大多数人使用的速记:

class Employee
{ 

     public string Name
     {
         get;
         protected set;
     }
}

不过,更具体地说,没有。它没有。 privateprotectedpublic 指的是变量在其他类中的可见性,而不是在您正在编写的类内部。

private - 此类中的任何方法或属性访问器,但没有其他访问器可以使用此项目。

protected - 同上,但派生类中的方法或访问器也可以看到变量。

public - 可以在任何课程的任何地方看到。

internal - 与public 相同,但仅在您当前编译的程序集中。

【讨论】:

    【解决方案3】:

    这完全取决于您使用该属性的上下文。

    例如,我经常使用的模式如下所示。

    public class MyClass
    {
        public MyClass(object myPropertyValue)
        {
            this.MyProperty = myPropertyValue;
        }
    
        public object MyProperty { get; private set; }
    }
    

    在该示例中,想法是 MyProperty 值应在创建对象时定义,但在事后永远不会更改。将 set 访问器设为私有可确保我自己或其他任何人都不会在其代码的其他地方意外设置该值。

    受保护的访问器意味着 Employee 的子类也可以设置该属性。我在 MyClass.MyProperty 上的私有集意味着 MyClass 的子类不能设置该属性值。

    请注意,在您的情况下,私有变量 可能 也是多余的。这取决于它可能在其他地方使用。

    【讨论】:

      【解决方案4】:

      在给出的示例中,您将支持字段明确定义为m_name。您可以让编译器自动生成方法,但您需要使用不同的语法。

      private string m_name { get; set; }
      

      您看到的其中一个断开连接是您列出的示例为该类的使用者提供了以下访问权限:

      • 支持字段 - 私有
      • 获取价值 - 公开
      • 设置值 - 私有

      【讨论】:

        【解决方案5】:

        基本上,Accessors 将定义您将允许访问哪些成员或变量。是的,某些类可以为该成员定义一个特定的值,但它不能直接访问所述成员变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-06
          • 1970-01-01
          • 2013-05-25
          相关资源
          最近更新 更多