C# 编程语言中访问修饰符(access modifiers)

C#访问修饰符

  • `protected` 访问修饰符:
  • 1. `public` 访问修饰符:
  • 2. `private` 访问修饰符:
  • 3. `internal` 访问修饰符:
  • 4. `protected internal` 访问修饰符:

在 C# 编程语言中,有多个访问修饰符(access modifiers),其中包括 protected。这些修饰符用于控制类、成员和属性的访问级别和可见性。

protected 访问修饰符表示一个成员(字段、属性、方法)或类只能在其定义的类内部和该类的派生类中进行访问。也就是说,protected 成员可以在定义它们的类内部直接访问,以及在继承该类的派生类中进行访问。

下面是一些对 protected 访问修饰符的详细解释和示例说明:

protected 访问修饰符:

  1. protected 成员的特点:

    • protected 成员可以在定义它们的类内部直接访问。
    • protected 成员可以在继承该类的派生类中进行访问。
    • protected 成员对于类外部的代码是不可见的。
  2. protected 成员的使用场景:

    • 当一个类的某个成员需要在该类的派生类中使用,但对于其他类来说应该是不可见的时,可以将该成员声明为 protected
    • protected 成员通常用于实现类的继承和多态性。

下面是一个示例代码,演示了 protected 成员的使用:

public class Animal
{protected string name; // 声明一个 protected 字段protected void PrintName() // 声明一个 protected 方法{Console.WriteLine("Animal Name: " + name);}
}public class Dog : Animal
{public Dog(string dogName){name = dogName; // 在派生类中访问基类的 protected 字段}public void DisplayName(){PrintName(); // 在派生类中调用基类的 protected 方法}
}public class Program
{public static void Main(){Dog dog = new Dog("Buddy");dog.DisplayName(); // 输出:Animal Name: Buddy}
}

在上面的示例中,Animal 类定义了一个 protected 字段 name 和一个 protected 方法 PrintName()。派生类 Dog 继承了 Animal 类,并在其构造函数中访问了基类的 protected 字段。派生类还通过调用基类的 protected 方法 PrintName() 来输出动物的名称。

需要注意的是,如果尝试在 Main 方法中直接访问 Animal 类的 name 字段,会导致编译错误,因为 protected 成员对于类外部的代码是不可见的。只有在派生类内部才能访问 protected 成员。


除了 protected 访问修饰符外,C# 还提供了其他几个常用的访问修饰符,它们分别是:

1. public 访问修饰符:

  • public 成员可以在任何地方进行访问,包括类内部、派生类和其他类。
  • public 成员对于所有代码都是可见的。

下面是一个示例代码,演示了 public 访问修饰符的使用:

public class Person
{public string Name; // 声明一个 public 字段public void SayHello() // 声明一个 public 方法{Console.WriteLine("Hello, my name is " + Name);}
}public class Program
{public static void Main(){Person person = new Person();person.Name = "John"; // 在类外部访问 public 字段person.SayHello(); // 在类外部调用 public 方法,输出:Hello, my name is John}
}

在上面的示例中,Person 类定义了一个 public 字段 Name 和一个 public 方法 SayHello()。这意味着这些成员可以在类内部和类外部的任何地方进行访问。

2. private 访问修饰符:

  • private 成员只能在其定义的类内部进行访问。
  • private 成员对于类外部的代码是不可见的。

下面是一个示例代码,演示了 private 访问修饰符的使用:

public class Car
{private string model; // 声明一个 private 字段private void StartEngine() // 声明一个 private 方法{Console.WriteLine("Engine started");}public void Drive(){StartEngine(); // 在类内部调用 private 方法Console.WriteLine("Driving the car");}
}public class Program
{public static void Main(){Car car = new Car();car.Drive(); // 在类外部调用 public 方法,输出:Engine started\nDriving the car// car.StartEngine(); // 错误:无法访问 private 方法// car.model = "BMW"; // 错误:无法访问 private 字段}
}

在上面的示例中,Car 类定义了一个 private 字段 model 和一个 private 方法 StartEngine()。这意味着这些成员只能在 Car 类的内部进行访问,对于类外部的代码是不可见的。然而,Car 类还定义了一个 public 方法 Drive(),该方法在类内部调用了 private 方法 StartEngine(),并且可以在类外部进行访问。

3. internal 访问修饰符:

  • internal 成员可以在同一程序集(assembly)内的任何类中进行访问。
  • internal 成员对于不在同一程序集内的代码是不可见的。

下面是一个示例代码,演示了 internal 访问修饰符的使用:

// Assembly1.dll
public class MyClass
{internal int MyField; // 声明一个 internal 字段internal void MyMethod() // 声明一个 internal 方法{Console.WriteLine("Internal method");}
}// Assembly2.dll
public class Program
{public static void Main(){MyClass myObj = new MyClass();myObj.MyField = 10; // 在同一程序集内访问 internal 字段myObj.MyMethod(); // 在同一程序集内调用 internal 方法// Console.WriteLine(myObj.MyField); // 错误:无法访问 internal 字段// myObj.MyMethod(); // 错误:无法调用 internal 方法}
}

在上面的示例中,MyClass 类定义了一个 internal 字段 MyField 和一个 internal 方法 MyMethod()。这些成员可以在同一程序集内的任何类中进行访问,但对于不在同一程序集内的代码是不可见的。

4. protected internal 访问修饰符:

  • protected internal 成员可以在同一程序集内的任何类中进行访问,以及在派生类中进行访问,无论是否在同一程序集内。
  • protected internal 成员对于不在同一程序集内且不是派生类的代码是不可见的。

下面是一个示例代码,演示了 protected internal 访问修饰符的使用:

// Assembly1.dll
public class MyBaseClass
{protected internal int MyField; // 声明一个 protected internal 字段protected internal void MyMethod() // 声明一个 protected internal 方法{Console.WriteLine("Protected Internal method");}
}// Assembly2.dll
public class MyDerivedClass : MyBaseClass
{public void AccessBaseMembers(){MyField = 10; // 在派生类中访问 protected internal 字段MyMethod(); // 在派生类中调用 protected internal 方法}
}public class Program
{public static void Main(){MyBaseClass myObj = new MyBaseClass();// myObj.MyField = 10; // 错误:无法访问 protected internal 字段// myObj.MyMethod(); // 错误:无法调用 protected internal 方法MyDerivedClass derivedObj = new MyDerivedClass();derivedObj.AccessBaseMembers(); // 在派生类外部访问 protected internal 成员}
}

在上面的示例中,MyBaseClass 类定义了一个 protected internal 字段 MyField 和一个 protected internal 方法 MyMethod()。这些成员可以在同一程序集内的任何类中进行访问,以及在派生类中进行访问,无论是否在同一程序集内。然而,对于不在同一程序集内且不是派生类的代码是不可见的。


这些访问修饰符可以帮助我们控制类成员的可见性和访问级别,以满足设计需求并提供适当的封装和封装性。

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

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

相关文章

kotlin中使用myibatis-plus的lambdaQuery的问题

kotlin中使用myibatis-plus的lambdaQuery的问题 代码:lambdaQuery().eq(User::username, username).one()报错:org.apache.ibatis.reflection.ReflectionException: Error parsing property name register$lambda$0. Didnt start with is, get or set.解…

#Linux(Samba安装)

(一)发行版:Ubuntu16.04.7 (二)记录: (1)键入命令安装Samba sudo apt-get install samba (2)修改samba配置文件 //打开配置文件 sudo vi /etc/samba/smb.…

Java基础-常用类

文章目录 1.Math类2.System类1.exit代码 结果2.arraycopy参数解释代码结果 3.currentTimeMillens代码结果 3.大数处理方案基本介绍BigInteger类介绍代码结果 BigDecimal类介绍代码结果 4.日期类对于IDEA类图中的属性![image-20240101190844530](https://img-blog.csdnimg.cn/im…

HJ10 字符个数统计HJ11 数字颠倒HJ12 字符串反转

HJ10 字符个数统计 字符个数统计_牛客题霸_牛客网 题目分析 这个问题可以通过维护一个字符出现频率的数组来解决。考虑到 ASCII 码的范围是 0~127,我们可以创建一个长度为 128 的布尔数组(或者使用位操作优化空间),用来标记某个…

深度学习,CRNN+CTC和Attention OCR你更青睐哪一种?

深度学习在OCR领域的应用已经取得了瞩目的成果,而选择合适的算法对于提升OCR的识别准确率至关重要。在众多算法中,CRNN和Attention OCR犹如两颗璀璨的明珠,备受瞩目。 CRNN,这位结合了卷积神经网络(CNN)和…

电子电器架构 —— 诊断数据DTC具体故障类型篇

电子电器架构 —— 诊断数据DTC具体故障类型篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝…

Spark Stage

Spark Stage 什么是Stage Spark中的一个Stage只不过是物理执行计划其中的一个步骤,它是物理执行计划的一个执行单元。一个Job会被拆分为多组Task,每组任务被称为一个Stage,可以简单理解为MapReduce里面的Map Stage, Reduce Stag…

Unity 中 苹果眼镜开发入口

1. 文档介绍了Unity对Apple新操作系统visionOS的支持。 2. Unity提供了完善的文档、模板和支持,帮助开发者快速为visionOS开发应用。 3. Unity的跨平台框架AR Foundation和XR Interaction Toolkit可以帮助现有移动和XR应用无缝迁移到visionOS。 4. 在visionOS上,可以利用Uni…

kafka(三)——librdkafka编译与使用(c++)

linux下编译 源码下载 git clone https://github.com/edenhill/librdkafka配置、编译和安装 # 进入目录 cd librdkafka/# 配置 ./configure# 编译 make# 安装 make install头文件和库目录 # 头文件 /usr/local/include/librdkafka rdkafkacpp.h rdkafka.h rdkafka_mock.h #…

LLM漫谈(五)| 从q star视角解密OpenAI 2027年实现AGI计划

最近,网上疯传OpenAI2027年关于AGI的计划。在本文,我们将针对部分细节以第一人称进行分享。​ 摘要:OpenAI于2022年8月开始训练一个125万亿参数的多模态模型。第一个阶段是Arrakis,也叫Q*,该模型于2023年12月完成训练&…

vue3+threejs新手从零开发卡牌游戏(十一):添加简单的手牌上场逻辑

首先优化之前的战域相关代码&#xff0c;主要是将战域分成两部分&#xff0c;上方是对方战域&#xff0c;下方是己方战域&#xff0c;然后修改了战域中格子的名称&#xff0c;方便后续不同手牌上场的逻辑区分&#xff1a; game/site/index.vue完整代码如下&#xff1a; <!…

【WEEK4】 【DAY4】AJAX第一部分【中文版】

【WEEK4】 【DAY4】AJAX第一部分【中文版】 2024.3.21 Thursday 目录 8.AJAX8.1.简介8.2.伪造ajax8.2.1.新建module&#xff1a;springmvc-06-ajax8.2.2.添加web支持&#xff0c;导入pom依赖8.2.2.1.修改web.xml8.2.2.2.新建jsp文件夹 8.2.3.新建applicationContext.xml8.2.4.…

快速入门Kotlin②控制流函数

控制流 if if是一个表达式&#xff0c;可以用于条件判断和控制流。 fun main() {// 传统用法val a 1val b 2var max aif (a < b) max b// With elsevar max2: Intif (a > b) {max2 a} else {max2 b}// 作为表达式val max3 if (a > b) a else b } when whe…

蓝桥杯刷题_day2

文章目录 DAY2杨辉三角查找整数数列特征字母图形(未通过全部样例) DAY2 杨辉三角 【题目描述】 杨辉三角形又称Pascal三角形&#xff0c;它的第i1行是(ab)i的展开式的系数。它的一个重要性质是&#xff1a;三角形中的每个数字等于它两肩上的数字相加。 下面给出了杨辉三角形的…

2024智能短信营销推广系统使用攻略

智能短信营销推广系统以其精准、高效的特点&#xff0c;成为企业与消费者建立联系的重要桥梁。云衔科技凭借其先进的技术和专业的服务&#xff0c;为企业提供了一套完善的智能短信营销推广系统解决方案&#xff0c;让企业在短时间内实现大规模、个性化的短信营销活动。 云衔科…

01---java面试八股文——mybatis-------10题

1、什么是MyBatis Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql&#xff0c…

数据结构与集合(一)

当我们谈论数据结构时&#xff0c;我们实际上在讨论一种组织和管理数据的方式。数据结构是计算机科学中非常重要的一部分&#xff0c;它为我们提供了存储、检索和操作数据的方法。在数据结构中&#xff0c;链表是一种基本且常用的数据结构&#xff0c;它由一系列节点组成&#…

【Word自动化办公】使用python-docx对Word进行操作

目录 一、环境安装 二、文档各组成结构获取 2.1 组成结构讲解 2.2 段落run对象的切分标准 三、获取整篇文档内容 四、写入指定样式的数据 4.1 通过add_paragraph与add_run参数添加样式 4.2 单独设置文本样式 五、添加标题 六、换行符&换页符 七、添加图片数据 …

Go 版本 Etcd 客户端操作 Etcd(附完整 Demo)

Etcd 相关参考资料 Etcd 的介绍与使用&#xff1a;Etcd 介绍与使用&#xff08;入门篇&#xff09;-CSDN博客 Etcd Raft 协议&#xff1a;Etcd Raft 协议&#xff08;进阶篇&#xff09;-CSDN博客 本文诣在使用 Go 客户端操作 Etcd&#xff0c;并实现元数据的写入&#xff0…

迷宫(一)(DFS BFS)

//新生训练 #include <bits/stdc.h> using namespace std; int n, m; bool f; char mp[15][15]; int vis[15][15]; int dir[4][2] {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; bool in(int x, int y) {return 0 < x && x < n && 0 < y && y …