C#中的私有访问者

时间:2013-07-21 23:14:02

标签: c#

我对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属性。这不会破坏私人(甚至受保护)的财产吗?

在第一个例子中,编译器不应该知道它的私有,因此在幕后创建方法(我相信它在编译时会这样做)?

5 个答案:

答案 0 :(得分:4)

您的第一个示例将为您提供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;
    }
}

答案 1 :(得分:1)

这是大多数人使用的简写:

class Employee
{ 

     public string Name
     {
         get;
         protected set;
     }
}

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

private - 此类中的任何方法或属性访问器都可以使用此项。

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

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

internal - 与public相同,但仅限于当前编译的程序集内。

答案 2 :(得分:1)

这完全取决于您消费该物业的背景。

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

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

    public object MyProperty { get; private set; }
}

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

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

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

答案 3 :(得分:0)

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

private string m_name { get; set; }

您看到的一个断开连接是您列出的示例提供了对该类消费者的以下访问权限:

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

答案 4 :(得分:0)

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