C#核心之面向对象相关知识点

面向对象相关知识点

在这里插入图片描述

文章目录

      • 1、命名空间
        • 1、命名空间基本概念
        • 2、命名空间的使用
        • 3、不同命名空间中相互调用
        • 4、不同命名空间中允许有同类名
        • 5、命名空间可以包裹命名空间
        • 6、关于修饰类的访问修饰符
      • 2、万物之父中的方法
        • 1、object中的静态方法
        • 2、object中的成员方法
        • 3、object中的虚方法
      • 3、String
        • 1、字符串指定位置获取
        • 2、字符串拼接
        • 3、正向查找字符位置
        • 4、反向查找指定字符串位置
        • 5、移除指定位置后的字符
        • 6、替换指定字符
        • 7、大小写转换
        • 8、字符串截取
        • 9、字符串切割
          • 思考1 规律字符串里的数字修改
          • 思考2 字符串的反转
      • 4、StringBuilder
        • 1、初始化 直接指明内容
        • 2、容量
        • 3、增删改查
          • 思考1 string 和 StringBuilder区别
          • 思考2 如何优化内存
      • 5、结构体和类的区别
      • 6、抽象类和接口的区别

1、命名空间

1、命名空间基本概念
概念
    命名空间是用来组织和重用代码的
作用
    命名空间像工具包,类像声明在命名空间的工具
2、命名空间的使用
基本语法
namespace 命名空间名{}
3、不同命名空间中相互调用

需要using引用命名空间或指明出处

4、不同命名空间中允许有同类名

要指明出处

5、命名空间可以包裹命名空间
MyGame.UI.Image img = new MyGame.UI.Image();
MyGame.Game.Image img2 = new MyGame.Game.Image();
namespace MyGame{
    namespace UI{class Image{}}
    namespace Game{class Image{}}
}
6、关于修饰类的访问修饰符
public 命名空间中的类,不写默认为public
internal 只能在该程序集中使用

2、万物之父中的方法

1、object中的静态方法
静态方法 Equals	判断对象是否相等
	最终判断权,交给左侧对象的Equals方法
	不论是值类型还是引用类型都会按照左侧对象Equals方法的规则来比较
    Console.WriteLine(Object.Equals(1,1));
静态方法 ReferenceEquals
    比较两个对象是否是相同引用,主要是用来比较引用类型的对象
    值类型对象返回值始终是false
2、object中的成员方法
普通方法 GetType
    获取对象运行时的类型Type
    Type type = t.GetType();
普通方法 MemberwiseClone
    获取对象的浅拷贝对象,就是返回一个新对象
    但是新对象中的引用变量会和老对象中的一致
3、object中的虚方法
虚方法 Equals
    比较两者是否为同一个引用,相当于ReferenceEquals
虚方法	GetHashCode
    获取对象的哈希码
虚方法 ToString
    返回当前对象代表的字符串
    public override string ToString(){
    	return "自定义字符串"
	}

3、String

每次重新赋值或拼接时会自动分配新的内存空间

1、字符串指定位置获取
字符串的本质时char数组
    string str = "字符串";
	Console.WriteLine(str[0]);
转换为char数组
    char[] chars = str.ToCharArray();
	Console.WriteLine(chars[1]);
	for (int i = 0; i < str.Length; i++)
	{
     	Console.WriteLine(str[i]);
	}
2、字符串拼接

string.Format();

3、正向查找字符位置
str = "字符串";
int index = str.IndexOf("符");
Console.WriteLine(index);	//没找到-1
4、反向查找指定字符串位置
str = "字符串字符串";
int index = str.LastIndexOf("符");
Console.WriteLine(index);
5、移除指定位置后的字符
str = "字符串字符串";
str = str.Remove(4);
Console.WriteLine(str);

//参数1:开始位置 参数2:字符个数,越界会报错
str = str.Remove(1,1);
Console.WriteLine(str);
6、替换指定字符
str = "字符串字符串";
str = str.Replace("字符串","替换");
Console.WriteLine(str);
7、大小写转换
str = "sdf";
//转大写
str = str.ToUpper();
Console.WriteLine(str);
//转小写
str = str.ToLower();
Console.WriteLine(str);
8、字符串截取
str = "字符串字符串";
str = str.Substring(2); //字符串
Console.WriteLine(str);
//参数1:开始位置 参数2:字符个数,越界会报错
str = str.Substring(2,2);
Console.WriteLine(str); //字符串串
9、字符串切割
str = "1_1|2_2|3_3|5_1|6_4";
string[] strs = str.Split('|');
for (int i = 0; i < strs.Length; i++){
    Console.WriteLine(strs[i]);
}
思考1 规律字符串里的数字修改
//请将字符串 1|2|3|4|5|6|7 变为 2|4|6|8|10|12|14|18
string str = "1|2|3|4|5|6|7";
string[] strs = str.Split('|');
string s ="";
for (int i = 0; i < strs.Length; i++)
{
    s += int.Parse(strs[i]) * 2;
    if (i != strs.Length-1)
    {
        s += "|";
    }
}
Console.WriteLine(s);
思考2 字符串的反转
//将输入的字符串反转,且交换过程不使用额外空间
Console.WriteLine("输入");
string str = Console.ReadLine();
char[] chars = str.ToCharArray();
for (int i = 0; i < chars.Length / 2; i++)
{
    //char temp = chars[i];
    //chars[i] = chars[chars.Length-1-i];
    //chars[chars.Length-1-i] = temp;
    chars[i] = (char)(chars[i] + chars[chars.Length - 1-i]);
    chars[chars.Length - 1 - i] = (char)(chars[i] - chars[chars.Length - 1 - i]);
    chars[i] = (char)(chars[i] - chars[chars.Length - 1 - i]);

}
for (int i = 0;i < chars.Length; i++)
{
    Console.Write(chars[i]);
}

4、StringBuilder

C#提供的一个用于处理字符串的公共类
解决的问题
    修改字符串而不是创建新的对象,需要频繁修改和拼接字符串使用
使用前需要引用命名空间
1、初始化 直接指明内容
using System.Text;
StringBuilder sb = new StringBuilder("111",16);
2、容量
StringBuilder存在一个容量问题,每次往里面增加时,会自动扩容
    获得容量
    Console.WriteLine(sb.Capacity);
	获得字符长度
    sb.Length
3、增删改查
增
    sb.Append("333");
	sb.AppendFormat("{0}",99);
插入
    sb.Insert(0,"插入");
删
    sb.Remove(0,10);
清空
    sb.Clear();
查
    Console.WriteLine(sb[1]);
改
    sb[0] = 'A';
替换
    sb.Replace("1","替");
重新赋值
    sb.Clear();
	sb.Append("123");
思考1 string 和 StringBuilder区别
1、string相对StringBuilder更容易产生垃圾 每次修改拼接都会产生垃圾
2、string相对StringBuilder更加灵活,提供了更多方法
如果需要频繁修改拼接字符串使用StringBuilder
如果需要使用string独特的一下方法处理特殊逻辑使用string
思考2 如何优化内存
1、节约内存 //崩溃
2、尽量少GC //卡顿
少new对象,少产生垃圾
合理使用static
合理使用string和StringBuilder

5、结构体和类的区别

1、区别概述

结构体和类最大的区别是存储空间上的,结构体是值(栈),类是引用(堆)
结构体具备面向对象思想中封装的特性,但它不具备继承和多态,不能使用protect

2、细节区别

1、结构体是值类型,类是引用类型
2、结构体存在栈中,类存在堆中
3、结构体成员不能使用protect访问修饰符,类可以
4、结构体成员变量声明不能指定初始值,类可以
5、结构体不能声明无参的构造函数,类可以
6、结构体声明有参构造函数后,无参构造不会被顶掉
7、结构体不能声明析构函数,类可以
8、结构体不能被继承,类可以
9、结构体需要在构造函数中初始化所有成员变量
10、结构体不能被静态static修饰,类可以
11、结构体不能再自己内部声明和自己一样的结构体变量,类可以

3、机构体的特别之处

结构体可以继承接口

4、如何选择结构体和类

1、想要用继承和多态,使用类
2、对象是数据集合是,有线考虑结构体,比如位置,坐标等
3、从值类型和引用类型赋值时的区别考虑
	比如经常被赋值传递的对象,并且改变赋值对象,原对象不想跟着变化时,就用结构体,比如坐标、向量、旋转等

6、抽象类和接口的区别

1、相同点

1、都可以被继承
2、都不能直接实例化
3、都可以包含方法声明
4、子类必须实现未实现的方法
5、都遵从里氏替换原则

2、不同点

1、抽象类中可以有构造函数;接口不能
2、抽象类只能被单一继承;接口可以被多个继承
3、抽象类中可以有成员变量;接口不能
4、抽象类中可以声明成员方法,虚方法,抽象方法,静态方法;接口中只能声明没有实现的抽象方法
5、抽象类方法可以使用访问修饰符;接口中建议不写,默认public

3、如何选择抽象类和接口

表示对象的用抽象类,表示行为拓展的用接口
不同对象拥有的共同行为,往往使用接口来实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/601344.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 性能优化之UI和模型优化(九)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、选择UI二、UGUI的优化1.Raycast Target2.UI控件的重叠3.TextMeshPro 二、模型优化1.Model选项卡Mesh CompressionRead/Write Enabled设置Optimize Ga…

IIoT:数据融合在工业物联网中的应用——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断发展&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经逐渐渗透到各个行业&#xff0c;为企业的生产和管理带来了前所未有的便利。 然而&#xff0c;与此同时&#xff0c;海量的数据也为企业带来了挑战。如何将这些…

图片8位, 16位,24位,32位原理,以及如何进行补位互转

写在前面&#xff1a;之前一直没有这个概念&#xff0c;以为像素就是十六进制如 #FFFFFF&#xff0c;或者rgb(255,255,255) 即可实现颜色定义&#xff0c;理解相当肤浅&#xff0c;接触到一个物联网项目&#xff0c;写底层的童鞋让我把16位如 0*FFFF转为24位去显示在浏览器&…

如何使用SkyWalking收集分析分布式系统的追踪数据

Apache SkyWalking 是一个开源的观测性工具&#xff0c;用于收集、分析和展示分布式系统的追踪数据。SkyWalking 支持多种语言的追踪&#xff0c;包括但不限于 Java、.NET、Node.js 等。以下是使用 SkyWalking 工具实现数据采集的详细步骤&#xff1a; 1. 下载和安装 SkyWalkin…

MCU做死循环时,到底应该用for(;;) 还是wihile(1)

MCU做死循环时 for while stm32中老工程师用forfor while背景for版本while版本正方观点&#xff1a;哪有好的编译器&#xff1a;反方观点&#xff1a;这种代码过时了工程师实地测试&#xff1a;和编译器和优化有关 建议还是用for参考 stm32中老工程师用for /* Start scheduler …

MS2107 宏晶微 音视频采集芯片 提供开发资料

1. 基本介绍 MS2107 是一款视频和音频采集芯片,内部集成 USB2.0 控制器和数据收发模块、视频 ADC模块、音频 ADC 模块和音视频处理模块。MS2107可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。MS2107 输出支持 YUV422 和 MJPEG 两种…

css: hover 划过显示/隐藏 div 样式

1. 图例: 划过用display: block;和 display: none; 显示div和隐藏div div: <div class="sectorBox"> <div v-for="(item, index) in sectorList" :key="index" class="sill"> <div class="si…

三维点云处理-聚类(下)

接着前一部分数据聚类方法的介绍&#xff0c;由于K-means和GMM方法都是基于欧式距离信息处理的&#xff0c;两者分别以圆形和椭圆形来作为数据的聚类分割方式&#xff0c;这种情况下会导致环形图和月牙图数据分割不准确&#xff0c;因此进一步的介绍一种谱聚类方法&#xff0c;…

Elastic 通过 AI 驱动的安全分析改变 SIEM 游戏

作者&#xff1a;Santosh Krishnan, Jennifer Ellard 借助由搜索 AI 提供支持的新攻击发现功能&#xff0c;优先考虑攻击&#xff0c;而不是警报。 传统的安全信息与事件管理系统&#xff08;SIEM&#xff09;在很大程度上依赖屏幕背后的人类才能取得成功。警报、仪表盘、威胁…

Python高级编程-DJango2

Python高级编程-DJango2 没有清醒的头脑&#xff0c;再快的脚步也会走歪&#xff1b;没有谨慎的步伐&#xff0c;再平的道路也会跌倒。 目录 Python高级编程-DJango2 1.显示基本网页 2.输入框的形式&#xff1a; 1&#xff09;文本输入框 2&#xff09;单选框 3&#xff…

我用 GitHub 9.8k 的 Go 语言 2D 游戏引擎写了个游戏

前言 hi&#xff0c;大家好&#xff0c;这里是白泽。今天给大家分享一个 GitHub &#x1f31f;9.8k 的 Go 语言 2D 游戏引擎。 https://github.com/hajimehoshi/ebiten 引擎的贡献者依旧在积极维护&#xff0c;是一个兼具学习 & 娱乐的项目&#xff01; 为此我也用这个…

数据结构-线性表-应用题-2.2-11

1)算法的基本设计思想&#xff1a; 分别求两个升序序列的中位数a,b 若ab&#xff0c;则a或b即为所求中位数 若a<b&#xff0c;则舍弃A中较小的一半&#xff08;中位数偏小&#xff0c;往后面找&#xff09;&#xff0c;同时舍弃序列B中较大的一半&#xff0c;两次舍弃长度…

meshlab: pymeshlab保存物体的横截面(compute planar section)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 # pymeshlab需要导入&#xff0c;其一般被命名为ml import pymeshlab as ml# 本案例所…

C++ | Leetcode C++题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size(), n matrix[0].size();int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 l…

YOLOv8的训练、验证、预测及导出[目标检测实践篇]

这一部分内容主要介绍如何使用YOLOv8训练自己的数据集&#xff0c;并进行验证、预测及导出&#xff0c;采用代码和指令的两种方式&#xff0c;参考自官方文档&#xff1a;Detect - Ultralytics YOLOv8 Docs。实践篇不需要关注原理&#xff0c;只需要把流程跑通就行&#xff0c;…

白色或类白色的粉末/固体,DOTA-Ala-Ala-Tyr-COOH,是一种具有特定氨基酸序列的多肽,具有良好的稳定性和溶解性

一、试剂信息 英文名&#xff1a;DOTA-Ala-Ala-Tyr-COOH&#xff0c;DOTA-AAY-OHCAS号&#xff1a;N/A分子式&#xff1a;C31H47N7O12分子量&#xff1a;709.74结构式&#xff1a; 纯度标准&#xff1a;≥95%包装规格&#xff1a;1g&#xff0c;5g&#xff0c;10g&#xff08…

Selenium——获取元素和操纵元素的方法

1、获取元素的方法 1、通过id获取 element wd.find_element(By.ID,"id")2、通过classname获取 elements wd.find_elements_by_class_name("plant") for element in elements:print(element.text)3、通过tagname获取元素 elements wd.find_elements_…

SpringBoot2 仿B站高性能前端+后端项目(wanjie)

SpringBoot2 仿B站高性能前端后端项目(完结) Spring Boot 2 仿B站高性能前端后端项目&#xff1a;打造高效、稳定、可扩展的应用 在当今的互联网时期&#xff0c;网站的性能、稳定性和可扩展性成为了权衡一个项目胜利与否的关键要素。本文将引见如何运用 Spring Boot 2 构建一…

AIGC-3D数字人技术:高效助推各行业数字化水平升级

从“互联网”到“人工智能”&#xff0c;数字员工作为一种全新的交互形式&#xff0c;对企业有着重要的作用&#xff0c;企业、品牌通过数字人的AI语音交互、AI播报等核心功能&#xff0c;可以有效推动企业提升数字水平。 作为3D、AI虚拟数字人技术服务商及方案提供商&#xff…

鸿蒙内核源码分析(工作模式篇) | CPU的七种工作模式

本篇说清楚CPU的工作模式 工作模式(Working mode) 也叫操作模式&#xff08;Operating mode&#xff09;又叫处理器模式&#xff08;Processor mode&#xff09;&#xff0c;是 CPU 运行的重要参数&#xff0c;决定着处理器的工作方式&#xff0c;比如如何裁决特权级别和报告异…