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

面向对象相关知识点

文章目录

1、命名空间

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

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

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

要指明出处

5、命名空间可以包裹命名空间
java 复制代码
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、关于修饰类的访问修饰符
java 复制代码
public 命名空间中的类,不写默认为public
internal 只能在该程序集中使用

2、万物之父中的方法

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

3、String

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

1、字符串指定位置获取
c 复制代码
字符串的本质时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、正向查找字符位置
c 复制代码
str = "字符串";
int index = str.IndexOf("符");
Console.WriteLine(index);	//没找到-1
4、反向查找指定字符串位置
c 复制代码
str = "字符串字符串";
int index = str.LastIndexOf("符");
Console.WriteLine(index);
5、移除指定位置后的字符
c 复制代码
str = "字符串字符串";
str = str.Remove(4);
Console.WriteLine(str);

//参数1:开始位置 参数2:字符个数,越界会报错
str = str.Remove(1,1);
Console.WriteLine(str);
6、替换指定字符
c 复制代码
str = "字符串字符串";
str = str.Replace("字符串","替换");
Console.WriteLine(str);
7、大小写转换
c 复制代码
str = "sdf";
//转大写
str = str.ToUpper();
Console.WriteLine(str);
//转小写
str = str.ToLower();
Console.WriteLine(str);
8、字符串截取
c 复制代码
str = "字符串字符串";
str = str.Substring(2); //字符串
Console.WriteLine(str);
//参数1:开始位置 参数2:字符个数,越界会报错
str = str.Substring(2,2);
Console.WriteLine(str); //字符串串
9、字符串切割
c 复制代码
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 规律字符串里的数字修改
c 复制代码
//请将字符串 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 字符串的反转
c 复制代码
//将输入的字符串反转,且交换过程不使用额外空间
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 复制代码
C#提供的一个用于处理字符串的公共类
解决的问题
    修改字符串而不是创建新的对象,需要频繁修改和拼接字符串使用
使用前需要引用命名空间
1、初始化 直接指明内容
c 复制代码
using System.Text;
StringBuilder sb = new StringBuilder("111",16);
2、容量
c 复制代码
StringBuilder存在一个容量问题,每次往里面增加时,会自动扩容
    获得容量
    Console.WriteLine(sb.Capacity);
	获得字符长度
    sb.Length
3、增删改查
c 复制代码
增
    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区别
c 复制代码
1、string相对StringBuilder更容易产生垃圾 每次修改拼接都会产生垃圾
2、string相对StringBuilder更加灵活,提供了更多方法
如果需要频繁修改拼接字符串使用StringBuilder
如果需要使用string独特的一下方法处理特殊逻辑使用string
思考2 如何优化内存
c 复制代码
1、节约内存 //崩溃
2、尽量少GC //卡顿
少new对象,少产生垃圾
合理使用static
合理使用string和StringBuilder

5、结构体和类的区别

1、区别概述

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

2、细节区别

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

3、机构体的特别之处

c 复制代码
结构体可以继承接口

4、如何选择结构体和类

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

6、抽象类和接口的区别

1、相同点

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

2、不同点

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

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

c 复制代码
表示对象的用抽象类,表示行为拓展的用接口
不同对象拥有的共同行为,往往使用接口来实现
相关推荐
许野平18 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨21 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar30 分钟前
yelp数据集上识别潜在的热门商家
开发语言·python
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧1 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵1 小时前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong2 小时前
Java反射
java·开发语言·反射
Troc_wangpeng2 小时前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的2 小时前
解析json导出csv或者直接入库
开发语言·python·json
Envyᥫᩣ2 小时前
C#语言:从入门到精通
开发语言·c#