006集—— 修饰符(public、private 、internal等)——C#学习笔记

news2024/9/21 20:37:20

封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。

抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象。

C# 封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。

一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:

声明的可访问性含义
public访问不受限制。
protected访问限于包含类或派生自包含类的类型。
internal访问限于当前程序集。
protected internal访问限于当前程序集或派生自包含类的类型。
private访问限于包含类。
private protected访问限于包含类或当前程序集中派生自包含类的类型。
成员默认成员可访问性允许的成员的声明的可访问性
enumpublic
classprivatepublic

protected

internal

private

protected internal

private protected
interfacepublicpublic

protected

internal

private*

protected internal

private protected
structprivatepublic

internal

private

 * 具有 private 可访问性的 interface 成员必须具有默认的实现。

 备注

如果使用 record 关键字修饰符修改类或结构,则允许相同的访问修饰符。
此外,使用 record 修饰符,类和结构的默认成员可访问性仍然为 private

Public 访问修饰符

Public 访问修饰符允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。

以下代码展示不同访问修饰符的区别和应用:

代码如下:

using System;

// 定义一个命名空间  
namespace 空间1
{
    // 外部类,用于展示不同访问级别的成员  
    public class 外部类1
    {
        // Public 成员,任何地方都可以访问  
        public int PublicField = 1;

        // Private 成员,只能在定义它的类内部访问  
        private int PrivateField = 2;

        // Internal 成员,只能在同一个程序集(Assembly)内访问  
        internal int InternalField = 3;

        // Protected 成员,只能在定义它的类及其子类中访问  
        // 这里不直接展示,因为需要子类来演示  

        // Protected Internal 成员,在同一个程序集内的任何类或子类中都可以访问  
        protected internal int ProtectedInternalField = 4;

        // 构造函数  
        public 外部类1()
        {
            Console.WriteLine($"PublicField: {PublicField}");
            Console.WriteLine($"PrivateField: {PrivateField}"); // 内部访问,有效  
            Console.WriteLine($"InternalField: {InternalField}"); // 内部访问,有效  
            Console.WriteLine($"ProtectedInternalField: {ProtectedInternalField}"); // 内部访问,有效  
        }

        // Public 方法,用于展示如何访问不同访问级别的成员  
        public void ShowFields()
        {
            Console.WriteLine($"PublicField: {PublicField}");
            Console.WriteLine($"PrivateField: {PrivateField}"); // 内部访问,有效  
            Console.WriteLine($"InternalField: {InternalField}"); // 内部访问,有效  
            Console.WriteLine($"ProtectedInternalField: {ProtectedInternalField}"); // 内部访问,有效  
        }
    }

    // 子类,用于展示protected和protected internal的访问  
    public class 子类1 : 外部类1
    {
        public 子类1()
        {
            // 可以访问protected和protected internal成员,因为我们在同一个程序集内且是子类  
            Console.WriteLine($"Inherited ProtectedInternalField: {ProtectedInternalField}");
            // 注意:这里不能直接访问PrivateField,因为它是私有的  
            // 如果尝试访问PrivateField,则会编译错误  
        }

        // 演示访问protected和protected internal的方法  
        public void ShowInheritedFields()
        {
            // 可以访问从外部类1继承的protected和protected internal成员  
            Console.WriteLine($"Inherited ProtectedInternalField: {ProtectedInternalField}");
            // 注意:这里不能直接访问PrivateField,因为它是私有的  
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            外部类1 outer = new 外部类1();
            outer.ShowFields(); // 可以访问外部类1的public和internal成员  

            // 尝试访问private成员会导致编译错误  
            // Console.WriteLine($"PrivateField from Main: {outer.PrivateField}"); // 编译错误  

            // 演示子类  
            子类1 子类1 = new 子类1();
            子类1.ShowInheritedFields(); // 演示从外部类1继承的protected和protected internal成员的访问  

            // 注意:由于Main在空间1命名空间中,所以它可以访问internal成员  
            // 但如果Main在另一个命名空间中且不属于同一个程序集,则不能访问InternalField  

            // 保持控制台开启  
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

 

以下为官方代码:


public class 函数
{
    public static int publicInt;
    internal static int internalInt;
    private static int privateInt = 0;

    static  函数()
    {
        // T1 can access public or internal members
        // in a public or private (or internal) nested class.
        M1.publicInt = 1;
        M1.internalInt = 2;
        M2.publicInt = 3;
        M2.internalInt = 4;

        // Cannot access the private member privateInt
        // in either class:
        // M1.privateInt = 2; //CS0122
    }

    public class M1
    {
        public static int publicInt;
        internal static int internalInt;
        private static int privateInt = 0;
    }

    private class M2
    {
        public static int publicInt = 0;
        internal static int internalInt = 0;
        private static int privateInt = 0;
    }
}

class MainClass
{
    static void Main()
    {
        // Access is unlimited.
        函数.publicInt = 1;

        // Accessible only in current assembly.
        函数.internalInt = 2;

        // Error CS0122: inaccessible outside T1.
        // T1.privateInt = 3;

        // Access is unlimited.
        函数.M1.publicInt = 1;

        // Accessible only in current assembly.
        函数.M1.internalInt = 2;

        // Error CS0122: inaccessible outside M1.
        //    函数.M1.privateInt = 3;

        // Error CS0122: inaccessible outside T1.
        //    函数.M2.publicInt = 1;

        // Error CS0122: inaccessible outside T1.
        //    函数.M2.internalInt = 2;

        // Error CS0122: inaccessible outside M2.
        //   函数.M2.privateInt = 3;

        // Keep the console open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}

 

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

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

相关文章

Python面试宝典第30题:找出第K大元素

题目 给定一个整数数组nums&#xff0c;请找出数组中第K大的数&#xff0c;保证答案存在。其中&#xff0c;1 < K < nums数组长度。 示例 1&#xff1a; 输入&#xff1a;nums [3, 2, 1, 5, 6, 4], K 2 输出&#xff1a;5 示例 2&#xff1a; 输入&#xff1a;nums …

python如何判断文件有多少行

如何统计读取的一个txt文本的行数呢&#xff1f; 最简单的办法是把文件读入一个大的列表中&#xff0c;然后统计列表的长度。如果文件的路径是以参数的形式filepath传递的&#xff0c;那么只用一行代码就可以完成我们的需求了&#xff1a; count len(open(filepath,rU).readl…

数字样机:惯性导航系统控制单元仿真

01.简介 惯性导航系统 (INS&#xff0c;Inertial Navigation System) 基于惯性原理建立&#xff0c;而惯性是物体自身的固有属性&#xff0c;因此其工作时既不依赖于外部信息&#xff0c;也不向外部辐射能量&#xff0c;优于卫星导航与无线电导航&#xff0c;是一种具备隐蔽性…

KEYSIGHT E5063A-006 无线功率传输分析

KEYSIGHT是德 E5063A-006 无线功率传输分析 E5063A-006 无线功率传输分析选件能够以任意负载阻抗设置&#xff0c;实时测量线圈或谐振器之间的无线功率传输效率&#xff08;WPT&#xff09;。基于测量结果进行的 2D/3D 分析&#xff0c;能够帮助用户更轻松地了解对负载阻抗的…

Selenium + Python 自动化测试07(滑块的操作方法)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 本篇文章主要讲述如何操作滑块。 目前很多系统登录或者注册的页面都有滑块相关的验证&#xff0c;selenium 中对滑块的基本操作采用了元素的拖曳的方式。需要用到Actiochains模…

市场惊人逆转:西格尔改口称降息紧迫性已减

最近&#xff0c;市场发生了惊人的逆转&#xff0c;让很多分析师和投资者感到意外。沃顿商学院教授**杰里米西格尔&#xff08;Jeremy Siegel&#xff09;**在短短三天内就改变了他对美联储政策的看法。此前&#xff0c;他曾呼吁美联储迅速降息&#xff0c;但现在他认为这种紧急…

五,搭建环境:辅助功能

五&#xff0c;搭建环境&#xff1a;辅助功能 文章目录 五&#xff0c;搭建环境&#xff1a;辅助功能编写登录失败异常编写常量类MD5 工具 (加密工具类)日志配置文件 编写登录失败异常 我们在 demo-module04-util 模块下&#xff0c;创建一个名为&#xff1a;com.rainbowsea.i…

10、MySQL-索引

目录 1、索引概述 2、索引结构 2.1 BTree 2.2 BTree 2.3 Hash 3、索引分类 4、索引语法 4.1 创建索引 4.2 查看索引 4.3 删除索引 5、SQL性能分析 5.1 SQL执行频率 5.2 慢查询日志 5.3 profile详情 5.4 explain执行计划 6、索引使用 6.1 验证索引效率 6.2 最左…

浪潮云服务器(Inspur)硬件监控指标解读

随着企业业务的快速发展&#xff0c;服务器的稳定运行变得愈发重要。浪潮云服务器以其高性能和稳定性&#xff0c;在数据中心中扮演着关键角色。为了确保服务器的稳定运行&#xff0c;监控易作为一款专业的IT基础设施监控软件&#xff0c;为浪潮云服务器提供了全面的硬件监控解…

Swift 中的函数式核心与命令式外壳:单向数据流

文章目录 前言函数式核心命令式外壳副作用可运行 Demo函数式核心部分命令式外壳部分副作用处理SwiftUI 界面代码运行截图代码解释 总结参考资料 前言 之前&#xff0c;我们讨论了在 Swift 中的函数式核心与命令式外壳的概念。其目标是通过值类型提取纯逻辑&#xff0c;并将副作…

Java智能之Spring AI:5分钟打造智能聊天模型的利器

前言 尽管Python最近成为了编程语言的首选&#xff0c;但是Java在人工智能领域的地位同样不可撼动&#xff0c;得益于强大的Spring框架。随着人工智能技术的快速发展&#xff0c;我们正处于一个创新不断涌现的时代。从智能语音助手到复杂的自然语言处理系统&#xff0c;人工智能…

【卫星遥感影像】国产遥感影像分类技术应用研究进展综述_论文推荐

影像分类是遥感影像信息提取中的基本问题之一和遥感影像应用的关键&#xff0c;为我国掌握本土信息资源自主权、满足国家的紧迫需求具有重大战略意义。本文将进行这篇遥感影像分类的论文推荐。 1. 论文引用 [1]胡杰,张莹,谢仕义.国产遥感影像分类技术应用研究进展综述[J].计算…

使用隔离式栅极驱动器的设计指南

本设计指南分为三部分&#xff0c;旨在讲解如何为电力电子应用中的功率开关器件选用合适的隔离栅极驱动器&#xff0c;并分享实战经验。本文为第一部分&#xff0c;主要包括隔离式栅极驱动器的介绍和选型指南。 本文引用地址&#xff1a; 安森美的隔离栅极驱动器专为满足 SiC…

阿里云CDN-边缘脚本EdgeScript的CI/CD实践

阿里云CDN-ES脚本CI/CD实践 背景环境项目代码结构及发布脚本代码1. 项目结构2. 发布工具代码 流水线配置1. 流程配置2. 脚本代码发布脚本说明0. 配置账户1. 清空测试环境&#xff08;回滚测试环境&#xff09;2. 执行脚本发布3. 发布&#xff08;测试环境推送到生产环境&#x…

java基础概念13-类和对象

一、面向对象OOP 类class&#xff1a;相同事物的共性的代码描述&#xff0c;所有类是引用数据类型。 对象&#xff08;实例&#xff09;instance&#xff1a;类的具体的一个个体的实物。 二、类的定义 在Java中&#xff0c;一个类&#xff08;Class&#xff09;是定义对象的…

【经验总结】ShardingSphere+Springboot-02 数据分片、标准分片算法、时间间隔分片算法

文章目录 三、分片算法配置3.1 数据分片3.1.2 垂直分片3.1.2 水平分片 3.2 &#xff08;标准&#xff09;分片算法3.2.1 INLINE 基于行表达式的分片算法 &#xff08;必须掌握&#xff09;关于是否开启范围查找 3.2.2 INTERVAL 时间范围分片算法 三、分片算法配置 3.1 数据分片…

vue2学习 -- 路由

文章目录 1. 相关理解2. 基本使用2.1 安装2.2 嵌套路由2.3 路由传参2.3.1 query2.3.2 路由的命名2.3.3 params 2.4 路由的props配置2.5 routerlink的replace属性 3. 编程式路由导航4. 缓存路由组件5. 两个新的生命周期钩子6. 路由守卫6.1 全局前置 / 后置路由守卫6.2 独享路由守…

Java面试题--JVM大厂篇之Java中Parallel GC的调优技巧与最佳实践

目录 引言&#xff1a; 正文&#xff1a; 1. 理解Parallel GC的工作原理 2. 常见痛点与解决方案 痛点一&#xff1a;长时间暂停 痛点二&#xff1a;频繁的Minor GC 痛点三&#xff1a;内存溢出 3. 调优参数推荐 4. 实战经验分享 结束语&#xff1a; 引言&#xff1a;…

海思AE模块Lines_per_500ms参数的意义

​ 基础知识 1秒(S)1000毫秒(ms)1000_000微妙(s)1000_000_000纳秒(ns) 1GHz1000Mhz1000_000KHz1000_000_000Hz 1Hz1/s 抗频闪原理 海思AE模块参数中有一个LinesPer500ms的参数&#xff0c;意思为500ms对应的曝光行数。此个参数和抗频闪有关。 我们知道&#xff1a; 50HZ…

SQL注入实例(sqli-labs/less-17)

0、初始网页 1、确定闭合字符 注入点在于password框&#xff0c;闭合字符为单引号 2、爆库名 1 and updatexml(1,concat(0x7e,database(),0x7e),1)# 1 and (select 1 from (select count(*),concat((select database()),floor(rand()*2))x from information_schema.tables gr…