学习c#的第七天

目录

C# 封装

概念

Public 访问修饰符

Private 访问修饰符

Protected 访问修饰符

Internal 访问修饰符

Protected Internal 访问修饰符

总结


C# 封装

概念

在面向对象程序设计中,封装是一种将数据和方法包含在一个单元中,并控制对这些数据和方法访问的机制。通过使用访问修饰符,可以根据需要设置成员的访问权限,以实现封装的特性。

C#中的访问修饰符确实具有如下所示的各种级别和可见性:

  1. public:该成员对所有对象都是可见的,可以被任何类访问。
  2. private:该成员只能在定义它的类的内部访问,其他类无法直接访问。
  3. protected:该成员对该类对象及其子类对象可见,但对于其他类是不可见的。
  4. internal:该成员对同一个程序集的对象可见,但对于其他程序集的对象是不可见的。
  5. protected internal:该成员对当前程序集或派生自包含类的类型可见。

通过合理地使用这些访问修饰符,可以控制对类的成员的访问权限,从而实现所需的封装级别。这种限制访问权限的方式有助于保护类的内部细节,并使得类的使用更加安全和可靠。

总的来说,封装和访问修饰符是面向对象编程中非常重要的概念,它们提供了一种有效管理代码访问权限的机制,有助于实现代码的安全性、可维护性和可扩展性。

Public 访问修饰符

在C#中,public访问修饰符是用于声明类成员的一种修饰符,它表示该成员对所有对象都是可见的,可以被任何类访问。具体来说,使用public访问修饰符可以使得该成员对外部代码公开,从而可以在任何地方访问和使用它。

当一个类的成员被声明为public时,这意味着其他类可以通过该成员进行直接的访问和操作,而不需要通过特定的访问方法。这种公开的访问权限可以方便其他类与该类进行交互,同时也需要我们在设计和使用时考虑到公开成员可能带来的影响。

以下是使用public访问修饰符的示例:

using System;

namespace RectangleApplication
{
    class Rectangle
    {
        //成员变量
        public double length;
        public double width;

        public double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("长度: {0}", length);
            Console.WriteLine("宽度: {0}", width);
            Console.WriteLine("面积: {0}", GetArea());
        }
    }

    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.length = 4.5;
            r.width = 3.5;
            r.Display();
            Console.ReadLine();
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

长度: 4.5
宽度: 3.5
面积: 15.75

它定义了一个名为Rectangle的类和一个名为ExecuteRectangle的类,并在ExecuteRectangle类中包含了Main方法作为程序的入口点。这个Main方法创建了一个Rectangle对象实例,并设置了其长度和宽度,然后调用Display方法展示了该矩形的属性和面积。

Private 访问修饰符

在C#中,private访问修饰符确实用于将类的成员(字段、属性、方法等)隐藏起来,使它们只能被同一个类中的其他成员访问,而无法被类的实例或其他类访问。

这种封装性质的特性允许类在内部维护其状态并确保其行为的一致性,同时对外部代码隐藏其实现细节。这有助于避免外部代码直接修改类的内部状态,从而提高了代码的安全性和可维护性。

下面是一个使用private访问修饰符的简单示例:

using System;

namespace RectangleApplication
{
    class Rectangle
    {
        private double length;  // 私有成员变量
        private double width;   // 私有成员变量

        public void SetDimensions(double len, double wid)  // 公有方法可以访问私有成员
        {
            if (len > 0 && wid > 0)
            {
                length = len;  // 在类的内部可以访问私有成员
                width = wid;   // 在类的内部可以访问私有成员
            }
            else
            {
                Console.WriteLine("无效的长度和宽度");
            }
        }

        public double GetArea()  // 公有方法可以访问私有成员
        {
            return length * width;  // 在类的内部可以访问私有成员
        }
    }

    class Program
    {
        static void Main()
        {
            Rectangle rect = new Rectangle();
            rect.SetDimensions(5, 3);
            Console.WriteLine("矩形的面积: " + rect.GetArea());
        }
    }
}

在这个示例中,length和width被声明为private,因此它们只能在Rectangle类的内部访问。通过SetDimensions方法,我们可以在类的内部设置这些私有成员的值,并通过GetArea方法获取它们的乘积。外部代码无法直接访问或修改length和width,从而保证了这些私有成员的安全性和封装性。

Protected 访问修饰符

在 C# 中,protected 访问修饰符用于限制成员的访问性,使它们只能在定义了该成员的类或派生类中进行访问。

具体来说,使用 protected 修饰的成员可以在定义它的类内部以及派生类内部进行访问,但不能在类的外部直接访问。这种访问修饰符通常用于实现封装和继承,允许派生类访问基类的成员而不暴露其细节给外部。这有助于构建更为灵活和可维护的代码结构。

例如,在 Rectangle 类中,如果希望某些成员只能被派生类访问,可以将它们声明为 protected,如下所示:

using System;

namespace RectangleApplication
{
    class Rectangle
    {
        protected double length;  // 受保护的成员变量
        protected double width;   // 受保护的成员变量  

        public void SetDimensions(double len, double wid)  // 公有方法可以访问私有成员
        {
            if (len > 0 && wid > 0)
            {
                length = len;  // 在类的内部可以访问私有成员
                width = wid;   // 在类的内部可以访问私有成员
            }
            else
            {
                Console.WriteLine("无效的长度和宽度");
            }
        }

        public double GetArea()  // 公有方法可以访问私有成员
        {
            return length * width;  // 在类的内部可以访问私有成员
        }
    }

    class Program
    {
        static void Main()
        {
            Rectangle rect = new Rectangle();
            rect.SetDimensions(5, 3);
            Console.WriteLine("矩形的面积: " + rect.GetArea());
        }
    }
}

在上面的代码中,length 和 width 成员被声明为 protected,这意味着它们可以在 Rectangle 类内部以及任何从 Rectangle 派生出来的类内部进行访问,但在类的外部是不可见的。 

Internal 访问修饰符

在 C# 中,internal 访问修饰符用于限制类型和成员只能在同一程序集内部进行访问。换句话说,具有 internal 访问修饰符的类型或成员可以被同一程序集中的其他类访问,但无法被其他程序集中的类访问。

请注意成员函数声明的时候不带有任何访问修饰符。如果没有指定访问修饰符,则使用类成员的默认访问修饰符,即为 private。

以下是一个简单的示例代码,演示了如何在C#中使用 internal 访问修饰符: 

using System;

namespace MyNamespace
{
    // 定义一个类
    class MyClass
    {
        // internal 访问修饰符将这些成员变量暴露给相同程序集内的其他类
        internal int internalVar;
        internal void InternalMethod()
        {
            Console.WriteLine("这是一种内部方法。");
        }
    }

    // 在同一程序集中的另一个类中访问 internal 成员
    class AnotherClass
    {
        static void Main(string[] args)
        {
            MyClass myObject = new MyClass();
            myObject.internalVar = 10;  // 可以访问 internal 成员变量
            myObject.InternalMethod();  // 可以调用 internal 方法
        }
    }
}

在这个示例中,我们定义了一个名为 MyClass 的类,其中包含一个 internal 成员变量 internalVar 和一个 internal 方法 InternalMethod。然后,在同一程序集中的另一个类 AnotherClass 中,我们创建了 MyClass 的实例并访问了它的 internal 成员。

Protected Internal 访问修饰符

在 C# 中,protected internal 访问修饰符表示成员对定义它们的类、派生类和同一程序集中的其他类都可见。换句话说,这种修饰符结合了 protected 和 internal 的特性,允许派生类以及同一程序集内的其他类都能访问该成员。

下面是一个简单的示例代码,演示了如何在 C# 中使用 protected internal 访问修饰符:

using System;

namespace MyNamespace
{
    // 定义一个基类
    class MyBaseClass
    {
        // protected internal 访问修饰符将这些成员变量暴露给派生类和相同程序集内的其他类
        protected internal int protectedInternalVar;

        protected internal void ProtectedInternalMethod()
        {
            Console.WriteLine("这是一个受保护的内部方法。");
        }
    }

    // 定义一个派生类
    class MyDerivedClass : MyBaseClass
    {
        static void Main(string[] args)
        {
            MyDerivedClass myObject = new MyDerivedClass();
            myObject.protectedInternalVar = 10;  // 可以访问 protected internal 成员变量
            myObject.ProtectedInternalMethod();  // 可以调用 protected internal 方法
        }
    }

}

总结

举个例子,一个人A为父类,他的儿子B,妻子C,私生子D(注:D不在他家里)

  • public 事件:所有人都知道,就像公开的信息一样,任何人都可以访问。
  • protected 事件:A,B和D知道,但妻子C不知道。这里假设B是A的儿子,D是A的私生子,因此他们可以知道这些信息。而妻子C不知道,因为她并不是A的子类。
  • private 事件:只有A知道,这意味着这些事件只能被A访问,对于其他家庭成员来说是私密的。
  • internal 事件:A,B,C都知道,因为这些事件对A家里的所有人都可见,但是私生子D不知道,因为他不在A的家庭内。
  • protected internal 事件:A,B,C,D都知道,因为这些事件对A家庭内的所有人都可见,包括A的私生子D。

关于范围比较:

  • private 的范围最小,只能在类的内部访问。
  • internal 和 protected 的范围相当,但是 protected 对派生类也可见,而 internal 只对同一程序集内的类可见。
  • protected internal 的范围介于 protected 和 internal 之间,同时对派生类和同一程序集内的其他类可见。
  • public 的范围最大,所有地方都可以访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/137433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海康Visionmaster-Qt+VS 二次开发环境如何配置?

1 新建 Qt 工程,添加 Qt 模块 Core、GUI、Active Qt 和 Container Widgets 2 拷贝 DLL:VM\VisionMaster4.0.0\Development\V4.0.0\ComControl\bin\x64 下的所有拷贝到项目工程输出目录下,如下图所示,项目的输出路径是 Dll 文件夹。 3 第一…

AOMedia发布免版税沉浸音频规范IAMF

11月10日,开放媒体联盟(AOMedia)发布了旗下首个沉浸式音频规范IAMF(https://aomediacodec.github.io/iamf/),IAMF是一种编解码器无关的容器规范,可以携带回放时间渲染算法和音频混音的信息&…

Spring Data JPA 实现集成实体对象数据库的创建、修改时间字段自动更新

JPA提供了一种事件监听器的机制,用于SQL审计,通过监听器我们可以很快速地去自动更新创建时间、修改时间,主要步骤如下: 一、创建基础实体,包含了创建和修改时间,然后让其他真正的实体继承该实体&#xff0…

59基于matlab的爬行动物搜索算法(Reptile search algorithm, RSA)

基于matlab的爬行动物搜索算法(Reptile search algorithm, RSA)一种新型智能优化算法。该算法主要模拟鳄鱼的捕食行为,来实现寻优求解,具有收敛速度快,寻优能力强的特点。程序已调通,可直接运行。 59matlab…

3分钟带你了解前端缓存-HTTP缓存

前情提要 前端缓存分为下面三大类,本文主要讲解HTTP缓存~ 1. HTTP缓存 强缓存协商缓存 2. 浏览器缓存 本地小容量缓存本地大容量缓存 3. 应用程序缓存 HTML5应用程序缓存 缓存作用 减少了冗余的数据传输减少服务器的负担提高了网站的性能加快加载网页速度 …

JPA Buddy快速创建update、find、count、delete、exists方法

JPA Buddy快速创建update、find、count、delete、exists方法,JPA默认提供的CrudRepository\JpaRepository提供的方法比较少,一般我们会手写一些方法,这里我们选择通过JPA Buddy快速生成,之前文章中讲到了JPA Buddy原本是IDEA收费插…

未来的拥塞控制与 Linux EEVDF 调度器

有破要有立。 前面提到 经典端到端拥塞控制将越来越失效,未来该如何,谈谈我的看法。 端到端拥塞控制的难点根本上是要解决公平性问题,顺带着提高资源利用率。我们很容易理解,在共享资源场景下,不公平一定是低效的&am…

Redis的特性以及使用场景

分布式发展历程参考 陈佬 http://t.csdnimg.cn/yYtWK 介绍redis Redis(Remote Dictionary Server)是一个基于客户端-服务器架构的在内存中存储数据的中间件,属于NoSQL的一种。它可以用作数据库、缓存/会话存储以及消息队列。 作为一种内存数…

【Pytorch和深度学习】栏目导读

一、栏目说明 本栏目《pytorch实践》是为初学者入门深度学习准备的。本文是该栏目的导读部分,因为计划本栏目在明年完成,因此,导读部分,即本文也在持续更新中。 本栏目设计目标是将深度学习全面用pytorch实践一遍,由浅…

原型模式 rust和java的实现

文章目录 原型模式介绍优点缺点使用场景 实现java 实现rust 实现 rust代码仓库 原型模式 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当…

mysql主从复制-使用心得

文章目录 前言环境配置主库从库 STATEMENTbinloggtidlog-errorDistSQL总结 前言 mysql 主从复制使用感受,遇到一些问题的整理,也总结了一些排查问题技巧。 环境 mysql5.7 配置 附:千万级数据快速插入配置可以参考:mysql千万数…

数据分析面试题1

1.右表为一组数据,尝试进行简单分析,并给出结论(使用公式和图表辅助) ①理解数据 userid:用户id神兽印记消耗数量 ②数据清洗 冻结首行,将列标题的英文字段转换成汉字字段检查是否有重复项:…

STM32F407: CMSIS-DSP库的移植(基于源码)

上一篇:STM32F407: CMSIS-DSP库的移植(基于库文件)-CSDN博客 1. 拷贝源码 仿照官方源码目录,新建一个source目录:\Drivers\CMSIS\DSP\Source 将所有源文件拷贝过来,如下: 然后在每个目录下新建一个总的c文件&#x…

CSS花边001:无衬线字体和有衬线字体

网站中我们看到过很多字体,样子各有千秋。通常针对结构,区分为有衬字体(serif) 和无衬字体(sans-serif)。今天我们聊一下这个话题。 什么是有衬字体,什么是无衬字体? 衬线字体&…

sqli-labs关卡16(基于post提交的双引号加括号闭合的布尔盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第十六关通关思路1、判断注入点2、猜数据库长度3、猜数据库名字4、猜表名长度5、猜表名名字6、猜列名长度7、猜列名名字8、猜数据长度9、猜数据名字 总结 前言 此文章只用于学习和反思巩固sql注入知识,禁止用于做非法攻击…

已解决:java.net.BindException: 地址已在使用

解决zookeeper报错:java.net.BindException: 地址已在使用,是因为端口被占用。显示Starting zookeeper ... STARTED,jps没有QuorumPeerMain进程。 问题截图: 看似Starting zookeeper ... STARTED,实则集群并没有启动…

逻辑回归-癌症病预测与不均衡样本评估

1.注册相关库(在命令行输入) pip install scikit-learn pip install pandas pip install numpy 2.导入相关库 import pandas as pd import numpy as np from sklearn.metrics import classification_report from sklearn.model_selection import train_test_split…

【每日一题】—— B. Deja Vu(Codeforces Round 907 (Div. 2))(暴力枚举、队列)

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

“苹果定律”失效,2023是VR的劫点还是拐点?

因为Pico裁员的事情,VR行业又被讨论了。 Pico于2021年9月被字节跳动收购,当时是出货量排名全球第三的VR 头显生产商。 此前曾有国际机构预测,2023年随着Meta和Pico的硬件更新,苹果Vision Pro的推出,三星电子重新回归VR…

黑马程序员微服务Docker实用篇

Docker实用篇 0.学习目标 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…