C#:封装(encapsulated)

目录

第一性原理:什么是封装?

C#中封装的具体实现

什么时候需要封装? 

为什么需要封装?

第一性原理:什么是封装?

从最基础的角度看,封装其实是人类生活中一种很常见的想法——把相关的东西放在一起,保护它们不受外界干扰,同时只暴露我们希望别人知道或使用的部分。想象你有一个抽屉,里面放着你的私人物品。你不会让每个人都能随便打开抽屉乱翻,而是只在需要的时候自己拿东西,或者告诉别人“这个抽屉里有什么,你可以问我,但我不会让你直接动它”。封装在编程里也是类似的道理。

在C#(或者其他面向对象编程语言)中,封装是一种设计思想和实践,它的核心目标是:

  1. 隐藏细节:把代码的内部实现细节隐藏起来,只对外暴露必要的接口或方法。

  2. 保护数据:防止外部随意修改或访问数据,确保数据安全和一致性。

  3. 提高代码的可维护性:让代码结构更清晰,修改内部逻辑时不会影响到外部的使用。

在C#中,封装就是把类的内部数据(比如变量)和行为(比如方法)包装成一个“黑盒子”。外部世界(其他代码或程序)只能通过你提供的“接口”来与之交互,而不能直接乱动里面的东西。 

C#中封装的具体实现

在C#里,封装主要通过以下几种方式实现:

1. 使用访问修饰符(Access Modifiers)

C#提供了几种访问修饰符来控制谁能访问类的成员(字段、方法、属性等)。最常用的有:

  • public:公开的,任何人都能访问。比如咖啡机的“按下按钮”功能是公开的,你可以直接用。

  • private:私有的,只有类内部能访问。比如咖啡机的内部电路设计是私密的,外人看不到也碰不到。

  • protected:保护的,只有类本身和它的子类能访问。

  • internal:仅限于同一个程序集(项目)内部能访问。

public class Person
{
    // 私有的字段(隐藏细节)
    private string _name; // 名字是私有的,外界不能直接修改

    // 公开的属性(提供接口)
    public string Name 
    { 
        get { return _name; } // 读取名字
        set { _name = value; } // 设置名字,但可以加限制
    }

    // 公开的方法(提供功能)
    public void SayHello()
    {
        Console.WriteLine($"Hello, my name is {_name}");
    }
}

_name 是私有的,外界不能直接访问或修改。 

Name 属性是公开的,但它控制了如何读取和设置 _name,比如你可以加一些校验(比如名字不能为空)。 

SayHello 是公开的方法,别人可以用它来让 Person 对象打招呼。 

注意: 

对私有和公共字段使用不同的大小写。 我们使用camelCase形式表示私有字段,而用PascalCase形式表示公共字段。PascalCase是指变量名中每个单词的变量名中每个单词的首字母大小。camelCase与PascalCase类似,只不过第一个首字母是小写。这称为camelCase是因为它让大写的字母看起来就像一个骆驼的“驼峰”。

为公共和私有字段使用不同的大小写是很多程序员遵循的一个约定。如果你为字段、属性、变量和方法选择名字时使用一致的大小写,你的代码会更易读。

2. 属性(Properties)

属性是C#中封装的重要工具。它就像是一个“门卫”,控制谁可以进出你的数据。你可以设置规则,比如:

  • 只读(只提供 get,不提供 set)。

  • 只写(只提供 set,不提供 get)。

  • 在设置数据时进行验证(比如确保年龄不能是负数)。

例子:

public class Student
{
    private int _age; // 私有的年龄字段

    public int Age
    {
        get { return _age; }
        set 
        { 
            if (value < 0)
            {
                throw new Exception("年龄不能是负数!");
            }
            _age = value; 
        }
    }
}

这里,Age 属性封装了 _age 字段。如果有人试图设置一个负数的年龄,程序会报错,这样就保护了数据的合理性。

什么时候需要封装? 

只在需要时才将字段和方法设置为公共。如果没有合理的原因将某个成员声明为公共的,就不要把它作为公共成员。如果让程序里的所有字段都是公共的,你会把事情搞的一团糟。不过,也不要简单的让所有成员都是私有的。提前花点时间好好考虑一下,哪些字段确实应该是公共的,而哪些是不需要的。 

为什么需要封装?

回到第一性原理,封装的本质是为了减少复杂性、提高安全性和灵活性。想象如果咖啡机的每个部件都暴露在外,任何人随便乱动,可能就会坏掉。同样,如果程序中的每个变量和方法都让外界随便访问,代码会变得混乱,容易出错。

封装的好处包括:

  • 安全:防止外界意外修改数据或调用不该调用的方法。

  • 灵活:你可以随时修改类的内部实现(比如换一种算法),只要对外的接口不变,其他代码不用改。

  • 清晰:让代码结构更干净,职责更明确——类负责自己的数据和行为,不被外界干扰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值