[英]Private Accessor in 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属性。 这不会破坏私有(甚至受保护)财产的意义吗?
在第一个示例中,编译器难道不应该知道其私有性,从而在幕后创建方法(就像我相信它在编译时所做的那样)吗?
第一个示例将为您提供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;
}
}
大多数人都使用一个速记来代替:
class Employee
{
public string Name
{
get;
protected set;
}
}
但是,更具体地说,不是。 没有。 private
, protected
和public
指的是其他类(而不是您正在编写的类内部)中变量的可见性。
private
-此类中的任何方法或属性访问器,但其他都不能使用此项目。
protected
与上面相同,但是派生类中的方法或访问器也可以看到该变量。
public
-可以在任何班级的任何程序中看到。
internal
-与public
相同,但仅在当前编译的程序集中。
这将完全取决于您使用该属性的环境。
例如,我经常使用的模式如下所示。
public class MyClass
{
public MyClass(object myPropertyValue)
{
this.MyProperty = myPropertyValue;
}
public object MyProperty { get; private set; }
}
在该示例中,想法是MyProperty值应在创建对象时定义,但在此之后不要更改。 将设置访问器设为私有可确保我自己或其他任何人都不会在其代码中的其他地方意外设置该值。
受保护的访问器意味着Employee的子类也可以设置属性。 我在MyClass.MyProperty上的私有集意味着MyClass的子类无法设置该属性值。
请注意,在您的情况下,私有变量也可能是多余的。 这取决于它可能在其他地方使用。
在给出的示例中,您将后备字段明确定义为m_name
。 您可以让编译器自动生成方法,但是您需要使用其他语法。
private string m_name { get; set; }
您看到的断开连接之一是,您列出的示例为该类的使用者提供了以下访问权限:
基本上, 存取器将定义哪些要访问的成员或变量,你会允许。 是的,某些类可以为该成员定义一个特定的值,但是它不能直接访问该成员变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.