c# 访问修饰符

article/2025/9/9 15:07:16

  C# 中提供了 6 种访问修饰符:public、private、protected、internal、protected internal、private protected。
  访问修饰符 在所有的类型和类型成员中都具有可访问性级别,用于控制是否可以从程序集或其他程序集中对其他代码的访问控制。

访问修饰符描述
public同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。
private只有同一 classstruct 中的代码可以访问该类型或成员。
protected只有同一 class 或者从该 class 派生的 class 中的代码可以访问该类型或成员。
internal同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。
protected internal该类型或成员可由对其进行声明的程序集或另一程序集中的派生 class 中的任何代码访问。
private protected只有在其声明程序集内,通过相同 class 中的代码或派生自该 class 的类型,才能访问类型或成员。

Demo 准备

  下面我创建了一个叫做 AccessControl 的控制台项目,并创建两个类文件:DemoClassOne.csDemoClassTwo.cs

解决方案

public

  在默认情况下,方法的修饰符为 private (类的修饰符为 public ),如下代码中,在 DemoClassOne.cs 类中添加了 3 个方法,test1()test2() 为相同的修饰类型( private ),test3()public 类型,可以被所有的引用所访问。

class DemoClassOne
{static void test1(){}private static void test2(){}public static void test3(){}
}

  那么在 Program.cs 中调用这三个方法就会出现test1()test2() 不可访问的错误,而 test3() 就没有问题。方法修饰为 public 除了在方法的类里面可以访问,在其它类中也是可以访问的。

class Program
{static void Main(string[] args){DemoClassOne.test1(); // 不可访问,因为它具有一定的保护级别DemoClassOne.test2(); // 不可访问,因为它具有一定的保护级别DemoClassOne.test3(); // 可以正常访问}
}

  总结: public 修饰的方法在同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。

private

  由上面 public 的案例可以知道,private 在外部类中是无法访问的,但是在方法的所在类中却是可以访问的。private 只有在声明它们的类和结构体中才是可访问的

class DemoClassOne
{static void test1(){}private static void test2(){}public static void test3(){test1(); // 在当前类中可以访问默认修饰符的方法test2(); // 在当前类中可以访问 private 修饰符的方法test3(); // 在当前类中可以访问 public 饰符的方法,且可以方法递归调用}
}

  总结: private 修饰的方法只有同一 classstruct 中的代码可以访问该类型或成员。

protected

  在 DemoClassOne 中创建四个方法:test1()、test2()、test3()、test4()。如下代码所示。

class DemoClassOne
{static void test1(){}private static void test2(){}public static void test3(){}protected static void test4(){}
}

  在 DemoClassTwo.cs 中的类 DemoClassTwo 继承 DemoClassOne ,并创建方法 test5(),键入如下代码 。由案例可看出,protectedpublic 修饰的方法在子类中可以访问,其他的不能访问。

class DemoClassTwo : DemoClassOne
{public static void test5(){DemoClassOne.test1(); // 不可访问,因为它具有一定的保护级别DemoClassOne.test2(); // 不可访问,因为它具有一定的保护级别test3(); // 子类访问父类 public 修饰的方法test4(); // 子类访问父类 protected 修饰的方法}
}

  同样的,在 Program.cs 中调用 DemoClassOne 中的四个方法,仅有 public 修饰的方法能够有访问权限。

class Program
{static void Main(string[] args){DemoClassOne.test1(); // 不可访问,因为它具有一定的保护级别DemoClassOne.test2(); // 不可访问,因为它具有一定的保护级别DemoClassOne.test3(); // 子类访问父类 public 修饰的方法DemoClassOne.test4(); // 不可访问,因为它具有一定的保护级别}
}

  总结: protected 修饰的方法只有同一 class 或者从该 class 派生的 class 中的代码可以访问该类型或成员。

internal

  在 DemoClassOne.cs 中将类 DemoClassOne 修饰符更改为 internal 添加方法public修饰的方法 test1()。

namespace AccessControl
{internal class DemoClassOne{static void test1(){}}
}

  而后在 Program.cs 中调用 DemoClassOne 中的方法会报错。

class Program
{static void Main(string[] args){DemoClassOne.test1(); // 不可访问,因为它具有一定的保护级别}
}

  那么,我把 DemoClassOne 修饰符 internal 移动到方法 test1() 上,此时方法 test1() 在 AccessControl 项目中均可以访问的到。

class DemoClassOne
{internal static void test1(){}
}
class Program
{static void Main(string[] args){DemoClassOne.test1(); // 可访问}
}

  接下来,继续在解决方案里面创建一个新的类库项目 AccessControl2 ,并创建一个类 AccessControlDemo ,键入如下代码。

新建类库

namespace AccessControl2
{public class AccessControlDemo{internal static void testDemo(){}public static void testDemo2(){}}
}

  此时我们接着回到 AccessControl 项目的 Program.cs 中调用 AccessControl2 中的方法 testDemo() ,此时会发现,并不能访问到这个方法,说明 internal 修饰的方法仅允许在当前项目中使用。

class Program
{static void Main(string[] args){AccessControlDemo.testDemo(); // 不可访问,因为它具有一定的保护级别AccessControlDemo.testDemo2(); // public 修饰符的方法可以访问}
}

  总结: protected 修饰的方法或成员,在同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。。

protected internal

  看到 protected internal 修饰符的名称就知道,这是 protectedinternal 修饰符的总合,兼并它们两者的特性。也就是说自己与派生类可以访问,同时同一个程序集也可以访问。如下案例,在 AccessControl2 项目的 AccessControlDemo 类中添加了如下代码。

namespace AccessControl2
{public class AccessControlDemo{internal static void testDemo(){}public static void testDemo2(){}protected internal static void testDemo3(){}}
}

  在 AccessControl 项目中的 Main 方法中可以看到只能访问 public 修饰的方法,另外两个方法不可访问。

class Program
{static void Main(string[] args){AccessControlDemo.testDemo(); // 不可访问,因为它具有一定的保护级别AccessControlDemo.testDemo2(); // public 修饰符的方法可以访问AccessControlDemo.testDemo3(); // 不可访问,因为它具有一定的保护级别}
}

  在 AccessControl 项目中让类 DemoClassOne 继承 AccessControlDemo ,而后访问 AccessControlDemo 类中的方法,此时发现 testDemo2()testDemo3() 两个方法可以访问,testDemo() 方法不可访问。

using AccessControl2;namespace AccessControl
{class DemoClassOne: AccessControlDemo{internal static void test1(){AccessControlDemo.testDemo(); // 不可访问,因为它具有一定的保护级别AccessControlDemo.testDemo2(); // public 修饰符的方法可以访问AccessControlDemo.testDemo3(); // protected internal 修饰的方法在派生类中可访问}}
}

  总结: protected internal 修饰的类型或成员可由对其进行声明的程序集或另一程序集中的派生 class 中的任何代码访问。

private protected

  同样的,private protected 也就是 prvateprotected 的交集,其具有 protected 的访问特性(在派生类中可访问),但将范围约束在了当前项目,而在其他项目中的派生类是不可以访问的。下面代码演示。
  在 AccessControl2 项目中在创建一个类 AccessControlDemo2 ,并继承类 AccessControlDemo ,键入如下代码,发现同一项目中是的派生类是可以访问 private protected 修饰的方法的。

namespace AccessControl2
{class AccessControlDemo2 : AccessControlDemo{public static void testDemo5(){AccessControlDemo.testDemo4(); // 同一程序集中的派生类中可以访问 private protected 修饰的方法}}
}

  在 AccessControl 项目中的 DemoClassOne 类中访问 AccessControlDemo.testDemo4() 却是不可以访问的。

namespace AccessControl
{class DemoClassOne: AccessControlDemo{public static void test1(){AccessControlDemo.testDemo4(); // 不可访问,因为它具有一定的保护级别}}
}

  总结: private protected 修饰的类型或成员只有在其声明程序集内,通过相同 class 中的代码或派生自该 class 的类型,才能访问类型或成员。

直白的说明

  如果希望一个方法能够被任何程序集或者类访问,那么修饰符设置为 public
  如果希望一个方法仅仅在当前类中访问,那么修饰符设置为 private
  如果希望一个方法在仅在派生类中可以访问,包括当前程序集及其他程序集中的派生类,那么修饰符设置为 protected
  如果希望一个方法仅在当前程序集的任何位置中访问,那么修饰符设置为 internal
  如果希望一个方法在当前程序集中的任何位置中访问或者其他程序集的派生类中访问,那么修饰符设置为 protected internal
  如果希望一个方法仅在当前程序集的派生类中访问,那么修饰符设置为 private protected

最后说明: 可能这些看起来有点绕,一时没能理解这些修饰符的意思和作用范围,其实可以通过创建一个项目一个个的测试,仔细研读理论讲解,等逐步熟练后就能理清楚它们的关系。这里贴上官方的讲解: 访问修饰符


http://chatgpt.dhexx.cn/article/IiE0bIrQ.shtml

相关文章

访问控制修饰符

定义理解 对类、变量、方法、接口的访问范围限制。一.类修饰符 1.直接声明 class 类名{ },即不加修饰符的时候 这种情况下,只可访问同一包中的类,不可访问不同包中的类。2.public,公共类的修饰符 这种情况下,既可访…

Java访问修饰符全面详细介绍

Java中有四种权限修饰符,其在同一项目中所对应的访问权限如下: 注意:默认不写即是default,而不是自己还特意加上default关键字。 Java语言有4种访问权限修饰符,下面按照权限从小到大的顺序对4种访问权限分别介绍: 1、…

Java基础:Java中四种访问修饰符

一、背景。 这篇文章主要介绍了Java中四种访问修饰符详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。放假在家里休息,闲来无事,想巩固巩固自己的基础知识…

C#的5种访问修饰符

C#的5种访问修饰符 1、public 公共的 public 允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员都可以被外部的类访问。 class Person {public string name;public int age;public void SayHello(){Console.WriteLine("大家好,我叫{0}&a…

C#访问修饰符

C#中的访问修饰符有以下六种: public:同一程序集和和引用该程序集的所有代码都可访问。public成员可访问级别由该类型本身的级别决定。private:只有同一类中的成员可以访问protected:同一类和派生类中的代码可以访问internal&…

java的四个访问修饰符_Java中的四种访问修饰符

Java中修饰符分为两种:访问修饰符和非访问修饰符。修饰符中,有一些修饰符可以既可以修饰类,也可以修饰方法,但是有一些修饰符只能修饰符方法。 今天这篇文章先介绍一下四种访问修饰符。 1、private修饰符 private表示私有的。既然…

四种访问修饰符详解

有四种访问修饰符规定了定义的属性和方法能访问的区域 private关键字 用private关键字修饰的属性和方法只能在该类的大括号内访问,出了这个类就不能被访问了。当一个子类继承一个父类的属性和方法时,若父类的属性或方法被private修饰,那么子…

Java中的访问修饰符

JAVA中的访问修饰符,主要用于设置类、属性、方法的访问级别,有以下四种: 在编写代码的时候,如果没有特殊的考虑,建议这样使用权限: 成员变量使用private,隐藏细节构造方法使用public&#xff0…

java四种访问修饰符

访问修饰符 public,private,protected,以及不写(默认)时的区别: 定义:Java中,可以使用访问修饰符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。 分类: private : 在同一类内…

访问修饰符 [详解]

可能一下子会想到private、default、protected、public这四个,但如果问"static、abstract等是不是访问修饰符呢?" 这就不清楚了,所以下面研究前四个及再补充其他的 1、当前已知的 过一眼就行,毕竟后面会重新研究 1.1 范围从大到小排序是:public>protected>默…

四种访问修饰符

Java中修饰符分为两种:访问修饰符和非访问修饰符。修饰符中,有一些修饰符可以既可以修饰类,也可以修饰方法,但是有一些修饰符只能修饰符方法。 今天这篇文章先介绍一下四种访问修饰符。 1、private修饰符 private表示私有的。既…

JAVA的四种访问修饰符

JAVA中的访问修饰符,主要用于设置类、属性、方法的访问级别,有以下四种: 修饰符同一个类同一个包子类任何地方public(公共的)YYYYprotected(受保护的)YYYdefault(默认的)YYprivate(私有的)Y 1…

特征工程—数据无量纲化之归一化

在sklearn中使用preprocessing预处理与impute缺失值处理,两个模块进行数据预处理 数据无量纲化:将不同量纲的数据转化到同一区间,避免某一取值的数据范围太大或太小对影响计算,加快求解速度,提高精度 无量纲化包括线…

数据挖掘的步骤——降维处理前一定记得进行无量纲化处理

数据挖掘的步骤 我们使用sklearn进行虚线框内的工作(sklearn也可以进行文本特征提取)。通过分析sklearn源码,我们可以看到除训练,预测和评估以外,处理其他工作的类都实现了3个方法:fit、transform和fit_tra…

#第27篇分享:数据无量纲化(python语言:sklearn 预处理及特征工程)(3)

#数据挖掘五大流程:获取数据,数据预处理 (更改数据类型,有噪声,有缺失),特征工程 (归一化,标准化,正则化,降维),建模&…

均值归一化_数据无量纲化处理(归一化VS标准化)

常见的无量纲化处理方法主要有极值化、标准化、均值化和标准差化方法,而最常使用的是标准化方法。 标准化方法处理后的各指标均值都为0,标准差都为1,它只反映了各指标之间的相互影响,在无量纲化的同时也抹杀了各指标之间变异程度上的差异,因此,标准化方法并不适用于…

特征工程:特征预处理(无量纲化处理)

文章目录 一、解释二、归一化三、标准化★一、解释 特征预处理API sklearn.preprocessing为什么要做归一化/标准化? 无量纲化 特征的单位或者数量相差较大,这样某特征会‘绝对’最终结果,使得其他算法无法学习到其他特征。 二、归一化 将原始数据进行变换将数据映…

为什么梯度的负方向是梯度下降最快的方向

文章目录 梯度与导数的关系梯度下降算法梯度方向是上升方向一阶泰勒展开式与负梯度 梯度与导数的关系 梯度方向指向数值增长最快的方向,大小为变化率。通过这个性质也说明梯度是有方向和大小的矢量。通过梯度的定义我们发现,梯度的求解其实就是求函数偏…

数字图像处理 基于matlab、opencv计算图像的梯度方向和梯度幅值

一、图像的梯度 1、简述 图像可以被视为标量场(即二维函数)。 通过微分将标量场转换为矢量场。 梯度是一个向量,描述了在x或y方向上移动时,图像变化的速度。我们使用导数来回答这样的问题,图像梯度的大小告诉图像变化的速度,而梯度的方向告诉图像变化最…

梯度方向直方图Histogram of Oriented Gradients (HOG)

在学习HOG特征的时候,发现一片英文文章讲得浅显易懂。因此翻译在这里学习。(文中的图片均来自翻译原文) 原文链接:Histogram of Oriented Gradients 什么是特征描述子 特征描述子一张图片或者一个图片块的一种表示,通过提取有用信息并扔掉…