0

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

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

4

5 回答 5

4

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

要回答您的问题,这样做的原因是为了有效地使该属性对类外的每个人都是只读的,但允许在类内运行的任何代码仍然设置该属性。

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;
    }
}
于 2013-07-21T23:19:28.843 回答
1

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

class Employee
{ 

     public string Name
     {
         get;
         protected set;
     }
}

不过,更具体地说,没有。它没有。 private, protected, 并public从其他类引用变量的可见性,而不是从您正在编写的类内部。

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

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

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

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

于 2013-07-21T23:20:29.297 回答
1

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

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

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

    public object MyProperty { get; private set; }
}

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

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

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

于 2013-07-21T23:20:44.817 回答
0

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

private string m_name { get; set; }

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

  • 支持字段 - 私有
  • 获取价值 - 公开
  • 设置值 - 私有
于 2013-07-21T23:19:25.323 回答
0

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

于 2013-07-22T03:42:27.327 回答