面向对象(C# )
面向对象(C# )
文章目录
- 面向对象(C# )
- ref 和 out
- 传值调用和引用调用
- ref 和 out 的使用
- ref 和 out 的区别
- 结构体
- 垃圾回收GC
- 封装
- 成员属性
- 索引器
- 静态成员
- 静态类
- 静态构造函数
- 拓展方法
- 运算符重载
- 内部类和分布类
- 继承
- 里氏替换
- 继承中的构造函数
- 装箱拆箱
- 密封类
- 多态
- `virtual`、`override`、`base`
- 抽象类
- 抽象方法(纯虚函数)
- 接口
- 密封方法
ref 和 out
传值调用和引用调用
void ChangeValue(int value)
{a = 3;
}
// 主函数
int a = 11;
ChangeValue(a);
Console.WriteLine(a);
输出:11
传值调用中形参为一个新的临时变量,赋值由实参拷贝而来,只是赋予了与实参一样的值所以在函数体内部修改并不会影响实参

void Changevalue(int[] array)
{array[0] = 22;
}
// 主函数
int[] a = {1, 2, 3};
Changevalue(a);
Console.WriteLine(a[0]);
输出:22
引用调用时,形参拷贝的是实参的地址,二者指向同一个堆空间,所以形参改变会对实参造成影响

void Changevalue(int[] array)
{array = new int[] {10, 20, 30};
}
// 主函数
int[] a = {1, 2, 3};
Changevalue(a);
Console.WriteLine(a[0]);
输出:1
单纯的记忆传值调用和引用调用可以改变和不能改变仍然是不太正确的,需要从栈和堆数据存储的角度去分析才行

ref 和 out 的使用
void ChangeValue1(ref int value)
{a = 3;
}
void Changevalue2(ref int[] array)
{array = new int[] {10, 20, 30};
}
// 主函数
int a = 11;
ChangeValue1(ref a);
Console.WriteLine(a);int[] a = {1, 2, 3};
Changevalue2(ref a);
Console.WriteLine(a[0]);
输出:3、10
out类似
ref 和 out 的区别
- ref 传入的变量必须初始化,但是在函数体内部可以不去赋值
- out传入的变量可以不需要初始化,但是在函数体内部必须赋值
结构体
-
结构体内部不能直接进行初始化
-
结构体的存储方式:
储存结构体中不同类型的数据结构时,会以4个字节为一个单元进行存储,当四个字节容纳不下下一个类型的数据时,编译器会将这个单元中没有存放数据的剩余内存空下,转而存放在下一个单元中

-
结构体内部不能定义自身
定义自身这个结构体会导致循环
-
结构体不能定义无参构造函数
垃圾回收GC
-
垃圾回收通过遍历堆上被动态分配的对象,识别哪些对象是垃圾选择释放,垃圾是没有被任何变量或对象引用的内容
-
GC只负责堆上的垃圾回收,栈上的内存是系统自动管理的,会自动分配和释放
-
垃圾回收机制是一种算法(分代算法)
当第 n(0、1、2)代内存满的时候就触发垃圾回收释放内存,垃圾回收开始时默认堆中所有都是垃圾,从根出发检查引用对象,对可达对象进行标记,未标记的结束不可达对象为垃圾。然后释放未标记对象,搬迁可达对象到下一代
-
大对象(83kb以上)总是被认为是第二代内存,目的是减少搬迁的性能损耗

封装
成员属性
-
作用:保护成员变量,为成员属性的获取和赋值添加逻辑处理,解决3p的局限性:get、set方法
-
访问权限:
默认与声明属性权限相同
自定义权限需要低于属性权限,get \ set 不能同时低于属性权限
-
格式:
public string Name {get // 默认继承public{return name; // 获取}set{name = value;// value关键字用来表示外部传入的值} } -
自动属性
public float Heigt // 相当于一个成员属性封装了getset的方法 {get; // 自动获得set; // 自动赋值 }
索引器
-
格式:
class Person {private Person[] freinds;// 范围权限 返回值 this[参数类型 参数名, 参数类型 参数名, …]public Person this[int index]{get{return freinds[index];}set{freinds[index] = value;}} } -
索引器可以重载
静态成员
-
程序开始运行时就会为静态成员分配内存空间,静态成员直到程序结束才会被释放。所有静态成员拥有自己唯一的一块内存区域,在任何地方使用这块内存都会改变
-
静态成员方法:
静态函数不能使用非静态成员,因为非静态成员需要对象实例化才有内存分配,所以静态函数只能使用静态成员
-
常量和静态变量的区别
相同:都可以直接通过类名加.调用
不同:const常量不能被修改,必须赋初值
静态类
- 作用:常用静态成员写在静态类中方便调用,静态类不能被实例化更能体现工具类的唯一性
静态构造函数
-
特点:
静态类和普通类都可以使用,不能使用访问修饰符,不能有参数
只会自动调用一次,当第一次使用这个类时
拓展方法
-
作用:为现有的非静态类添加新的方法,不需要在类中重新添加方法(我理解就是直接写了一个函数在原本的类中,只是写的方式不同)
-
特点:
一定写在静态类中,一定是静态函数
-
格式:
static class test // 写在静态类中 {// 访问修饰符 static 返回值 函数名(this 拓展的类型 参数名, 参数类型 参数名, …)public static void display(this int value) // 为int拓展一个方法{Console.WriteLine("int拓展方法");} }
运算符重载
-
作用:让自定义类和结构体对象可以进行运算
-
注意:
一定是静态的公共的方法
不能使用ref 和 out
参数至少有一个是自身类型
条件运算符需要成对出现,例如:
== 和 !=、> 和 <参数个数根据运算符规则定
-
格式:
class Point {int x, y;public Point(int x, int y){this.x = x;this.y = y;}// public static 返回类型 opeartor 重载运算符(参数列表)public static Point operator+(Point p1, Point p2){return new Point(p1.x + p2.x, p1.y + p2.y);} }
内部类和分布类
-
内部类
-
在一个类中再申明一个类,表示类之间的层级关系,注意访问修饰符
-
格式:
class Person {public int age;public class Arm // 公共的才能在外部访问{public int size;} }// 主函数 Person.Arm arm = new Person.Arm();
-
-
分布类
-
作用:把一个类分成几部分申明,增加程序拓展性
-
关键字:
partial -
格式:
partial class Student {public bool sex;public string name; }partial class Student // 分别申明 {public int number;public void Speak(string s){Console.WriteLine(s);} }
-
继承
里氏替换
-
作用:父类对象装载子类对象
-
is和asGameObject p = new Player(); // Player是GameObject的子类if (p is Player) // 判断对象是否是执行类对象,返回bool {Console.WriteLine("是Player类"); }Player p2 = p as Player; // 转换成功返回对象,失败返回null
继承中的构造函数
- 创建子类对象时会先调用父类的构造函数,后调用子类的构造函数
- 子类默认使用父类的无参构造函数,所以需要注意父类的构造函数是否有被有参构造顶掉。或者使用base关键字指定调用父类有参构造
装箱拆箱
-
装箱:把值类型用引用类型存储,栈内存迁移到堆内存中
-
拆箱:把引用类型用值类型存储,堆内存迁移到栈内存中
-
例子:
object obj = 1; // 装箱 int i = (int)obj; // 拆箱
密封类
-
作用:让类无法再被继承
-
例子:
sealed class Father // 无法再被继承 { }
多态
virtual、override、base
- 作用:让继承同一父类的子类,在执行相同方法时有不同的表现
- virtual(虚函数)、override(重写)、base(父类)
抽象类
- 抽象是把多个事物相同的内容抽取出来,但是自己本身是没有实际实体的,(水果没有实体,苹果才是实体)
- 不能被实例化,抽象类必须重写其中的抽象方法
- 仍然可以用父类容器装载子类对象
抽象方法(纯虚函数)
-
只能在抽象类中申明
-
没有方法体
-
不能是私有的,因为子类需要重写
-
继承后必须重写(override)抽象方法
接口
-
一个类可以继承多个接口,接口用于描述有共同方法或属性的类,成员方法没有方法体,只是定义共同需要的方法至少需要什么,不能包含成员变量,可以有方法、属性、索引器、事件
-
默认修饰符是public,因为需要被继承后的类重写所以不能设置私有
-
接口也不能被实例化,但是可以做父类容器装载子类对象
-
代码
interface IPereson // 命名规则前缀I { }
密封方法
- 作用:让虚方法或抽象方法之后不能再被重写
- 关键字:sealed
相关文章:
面向对象(C# )
面向对象(C# ) 文章目录 面向对象(C# )ref 和 out传值调用和引用调用ref 和 out 的使用ref 和 out 的区别 结构体垃圾回收GC封装成员属性索引器静态成员静态类静态构造函数拓展方法运算符重载内部类和分布类 继承里氏替换继承中的…...
Lombok:@Cleanup资源释放利器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、Cleanup介绍 二、使用示例 三、价值阐述 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、Cleanup介绍 Cleanup可以自动管理输…...
IoT 物联网场景中 LoRa + 蓝牙Bluetooth 室内场馆高精定位技术全面解析
基于LoRa蓝牙的室内场景定位技术,蓝牙主要负责位置服务,LoRa主要负责数据传输。 01 LoRa和蓝牙技术 LoRa全称 “Long Rang”,是一种成熟的基于扩频技术的低功耗、超长距离的LPWAN无线通信技术。LoRa主要采用的是窄带扩频技术,抗干…...
SpringCloudAlibaba系列之Seata实战
目录 环境准备 1.下载seata安装包 2.修改配置文件 3.准备seata所需配置文件 4.初始化seata所需数据库 5.运行seata 服务准备 分布式事务测试 环境准备 1.下载seata安装包 Seata-Server下载 | Apache Seata 本地环境我们选择稳定版的二进制下载。 下载之后解压到指定目录…...
蓝桥杯day5刷题日记-分巧克力-天干地支-求和
P8647 [蓝桥杯 2017 省 AB] 分巧克力 思路:二分查找 #include <iostream> using namespace std; int n,k; int h[100010],w[100010];bool check(int x) {int sum0;for(int i0;i<n;i){sum(h[i]/x)*(w[i]/x);if(sum>k) return true;}return false; }int…...
C++ ostringstream用法详解
std::ostringstream 是 C 标准库中的一个输出字符串流类,它可以用于将各种数据类型转换为字符串,并且支持格式控制和字符串拼接操作。 目录 1. 头文件 2. 基本用法 3. 将各种数据类型转换为字符串 4. 格式控制 5. 清空和重置 6. 拼接字符串 1. 头…...
并发编程所需的底层基础
一、计算机运行的底层原理 1.多级层次的存储结构 ①:辅存 固态盘不是主要的应用对象,因为固态盘的使用次数是有限的,无法支撑高并发场景 磁盘存储的最基本原理是电生磁。 磁盘的磁道里边有很多的磁颗粒,磁颗粒上边有一层薄膜为了防止磁点氧…...
各种小功能
目录 Python在指定目录创建多个相似命名的文件夹 Python 在指定目录创建多个相似命名的文件夹...
vue前端解析jwt
vue前端解析jwt 我们可以用在线解析看解析的结果:https://www.lddgo.net/encrypt/jwt-decrypt 但是如果在前端需要解析token,拿到其中的权限信息,可以这样解决。 在线的: 完美解决: 代码: function par…...
【Flutter 面试题】Flutter如何进行本地存储和缓存数据?
【Flutter 面试题】Flutter如何进行本地存储和缓存数据? 文章目录 写在前面口述回答补充说明实际案例完整代码示例运行结果详细说明 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云…...
Docker 笔记(八)--Dockerfile
目录 1. 背景2. 参考3. 原文3.1 Dockerfile 支持的指令3.2 Dockerfile格式3.3 Parser指令syntaxescape 3.4 环境变量替换3.5 docker构建忽略文件3.6 Shell 和 exec 格式Exec 格式Shell 格式使用不同的 shell 3.7 FROM指令了解ARG和FROM如何交互 3.8 RUN指令RUN指令缓存失效RUN …...
C语言每日一题06
一、题目 二、解析 void main () { char c1,c2; int a1,a2; c1 getchar ();//读取第一个输入,c11 scanf (“%3d”,&a1ÿ…...
spring redis 工具类
1、引入jar <!-- redis 缓存操作 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2、代码 /*** 缓存基本的对象,Integer、String、…...
SpringBoot3整合Elasticsearch8.x之全面保姆级教程
整合ES 环境准备 安装配置ES:https://blog.csdn.net/qq_50864152/article/details/136724528安装配置Kibana:https://blog.csdn.net/qq_50864152/article/details/136727707新建项目:新建名为web的SpringBoot3项目 elasticsearch-java 公…...
微信小程序云开发教程——墨刀原型工具入门(表单组件)
引言 作为一个小白,小北要怎么在短时间内快速学会微信小程序原型设计? “时间紧,任务重”,这意味着学习时必须把握微信小程序原型设计中的重点、难点,而非面面俱到。 要在短时间内理解、掌握一个工具的使用…...
JMeter 批量接口测试
一、背景 最近在进行某中台的接口测试准备,发现接口数量非常多,有6、70个,而且每个接口都有大量的参数并且需要进行各种参数验证来测试接口是否能够正确返回响应值。想了几种方案后,决定尝试使用JMeter的csv读取来实现批量的接口…...
软件游戏缺失unityplayer.dll怎么办,教程5种解决方法
unityplayer.dll是Unity游戏引擎的重要动态链接库文件,它的缺失将直接导致基于该引擎开发的游戏无法正常启动或运行。玩家可能会在尝试打开游戏会提示诸如“找不到unityplayer.dll”或“dll文件丢失”的错误提示,从而无法体验游戏内容。这个问题通常是由…...
Redis相关操作大全一篇全搞定
Redis是单线程吗? Redis 的单线程主要是指 Redis 的网络 10 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。 Redi…...
排序算法:归并排序(递归)
文章目录 一、归并排序的思路二、代码编写 先赞后看,养成习惯!!!^ _ ^<3 ❤️ ❤️ ❤️ 码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦! 所属专栏:排序算法 一、归并排序的思路 单…...
武汉星起航领航中国跨境电商,助推全球贸易新篇章
在全球经济一体化的浪潮中,跨境电商以其独特的优势成为推动国际贸易增长的重要引擎。作为中国跨境电商行业的领军者,武汉星起航电子商务有限公司以其卓越的能力和经验,正积极推动中国跨境电商走向世界,书写全球贸易的新篇章。 自…...
abap2xlsx技术深度解析:企业级ABAP Excel生成架构设计与实施指南
abap2xlsx技术深度解析:企业级ABAP Excel生成架构设计与实施指南 【免费下载链接】abap2xlsx Generate your professional Excel spreadsheet from ABAP 项目地址: https://gitcode.com/gh_mirrors/ab/abap2xlsx abap2xlsx作为SAP生态中成熟的Excel文档生成解…...
YOLO免配置训练包+智能标注工具:支持YOLOv5/v8/v10/v11一键训练,含易语言调用示例
温馨提示:文末有联系方式免环境部署,真正开箱即用 无需安装Python、CUDA、PyTorch等复杂依赖,本YOLO训练套件已封装完整运行时环境,Windows系统双击即可启动,彻底解决环境冲突与配置报错问。全版本YOLO模型支持&#x…...
YOLO+ByteTrack路口违章抓拍实战:多目标稳定追踪与违章判定
一、项目背景与目标 路口违章抓拍是智能交通的核心应用,但传统方案存在两个痛点:一是多目标遮挡时追踪ID频繁切换,导致轨迹断裂;二是违章判定依赖复杂的硬件设备,部署成本高。 本文将用YOLOv11做检测ByteTrack做追踪&a…...
ELK Stack实战:构建高效企业日志分析平台
1. ELK Stack:企业日志管理的瑞士军刀 想象一下你管理着几十台服务器,每天产生的日志文件像雪片一样飞来。当系统出现故障时,你需要在海量日志中寻找那个关键的报错信息——这就像在干草堆里找一根针。这就是为什么越来越多的企业选择ELK St…...
Open WebUI:5分钟搭建你的专属AI助手,开启完全离线智能对话新时代
Open WebUI:5分钟搭建你的专属AI助手,开启完全离线智能对话新时代 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui Open WebUI是一款…...
2026届最火的六大AI论文工具推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下学术情形里,AI相关的论文平台主要被分作三种类型,其一为文献检索…...
dify-sandbox 使用python 虚拟环境本地开发
dify-sandbox 使用python 虚拟环境本地开发为啥使用虚拟环境环境准备启动服务,验证相关接口为啥使用虚拟环境 本地直接使用 pip install 提示错误信息,要在系统范围内安装包,建议使用 apt install python3-xyz 。系统范围的依赖不建议修改&a…...
VMware虚拟机及不同操作系统安装配置
安装VMware Workstation 登录VMware官方下载网站https://support.broadcom.com/group/ecx/my-dashboard,初次登录需要注册一个账号。点击左侧导航栏的My Downloads,然后点击HERE,在新界面的收缩框内输入VMware Workstation,选择V…...
用ShaderGraph的Unlit节点,5分钟搞定一个赛博朋克霓虹灯特效
用ShaderGraph的Unlit节点5分钟打造赛博朋克霓虹灯特效 霓虹灯管在雨夜中闪烁,全息广告牌投射出迷幻的光影——这些标志性的视觉元素构成了赛博朋克世界的灵魂。传统着色器开发需要编写复杂的Shader代码,而Unity的ShaderGraph让这一切变得触手可及。本文…...
别只刷题了!从GaussDB认证实验题,反向学习金融场景下的数据库实战技能
从GaussDB认证实验题解锁金融级数据库实战思维 金融行业对数据库的要求向来以严苛著称——每秒数万笔交易、724小时不间断运行、毫秒级响应延迟,以及不容有失的数据一致性。这些需求催生了像GaussDB这样的分布式数据库系统,而它的认证考试题目恰恰是理解…...
