在c#中使用私有变量的好处是什么?

本文关键字:是什么 变量 | 更新日期: 2023-09-27 18:19:03

示例代码(可选代码如下),

// 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);
    }
}

我们能不能直接写,把myName从private改为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);
        }
    }

在c#中使用私有变量的好处是什么?

外部可见属性比字段更好,因为:

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

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

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

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

  • 字段不能用于接口。这是测试驱动开发(接口优先)的障碍。

  • 自动或自动实现的属性与字段一样容易声明,并且也被优化为与字段一样执行。看到这里。

  • 声明一个外部可见的字段(public, protected, protected internal)是违反FxCop的

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

  • 属性被。net中的许多库识别为,用于XML序列化、WPF绑定、ASP. js等任务。. NET双向绑定等,也可以由Visual Studio设计器。

您正在破坏OOP的基础之一->信息隐藏/封装

通过将属性定义为public,每个人都可以访问它们,并且可以根据需要更改(损坏)它们。这样你就不能保证你的对象在任何时候都处于一致的状态。

从维基百科

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

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

第二个定义源于这样一个事实:在许多OOP语言中,组件的隐藏不是自动的,或者可以被覆盖;因此,偏爱第二种定义的人将信息隐藏定义为一个单独的概念。

在您的示例中,这两种方法实际上没有区别。通常,属性让您有可能将它们设置为其他类的只读(使用私有setter)—您将无法对字段做这样的事情。公共字段/属性设置违反了OOP的封装规则

在OOP中,惯例是对用户隐藏所有变量,而使用getter和setter来操作它们。在某些情况下,您需要更改变量值,直到它被保存。例如,您提示用户输入一些速度值,用户输入MPH值,但您希望将它们转换为Km/h或m/s。在这种情况下,setter是有意义的。在某些情况下,您希望setter或getter是私有的,而变量只能读或只能写。但是总结一下,OOP的约定是使用setter和getter来代替公共变量。这是封装概念

你可以这样做,但这不是很好的练习。将私有变量封装为属性意味着您可以更好地控制客户端可以做什么和不可以做什么

如果它看起来有点冗长,你也可以使用下面的

public string Name { get; set; }

作为bash。我写的是OOP的基础。

在这种情况下,我建议将Name放在构造函数中:
 class Person
 {
    public Person(string name)
    {
       this.myName = name;
    }
    private string myName ="N/A";
    public string Name
    {
        get 
        {
           return myName; 
        }
        private set 
        {
           myName = value; 
        }
    }
    public override string ToString()
    {
        return "Name = " + Name;
    }
    public static void Main()
    {
        Person person = new Person("Joe");
        Console.WriteLine("Person details - {0}", person);
        Console.WriteLine("Person details - {0}", person);
    }
 }