C# 面向对象——封装

内容纲要

对于在前篇文章中,我提到了C#面向编程有三大特性,封装、继承和多态。

那么今天就详细介绍一下封装

1、封装

封装可以隐藏实现的细节,让使用者只能通过实现写好的访问方法来访问这些字段,这样一来我们只需要在这些方法中增加逻辑控制,限制对数据的不合理访问。方便数据检查,有利于于保护对象信息的完整性。便于修改,提高代码的可维护性。实现良好的封装,需要从两个方面考虑:

 

  1. 把字段(成员变量)和实现细节隐藏起来,不允许外部直接访问
  2. 把方法暴露出来,让方法控制这些成员变量进行安全的访问和操作

 

所以,封装的含义是确保对用户隐藏敏感数据。为此,必须:

 

  • 将类变量/属性声明为private
  • 提供公共的get和set方法来访问和更新private变量的值

2、get和set访问器

private变量只能在同一类中访问(外部类无法访问它)。 但是,如果我们提供公共的get和set访问器,get 访问器和 set 访问器的使用与方法非常类似,则可以访问它们。

get和set访问器,获取和设置字段(属性)的值。

定义属性的语法形式如下:

public    //数据类型    属性名
{
    get
    {
        //获取属性的语句块;
        //return 值;
    }
    set
    {
        //设置属性得到语句块;
    }
}

例如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cjavapy
{
    class Book
    {
        private int id;
        private string name;
        private double price;
        //设置图书编号属性
        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
        //设置图书名称属性
        public string Name
        {
            get
            {
                return name;
            }
        }
        //设置图书价格属性
        public double Price
        {
            get
            {
                return price;
            }
            set
            {
                price = value;
            }
        }
        public static void Main(string[] args)
        {
            // 创建Student类的一个对象(从Person继承属性和方法)
            Book myObj = new Book();
            myObj.Id = 101;
            //只有get访问器,是只读的,只读不能赋值
            //myObj.Name = "hello world!";
            myObj.name="hello world!";
            myObj.Price = 11.04;
            Console.WriteLine("Id: " + myObj.Id);
            Console.WriteLine("Name: " + myObj.Name);
            Console.WriteLine("Price: " + myObj.Price);
        }
    }
}

get 访问器或 set 访问器还可以简写:

public    //数据类型    属性名
{
    get;
    set;
}

例如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace cjavapy
{
    class Book
    {
        //private int id;
        private string name;
        //private double price;
        //设置图书编号属性
        public int Id
        {
            get;
            set;
        }
        //设置图书名称属性
        public string Name
        {
            get
            {
                return name;
            }
        }
        //设置图书价格属性
        public double Price
        {
            get;
            set;
        }
        public static void Main(string[] args)
        {
            // 创建Student类的一个对象(从Person继承属性和方法)
            Book myObj = new Book();
            myObj.Id = 101;
            //只读不能赋值
            //myObj.Name = "hello world!";
            myObj.name="hello world!";
            myObj.Price = 11.04;
            Console.WriteLine("Id: " + myObj.Id);
            Console.WriteLine("Name: " + myObj.Name);
            Console.WriteLine("Price: " + myObj.Price);
        }
    }
}// 输出 "cjavapy"

3、封装的好处

 

  • 更好地控制类的属性和方法
  • 可以将类属性设置为只读(如果仅使用get访问器),也可以设置为只写(如果仅使用set访问器)
  • 灵活:程序员可以更改代码的一部分而不影响其他部分
  • 增强数据安全性

给TA打赏
共{{data.count}}人
人已打赏
C#

C# 面向对象 类和对象的声明及使用

2022-10-26 19:01:17

C#

.NET(C#) 读取Resource资源文件的方法

2022-10-28 12:22:35

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索