C#的5种访问修饰符

article/2025/9/9 15:20:37

C#的5种访问修饰符

1、public 公共的

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

class Person
{public string name;public int age;public void SayHello(){Console.WriteLine("大家好,我叫{0},今年{1}岁了。", name, age);}
}class Program
{static void Main(string[] args){Person p = new Person();p.name = "李华";p.age = 18;p.SayHello();//调用输出:大家好,我叫李华,今年18岁了。Console.ReadKey();}
}

2、private 私有的

private 允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员变量。子类也不可以访问私有的成员变量和成员函数,即使是类的实例也不能访问它的私有成员。

class Person
{//通过普通属性保护私有字段,使类的外部不能访问,却可以修改和获取。private string _name;public string Name{get { return _name; }set { _name = value; }}private int _age;public int Age{get { return _age; }set { _age = value; }}public void SayHello(){//同一个类中的函数能够访问它的私有成员变量Console.WriteLine("大家好,我叫{0},今年{1}岁了", _name, _age);}
}
class Program
{static void Main(string[] args){Person p = new Person();p.Name = "李华";p.Age = 20;p.SayHello();//调用输出:大家好,我叫李华,今年20岁了Console.ReadKey();}
}

3、protected 受保护的

protected 只允许同一个类中的函数访问它的受保护成员,还有它的子类访问它的成员变量和成员函数,这样有助于实现继承。

class Person
{private string _name;public string Name{get { return _name; }set { _name = value; }}protected string idCardNo;//受保护的成员变量public virtual void SayHello(){Console.WriteLine("大家好,我是人类");}
}
class Student:Person
{public Student(){//随机一个序列编号,赋值给父类受保护的成员变量idCardNo = Guid.NewGuid().ToString();}public override void SayHello(){//子类不能访问父类私有变量成员,但是可以访问父类受保护成员。Console.WriteLine("大家好,我叫{0},我的身份证号码:{1} 。", Name, idCardNo);}
}class Program
{static void Main(string[] args){Person ps = new Student();ps.Name = "李华";ps.SayHello();//调用输出:大家好,我叫李华,我的身份证号码:4208f78b-253b-4592-b554-08735b3799b0 。Console.ReadKey();}
}

4、internal 内部访问

internal 允许在同一个项目中的类访问。在同一项目中 internal 和 public 的权限是一致的。internal 不能被其他项目访问,但 public 添加引用后就可以被访问。

被引用的项目代码:

using System;namespace _04internal
{public class Person{private string _name;public string Name{get { return _name; }set { _name = value; }}//只能同一个类和子类访问,包括其他项目的子类访问protected string idCardNo;public virtual void SayHello(){Console.WriteLine("大家好,我是人类");}}//只能在当前项目(命名空间)中被访问internal class Teacher : Person{public Teacher(){idCardNo = Guid.NewGuid().ToString();}public override void SayHello(){Console.WriteLine("老师说:我叫{0},我的身份证号码:{1} 。", Name, idCardNo);}}//默认访问修饰符 internalclass Program{static void Main(string[] args){Person pt = new Teacher();pt.Name = "灵诗";pt.SayHello();//调用输出:老师说:我叫灵诗,我的身份证号码:f5f333d2-2017-4ff1-92fa-187f94f0b927 。Console.ReadKey();}}
}

在Visual Studio 中如何引用另一个项目:

1、鼠标右键本项目的【引用】,鼠标左键选择【添加引用】选项。
在这里插入图片描述
2、点击【项目】,勾选要引用的项目,之后点击确定即可。
在这里插入图片描述
添加引用后,另一个项目代码:

using _04internal;//添加引用后,还要用 using 引入命名空间
using System;namespace test
{//默认访问修饰符 internal ,继承其他命名空间下非internal的类class Student:Person{public Student(string name){this.Name = name;//可以访问不同命名空间下父类受保护的成员变量idCardNo = Guid.NewGuid().ToString();}public override void SayHello(){Console.WriteLine("学生说:我叫{0},我的身份证号码:{1} 。", Name, idCardNo);}}class Program{static void Main(string[] args){Person ps = new Student("李华");ps.SayHello();//调用输出:学生说:我叫李华,我的身份证号码:3968bfb9-2bcc-47c5-bea4-283c3fc9ea6d 。Console.ReadKey();}}
}

5、protected internal (internal protected)

protected internal 允许在同一个项目中的类访问,还允许其他项目中子类访问其成员变量和成员函数。

被引用的项目代码:

using System;namespace _05protectedinternal
{public class Person{protected internal string _name;//受保护内部访问字段internal string _idCardNo;//内部访问字段public Person(string name){_name = name;_idCardNo = Guid.NewGuid().ToString();}public virtual void SayHello(){Console.WriteLine("大家好,我叫{0} ,身份证号码:{1}.", _name, _idCardNo);}}class Program{static void Main(string[] args){Person p = new Person("李华");p.SayHello();//调用输出:大家好,我叫李华 ,身份证号码:6bd42c42-4278-4541-a5aa-c1a8512c58af.Console.ReadKey();}}
}

添加引用后,另一个项目代码:

using _05protectedinternal;//添加引用后,还要用 using
using System;namespace test
{class Student:Person{public Student(string name):base(name){}public override void SayHello(){//只能访问另一个项目父类受保护内部成员,不能访问父类内部成员,因此获取不到身份证号码Console.WriteLine("大家好,我叫{0}.", _name);}}class Program{static void Main(string[] args){Person ps = new Student("李华");ps.SayHello();//调用输出:大家好,我叫李华.Console.ReadKey();}}
}
总结:
1、private 只允许在本项目本类中被访问。
2、proteced 只允许在当前类内部以及该类的子类中访问。
3、类的访问修饰符只有 internal(默认)和 public。
4、internal 只能在当前项目中访问。在同一个项目中与 public 的权限一致。
5、protected internal 可以访问跨项目父类的成员变量和函数。两个修饰符位置随意。

因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。


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

相关文章

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 什么是特征描述子 特征描述子一张图片或者一个图片块的一种表示,通过提取有用信息并扔掉…

为什么梯度方向一定是函数增大的方向

全微分的定义 如果函数在区域D内各点处都可微分,那么称这个函数在D内可微分。 以上就是为了解释一下为啥 f ( x Δ x , y Δ y ) − f ( x , y ) f x ′ f(x\Delta x, y\Delta y)-f(x, y)f_{x}^{} f(xΔx,yΔy)−f(x,y)fx′​△x f y ′ f_{y}^{} fy′​△y …

为什么沿梯度方向,函数变化最快???

很多时候,我们时间有限,对一些知识只能不求甚解,但这这些不求甚解的知识又会很困扰我们,总想着原理是啥,为啥这样做。就比如我们学梯度下降时,都知道梯度下降是机器学习、深度学习的核心优化算法&#xff0…

机器学习算法篇:从为什么梯度方向是函数变化率最快方向详谈梯度下降算法

前言:若需获取本文全部的手书版原稿资料,扫码关注公众号,回复: 梯度下降法 即可获取。 原创不易,转载请告知并注明出处!扫码关注公众号【机器学习与自然语言处理】,定期发布知识图谱,自然语言处…

⚡可行梯度方向法⚡(Feasible Gradient Direction Method ,FGDM)

⚡最近很烦⚡ 有一阵子没更新了,感觉整个暑假被忽悠了,六月份找Boss指明了一个Direction,然后整个暑假都在忙于补充Proposal相关的Knowledge,但是,被忽悠局局长Boss给忽悠了(谁人能明白其中的难受&#xff…