访问修饰符 VS 属性

Posted

技术标签:

【中文标题】访问修饰符 VS 属性【英文标题】:Access Modifier VS Properties 【发布时间】:2013-03-09 17:00:31 【问题描述】:

访问修饰符的目的是隐藏数据成员免受未经授权的访问。而 Properties 的目的是公开访问修饰符。访问修饰符的目的消失了。以下是示例。

public class Employee

    private int EmployeeID;
    private string Name;
    private int Salary;

    public int EID  get  return this.EmployeeID;  set  this.EmployeeID = value;  
    public string EName  get  return this.Name;  set  this.Name = value;  
    public int ESalary  get  return this.Salary;  set  this.Salary = value;  


static void Main(string[] args)

    Employee Employee = new Employee();
    Employee.EName = "Zaheer";

在这里我可以访问间接访问名称的属性 EName。如果问题很愚蠢,请见谅。

【问题讨论】:

【参考方案1】:

私有字段的概念并不是说,无论如何,该值无法被类型之外的东西修改。如果那是真的,它们将完全没用。私有字段的想法是禁止从类型外部直接访问成员本身,但可以通过一定数量的非私有成员允许有限程度的间接访问。与公共访问相比,这些公共成员将提供一些更有限的访问该领域的方法。

在您的特定示例中,确实没有太多限制;任何拥有实例的人都可以随时访问该值,或者任何拥有实例的人都可以随时设置该值。它仍然比公开公开该字段更受保护,例如,您不能通过方法上的ref 参数直接创建对该字段的引用,但您说得对,添加的保护很少。当外部实体修改字段的能力以某种方式受到限制时,它变得更加有用。也许它可以获取值而不设置它,也许某些值根本无法设置,也许它会在调用方法时以任何外部实体从未直接指定的方式改变自己。

最终的想法是方法/属性的定义将决定对底层字段的访问级别。这种访问级别可以从几乎完全到几乎没有。

【讨论】:

【参考方案2】:

您的示例属性都非常简单,可以用自动属性替换。属性用于控制对字段的访问,而不仅仅是公开该字段。

例如,如果您有一个名为EmailAddress 的属性,您可能需要在分配之前检查正确的电子邮件地址的值。您可以在属性的设置器中处理它并拒绝任何无效值。当你直接公开一个字段时,你无法在你的类中控制它。

这是属性的明显用途之一,但与使用字段相比,还有其他用途和优势。

【讨论】:

【参考方案3】:

属性实际上是返回和设置字段值的方法的语法糖。因此,它们有几个优点:

    属性可以执行额外的检查。例如,您可以捕获将 EID 设置为负值或将 EName 设置为空字符串的尝试。 属性可以一次设置多个字段,以保持对象内部数据一致。 属性可以在接口中使用,而字段不能。 属性可以有单独的 getter 和 setter 访问修饰符。

但是,设置字段更有效,因为它没有调用方法的开销。

【讨论】:

【参考方案4】:

你说错了。属性是数据成员,访问修饰符是修改对数据成员的访问权限的修饰符。属性可以从外部访问,因为它们具有“公共”访问修饰符。

【讨论】:

是的,你是对的,但问题是我仍然可以访问私人会员。我认为它不应该允许...... 另外查看您的语法,您将希望标准化字段的命名,如下所示:公共字段(也称为属性)的名称以大写字母开头,而私有字段的名称以首字母开头小写字母。 您不能从他们所属的另一个类访问私有成员。您在代码中访问的是公开的 EName 属性。 但我间接地为私有成员名称赋值。这是我认为我不应该从主要方法访问的内容 这就是公共成员的用途:处理内部类功能。将您的 EName 属性视为一种方法“public void SetName(string value)”,它将使用给定参数设置 Name 字段值。事实上,属性就是这里提到的答案之一:方法的语法糖。

以上是关于访问修饰符 VS 属性的主要内容,如果未能解决你的问题,请参考以下文章

Java中各种(类方法属性)访问修饰符与修饰符的说明

Java中各种(类方法属性)访问修饰符与修饰符的简单说明

属性访问修饰符

java访问修饰符

Java访问修饰符:publicprotected缺省private

面向对象访问控制修饰符privat…(转载)