首先:类成员的访问级别是以类的访问级别为上限的!

也就是类的访问级别低时,类成员的访问级别高也无法突破类的访问级别

public级别,作用域是这个解决方案()

internal级别,作用域是整个装配集(Assembly)

protected级别,作用域是整个解决方案()中以它自己的类为基类以及它的派生类

private级别,作用域是它自己的类内部(class)

以下的例子中把人可以操作的和人不可以操作的通过修饰类型进行划分(人可以操作的有加油加速这种动作,而人不能凭借意念随便修改发动机转速等)

  1. public class Vehicle
  2. {

封装的字段,属性和函数:(这些都不允许随便被赋值,直接用private封装,用只读属性来调用现实)

  1. protected int _rpm;// 发动机转速,也应该封装成属性,但是为了演示protected的效果我把他写成protected修饰的字段,protected一般是给方法用的,比如下面的Burn函数。
  2. private int _fuel;//油量
  3. private int _speed//速度
  4. {
  5. get{ return _rpm / 100;}
  6. }
  1. //耗油(发动机的事情),我既不想把Burn方法暴露给外界引发错误调用,又想让我的子类Car访问,使用protected
  2. protected void Burn(int a)
  3. {
  4. _fuel = _fuel - a;
  5. }

/暴露出来的函数:/

  1. //加油(人的事情)
  2. public void Refuel()
  3. {
  4. _fuel = 100;
  5. }
  1. //加速_汽车通用_1000(人的事情)
  2. public virtual void Accelerate()
  3. {
  4. Burn(1);
  5. _rpm += 1000;
  6. }
  1. //看速度表(人的事情)
  2. public void ShowSpeed()
  3. {
  4. Console.WriteLine(Speed);
  5. }
  1. //看油表(人的事情)
  2. public void ShowFeul()
  3. {
  4. Console.WriteLine(_fuel);
  5. }
  1. }

小轿车类

  1. public class Car : Vehicle
  2. {
  3. //加速_轿车专用_1500(人的事情)
  4. public override void Accelerate()
  5. {
  6. Burn(1);
  7. _rpm += 1500;
  8. }
  9. }

跑车类

  1. public class RaceCar : Car
  2. {
  3. //涡轮增压_跑车特有_3000(人的事情)
  4. public void TurBoAccelerate()
  5. {
  6. Burn(2);
  7. _rpm += 3000;
  8. }
  9. }

公交车类

这里又有protected的一个特性,只有在通过派生类类型发生访问时,基类的受保护成员在派生类中才是可访问的

换句话说,就是以出现protected的类为基类,派生出的类,在这个类内部才可以用protected修饰的字段,属性和方法。

  1. public class Bus : Vehicle
  2. {
  3. public void SlowAccelerate()
  4. {
  5. Burn(1);
  6. _rpm += 500;//这里可以使用_rpm
  7. }
  8. static void Main(string[] args)
  9. {
  10. Bus bus = new Bus();
  11. bus._rpm = 10000;‘//这里可以使用_rpm
  12. bus.Burn(1);//这里可以使用Burn()
  13. }
  14. }

但是如果在其他类中,比如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Bus bus = new Bus();
  6. bus.Burn(1);//这句话无法编译通过
  7. bus._rpm = 10000;//这句话无法编译通过
  8. }
  9. }

虽然还是派生类的实例对象,但是不在派生类中,所以protected修饰的字段和属性是无法执行的。

C# 类中访问修饰符的优先级与用法(public, internal, protected, private)的更多相关文章

  1. C# 中访问修饰符

    1.public 完全公开的,公共的 2. private 私有的,只能在当前类的内部访问, 不可修饰类 3.protected 受保护的,只能在当前类的内部以及其子类中访问,不能用来修饰类 4.in ...

  2. Java中访问修饰符public、private、protecte、default

    Java中访问修饰符public.private.protecte.default的意义讲解:public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”.被其修饰的类.属性以及方法不 仅 ...

  3. 12、类成员访问修饰符public/private/producted/readonly

    1.private 类的私有成员 private 类的私有成员,只能在内部访问,在外部访问不到,无法被继承,我们可以将不需要被外部修改的定义为私有的 私有成员,只能在内部访问,在外部访问不到 priv ...

  4. 【转】C# 中访问修饰符

    用通过代码:  类内部 using System;class Mod{    void defaultMethod()    {        Console.WriteLine("this ...

  5. C#类的访问修饰符

    默认情况下,类声明为内部的,即只有当前工程中的代码才能访问它.可以用internal访问修饰符关键字显式指定,但这不是必须的,类在定义时默认为此类型的类.但是C# 方法默认访问级别: private. ...

  6. java类的访问修饰符

    1.java中外部类的访问修饰符有如下四种: public,默认,abstract,final // public,默认,abstract,final. public class Test1 {} c ...

  7. java中访问修饰符public,private,protected,friendly的作用域

    在修饰的元素上没有写任何的访问修饰符,则表示friendly. 作用域 当前类 同一包中 子孙类 其他包中 public √ √ √ √ protected √ √ √ × private √ x x ...

  8. Java——类的访问修饰符

    1.java中外部类的访问修饰符有如下四种: public,默认,abstract,final // public,默认,abstract,final. public class Test1 {} c ...

  9. 类的访问修饰符_C#

    访问控制修饰符: 访问控制修饰符 类内部 子类 程序集内 程序集外 Default √ Public √ √ √ √ Private √ Internal √ √ √ Protected √ √ Pr ...

随机推荐

  1. WPF textbox 鼠标滚动更新日期,text文本值更改

    /// <summary> /// 选择日期 /// </summary> private void RQTxt_MouseWheel(object sender, Mouse ...

  2. eclipse启动Failed to load the JNI shared library

    由于安装jdk安装了多个版本,用其他开发工具,某天再打开eclipse时弹出“Failed to load the JNI shared library jvm.dll” 原因:eclipse的版本与 ...

  3. list集合获取相同以及不同的对象

    List<StyleMenuModule> list1 = new ArrayList<>(); StyleMenuModule s1 = new StyleMenuModul ...

  4. SpringCloud---分布式服务跟踪---Spring Cloud Sleuth

    1.概述 1.1 为什么要用到服务跟踪? 随着业务的发展,系统规模也会变得越来越大,各服务之间的调用关系也变得越来越错综复杂: 通常一个由客户端发起的请求   在后端系统中会经过多个不同的微服务调用  ...

  5. idea创建Maven项目后启动报404

    这块的配置是

  6. Attribute 实现Aop

    1.先定义一个 拦截属性 AopAttribute using System; using System.Collections.Generic; using System.Linq; using S ...

  7. TxtUtil

    /** *包名:cn.yufu.utils *描述:package cn.yufu.utils; */ package cn.yufu.utils; import java.io.BufferedRe ...

  8. 【Flutter学习】基本组件之基本列表ListView组件

    一,概述 列表是前端最常见的需求. 在flutter中,用ListView来显示列表页,支持垂直和水平方向展示,通过一个属性我们就可以控制其方向,列别有以下分类 水平列表 垂直列表 数据量非常大的列表 ...

  9. php编译安装phalcon框架 - centos

    使用官方的文档安装方式会报错,进行了一些实验,终于安装成功! 安装phalcon前提是需要安装php的pdo,如果使用mysql 需要安装 pdo_mysql 先看下git的版本号git --vers ...

  10. (转)Linux下使用system()函数一定要谨慎

    转:http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函 ...