学习c#的第七天

news2024/11/18 7:31:35

目录

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 的范围最大,所有地方都可以访问。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode算法心得——高级访客(模拟枚举+小窗口)

大家好,我是晴天学长,今天的周赛第二题,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .高级访客 给你一个长度为 n 、下标从 0 开始的二维字符串数组 access_times 。对于每个 …

Redis五种数据类型及命令操作(二)

🎈个人公众号:🎈 :✨✨✨ 可为编程✨ 🍟🍟 🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵 🍉本篇简介:🍉 本篇记录Redis五种数据类型及命令操作,如…

Oracle(2-1) Networking Overview

文章目录 一、基础知识1、Network Environ Challenges 网络环境挑战2、Simple Network :2-Tier 简单的两层网络3、Simple to Complex : N-Tier 简单到复杂:N层网络4、Oracle Network Solutions Oracle网络解决方案5、Key Features of Oracle Net Oracle Net的主要功…

[MySQL] MySQL表的基础操作

文章目录 一、创建表 1、1 SQL语法 1、2 实例演示 二、查询表 三、修改表 3、1 修改表名字 3、2 新增列(字段) 3、3 修改列类型 3、4 修改列名 3、5 删除表 四、总结 🙋‍♂️ 作者:Ggggggtm 🙋‍♂️ 👀 专…

详解Redis持久化(上篇——RDB持久化)

Redis持久化的作用和意义 Redis 持久化是一种机制,用于将内存中的数据写入磁盘,以保证数据在服务器重启时不会丢失。持久化是为了解决内存数据库(如 Redis)在服务器关闭后,数据丢失的问题。 Redis 持久化的主要作用和…

如何判断一个角是否大于180度(2)

理论计算见上一篇: 如何判断一个角是否大于180度?_kv1830的博客-CSDN博客 此篇为代码实现 一。直接上代码: import cv2 as cv import numpy as np import mathdef get_vector(p_from, p_to):return p_to[0] - p_from[0], p_to[1] - p_from…

【第六章】软件设计师 之 数据结构与算法基础

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 1、数据结构与算法基础 2、数据 3、稀疏矩阵…

【第三章】软件设计师 之 数据库系统

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 1、数据库系统前言 2、三级模式 - 两级映射…

爬虫项目(12):正则、多线程抓取腾讯动漫,Flask展示数据

文章目录 书籍推荐正则抓取腾讯动漫数据Flask展示数据 书籍推荐 如果你对Python网络爬虫感兴趣,强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧,是每位爬虫开发者的必读之作。详细介绍见&#x1f44…

Netty入门指南之NIO Selector写操作

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言操作演…

transfomer模型——简介,代码实现,重要模块解读,源码,官方

一、什么是transfomer Transformer是一种基于注意力机制(attention mechanism)的神经网络架构,最初由Vaswani等人在论文《Attention Is All You Need》中提出。它在自然语言处理(NLP)领域取得了巨大成功,特…

自定义Graph Component:1.1-JiebaTokenizer具体实现

JiebaTokenizer类继承自Tokenizer类,而Tokenizer类又继承自GraphComponent类,GraphComponent类继承自ABC类(抽象基类)。本文使用《使用ResponseSelector实现校园招聘FAQ机器人》中的例子,主要详解介绍JiebaTokenizer类…

JavaScript_动态表格_添加功能

1、动态表格_添加功能.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态表格_添加功能</title><style>table{border: 1px solid;margin: auto;width: 100%;}td,th{text-align: ce…

Python:Unittest框架快速入门:用例、断言、夹具、套件、HTML报告、ddt数据驱动

快速看了套Unittest的入门教程 软件测试全套资料赠送_哔哩哔哩_bilibili软件测试全套资料赠送是快速入门unittest测试框架&#xff01;全实战详细教学&#xff0c;仅此一套&#xff01;的第1集视频&#xff0c;该合集共计11集&#xff0c;视频收藏或关注UP主&#xff0c;及时了…

ElasticSearch学习和使用 (使用head软件可视化es数据)

使用步骤 直接使用 Elasticsearch的安装和使用 下载Elasticsearch6.2.2的zip包&#xff0c;并解压到指定目录&#xff0c;下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-2-2运行bin目录下的elasticsearch.bat启动Elasticsearch安…

【Python】python读取,显示,保存图像的几种方法

一、PIL&#xff1a;Python Imaging Library&#xff08;pillow&#xff09; PIL读取图片不直接返回numpy对象&#xff0c;可以用numpy提供的函数np.array()进行转换&#xff0c;亦可用Image.fromarray()再从numpy对象转换为原来的Image对象&#xff0c;读取&#xff0c;显示&…

Deepsort项目详解

一、目标追踪整体代码 代码目录如下图所示&#xff1a; 、 追踪相关代码&#xff1a; 检测相关代码和权重 调用 检测 和 追踪的代码&#xff1a; 首先代码分为三个部分&#xff1a; 目标追踪的相关代码和权重目标检测相关代码和权重&#xff0c;这里用的是yolov5.5目标检…

c语言练习11周(6~10)

输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。 题干 输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。输入样例gfedcba输出样例gbcdefa 选择排序 #include<s…

java--JDBC学习

文章目录 今日内容0 复习昨日1 JDBC概述2 JDBC开发步骤2.1 创建java项目2.2 导入mysql驱动包2.2.1 复制粘贴版本2.2.2 idea导入类库版本 2.3 JDBC编程 3 完成增删改3.1 插入3.2 更新3.3 删除 4 查询结果集ResultSet【重要】5 登录案例【重要】6 作业 今日内容 0 复习昨日 1 JDB…

数据结构:树的存储结构(孩子兄弟表示法,树和森林的遍历)

目录 1.树的存储结构1.双亲表示法&#xff08;顺序存储&#xff09;1.优缺点 2.孩子表示法&#xff08;顺序链式存储&#xff09;3.孩子兄弟表示法&#xff08;链式存储&#xff09;4.森林与二叉树的转换 2.树的遍历1.先根遍历2.后根遍历3.层序遍历 3.森林的遍历1.先序遍历2.中…