当前位置: 首页 > news >正文

面向对象(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);}
    }
    

内部类和分布类

  1. 内部类

    • 在一个类中再申明一个类,表示类之间的层级关系,注意访问修饰符

    • 格式:

      class Person
      {public int age;public class Arm // 公共的才能在外部访问{public int size;}
      }
      
      // 主函数
      Person.Arm arm = new Person.Arm();
      
  2. 分布类

    • 作用:把一个类分成几部分申明,增加程序拓展性

    • 关键字:partial

    • 格式:

      partial class Student
      {public bool sex;public string name;
      }partial class Student // 分别申明
      {public int number;public void Speak(string s){Console.WriteLine(s);}
      }
      

继承

里氏替换

  • 作用:父类对象装载子类对象

  • isas

    GameObject 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 // 无法再被继承
    {
    }
    

多态

virtualoverridebase

  • 作用:让继承同一父类的子类,在执行相同方法时有不同的表现
  • virtual(虚函数)、override(重写)、base(父类)

抽象类

  • 抽象是把多个事物相同的内容抽取出来,但是自己本身是没有实际实体的,(水果没有实体,苹果才是实体)
  • 不能被实例化,抽象类必须重写其中的抽象方法
  • 仍然可以用父类容器装载子类对象

抽象方法(纯虚函数)

  • 只能在抽象类中申明

  • 没有方法体

  • 不能是私有的,因为子类需要重写

  • 继承后必须重写(override)抽象方法

接口

  • 一个类可以继承多个接口,接口用于描述有共同方法或属性的类,成员方法没有方法体,只是定义共同需要的方法至少需要什么,不能包含成员变量,可以有方法、属性、索引器、事件

  • 默认修饰符是public,因为需要被继承后的类重写所以不能设置私有

  • 接口也不能被实例化,但是可以做父类容器装载子类对象

  • 代码

    interface IPereson // 命名规则前缀I
    {
    }
    

密封方法

  • 作用:让虚方法或抽象方法之后不能再被重写
  • 关键字:sealed

相关文章:

面向对象(C# )

面向对象&#xff08;C# &#xff09; 文章目录 面向对象&#xff08;C# &#xff09;ref 和 out传值调用和引用调用ref 和 out 的使用ref 和 out 的区别 结构体垃圾回收GC封装成员属性索引器静态成员静态类静态构造函数拓展方法运算符重载内部类和分布类 继承里氏替换继承中的…...

Lombok:@Cleanup资源释放利器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Cleanup介绍 二、使用示例 三、价值阐述 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Cleanup介绍 Cleanup可以自动管理输…...

IoT 物联网场景中 LoRa + 蓝牙Bluetooth 室内场馆高精定位技术全面解析

基于LoRa蓝牙的室内场景定位技术&#xff0c;蓝牙主要负责位置服务&#xff0c;LoRa主要负责数据传输。 01 LoRa和蓝牙技术 LoRa全称 “Long Rang”&#xff0c;是一种成熟的基于扩频技术的低功耗、超长距离的LPWAN无线通信技术。LoRa主要采用的是窄带扩频技术&#xff0c;抗干…...

SpringCloudAlibaba系列之Seata实战

目录 环境准备 1.下载seata安装包 2.修改配置文件 3.准备seata所需配置文件 4.初始化seata所需数据库 5.运行seata 服务准备 分布式事务测试 环境准备 1.下载seata安装包 Seata-Server下载 | Apache Seata 本地环境我们选择稳定版的二进制下载。 下载之后解压到指定目录…...

蓝桥杯day5刷题日记-分巧克力-天干地支-求和

P8647 [蓝桥杯 2017 省 AB] 分巧克力 思路&#xff1a;二分查找 #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 标准库中的一个输出字符串流类&#xff0c;它可以用于将各种数据类型转换为字符串&#xff0c;并且支持格式控制和字符串拼接操作。 目录 1. 头文件 2. 基本用法 3. 将各种数据类型转换为字符串 4. 格式控制 5. 清空和重置 6. 拼接字符串 1. 头…...

并发编程所需的底层基础

一、计算机运行的底层原理 1.多级层次的存储结构 ①:辅存 固态盘不是主要的应用对象&#xff0c;因为固态盘的使用次数是有限的&#xff0c;无法支撑高并发场景 磁盘存储的最基本原理是电生磁。 磁盘的磁道里边有很多的磁颗粒&#xff0c;磁颗粒上边有一层薄膜为了防止磁点氧…...

各种小功能

目录 Python在指定目录创建多个相似命名的文件夹 Python 在指定目录创建多个相似命名的文件夹...

vue前端解析jwt

vue前端解析jwt 我们可以用在线解析看解析的结果&#xff1a;https://www.lddgo.net/encrypt/jwt-decrypt 但是如果在前端需要解析token&#xff0c;拿到其中的权限信息&#xff0c;可以这样解决。 在线的&#xff1a; 完美解决&#xff1a; 代码&#xff1a; function par…...

【Flutter 面试题】Flutter如何进行本地存储和缓存数据?

【Flutter 面试题】Flutter如何进行本地存储和缓存数据&#xff1f; 文章目录 写在前面口述回答补充说明实际案例完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云…...

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 &#xff08;&#xff09; { char c1&#xff0c;c2&#xff1b; int a1&#xff0c;a2&#xff1b; c1 getchar &#xff08;&#xff09;&#xff1b;//读取第一个输入&#xff0c;c11 scanf &#xff08;“%3d”&#xff0c;&a1&#xff…...

spring redis 工具类

1、引入jar <!-- redis 缓存操作 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2、代码 /*** 缓存基本的对象&#xff0c;Integer、String、…...

SpringBoot3整合Elasticsearch8.x之全面保姆级教程

整合ES 环境准备 安装配置ES&#xff1a;https://blog.csdn.net/qq_50864152/article/details/136724528安装配置Kibana&#xff1a;https://blog.csdn.net/qq_50864152/article/details/136727707新建项目&#xff1a;新建名为web的SpringBoot3项目 elasticsearch-java 公…...

微信小程序云开发教程——墨刀原型工具入门(表单组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…...

JMeter 批量接口测试

一、背景 最近在进行某中台的接口测试准备&#xff0c;发现接口数量非常多&#xff0c;有6、70个&#xff0c;而且每个接口都有大量的参数并且需要进行各种参数验证来测试接口是否能够正确返回响应值。想了几种方案后&#xff0c;决定尝试使用JMeter的csv读取来实现批量的接口…...

软件游戏缺失unityplayer.dll怎么办,教程5种解决方法

unityplayer.dll是Unity游戏引擎的重要动态链接库文件&#xff0c;它的缺失将直接导致基于该引擎开发的游戏无法正常启动或运行。玩家可能会在尝试打开游戏会提示诸如“找不到unityplayer.dll”或“dll文件丢失”的错误提示&#xff0c;从而无法体验游戏内容。这个问题通常是由…...

Redis相关操作大全一篇全搞定

Redis是单线程吗? Redis 的单线程主要是指 Redis 的网络 10 和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储服务的主要流程。但Redis 的其他功能&#xff0c;比如持久化、异步删除、集群数据同步等&#xff0c;其实是由额外的线程执行的。 Redi…...

排序算法:归并排序(递归)

文章目录 一、归并排序的思路二、代码编写 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦&#xff01; 所属专栏:排序算法 一、归并排序的思路 单…...

武汉星起航领航中国跨境电商,助推全球贸易新篇章

在全球经济一体化的浪潮中&#xff0c;跨境电商以其独特的优势成为推动国际贸易增长的重要引擎。作为中国跨境电商行业的领军者&#xff0c;武汉星起航电子商务有限公司以其卓越的能力和经验&#xff0c;正积极推动中国跨境电商走向世界&#xff0c;书写全球贸易的新篇章。 自…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...