在C#中使用私有变量的优点是什么

mic*_*ael 8 c# encapsulation

示例代码(替代代码如下),

// person.cs
using System;
class Person
{
    private string myName ="N/A";

    // Declare a Name property of type string:
    public string Name
    {
        get 
        {
           return myName; 
        }
        set 
        {
           myName = value; 
        }
    }
    public override string ToString()
    {
        return "Name = " + Name;
    }

    public static void Main()
    {
        Person person = new Person();
        Console.WriteLine("Person details - {0}", person);
        person.Name = "Joe";
        Console.WriteLine("Person details - {0}", person);

    }
}
Run Code Online (Sandbox Code Playgroud)

我们不能直接写,myName从私有变为public,没有要求声明另一个公共变量Name而不需要使用get和set?

替代代码

    // person.cs
    using System;
    class Person
    {

        public string myName ="N/A";

        public override string ToString()
        {
            return "Name = " + myName;
        }

        public static void Main()
        {
            Person person = new Person();
            Console.WriteLine("Person details - {0}", person);
            person.myName = "Joe";
            Console.WriteLine("Person details - {0}", person);

        }
    }
Run Code Online (Sandbox Code Playgroud)

Cha*_*nns 15

外部可见属性优于字段,因为:

  • 属性允许更好的封装.字段是固定的实现,允许消费者直接访问.属性:

    • 是松散耦合的(因为底层字段可以随时从变量变为数据库)

    • 允许自定义逻辑(验证,事件通知,延迟加载等)

    • 控制访问(因为逻辑可以在get/set中构建,甚至声明为只读或只写).

  • 字段不能在接口中使用.这是测试驱动开发的障碍(首先是接口).

  • 自动或自动实现的属性与字段一样容易声明,并且还优化为与字段相同.看到这里.

  • 声明外部可见字段(公共,受保护,受保护的内部)是FxCop违规.见规则CA1051.

  • 将字段更改为属性是一个重大变化,因为需要重新编译调用代码(也适用于二进制序列化).

  • .NET中的许多库都可以识别属性,例如XML序列化,WPF绑定,ASP.NET双向绑定等,以及Visual Studio设计器.

  • ++和 - 仅适用于属性?那是错的 (3认同)

bas*_*h.d 10

你正在破解OOP的一个基础 - >信息隐藏/封装

通过将您的属性定义为公共属性,您可以为每个人提供对它们的访问权限,并且可以根据需要更改(损坏)它们.这样您就不能保证您的对象始终处于一致状态.

来自维基百科

在编程语言中,封装用于指代两个相关但不同的概念之一,有时用于其组合[1] [2]:
- 用于限制对某些对象组件的访问的语言机制.[3] [4 ]
- 一种语言结构,有助于将数据与操作该数据的方法(或其他功能)捆绑在一起.[5] [6]

一些编程语言研究人员和学者单独使用第一含义或与第二含义结合使用作为面向对象编程的区别特征,而提供词汇闭包的其他编程语言将封装视为与面向对象正交的语言的特征.

第二个定义的动机是,在许多OOP语言中隐藏组件不是自动的或可以被覆盖; 因此,信息隐藏被喜欢第二定义的人定义为单独的概念.