c#学习1
date: 2024/5/22
https://www.yuque.com/ysgstudyhard/da6e0c/wlcivg
开发人员利用C#能够生成在.NET中运行的多种安全可靠的应用程序。
关键字
public、protected、internal、private
- public访问不受限制
- protected访问限于包含类或派生自包含类的类型
- internal访问限于当前程序集
- private访问限于包含类
- protected internal访问限于当前程序集或派生自包含类的类型访问
- private protected访问限于包含类或当前程序集中包含类的派生类的类型访问
类与结构默认为Internal、类成员与结构成员默认为private。结构成员不能声明为protected,因为无法继承。
readonly关键字(运行时常量):字段可以在声明或构造函数中初始化,常作为运行时常量使用。
consti关键字(编译时常量):字段只能在该字段的声明时初始化,常作为编译时常量使用过。
virtual关键字:用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写(使用override关键字对虚方法重写)。
override:扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现需要override修饰符。
static:使用static修饰符可声明属于类型本身而不是属于特定对象的静态成员。static修饰符可用于声明static类。在类、接口和结构中,可以将static修饰符添加到字段、方法、属性、运算符、事件和构造函数。static修饰符不能用于索引器或终结器。
sealed关键字:用于修饰类、方法或属性,表示该类或成员不可被继承或重写。如果一个类被声明为sealed,其他类不能继承该类;如果一个方法或属性被声明为sealed,其他类不能重写该方法或属性。
this关键字表示当前对象的引用,可以用于访问当前对象的成员。它可以用来区分局部变量和实例变量、在构造函数中调用其他构造函数、传递当前对象给其他方法等。
base关键字表示基类的引用,可以用于访问基类的成员。它可以用来在子类中调用基类的构造函数、调用基类的方法或属性等。
sizeof运算符返回给定类型的变量所占用的字节数。
lock关键字用于在多线程环境下对共享资源进行互斥访问。使用Iock关键字可以将代码块标记为临界区,使得只有一个线程能够进入临界区执行代码。
async和await关键字用于异步编程。通过使用async标记方法和await等待异步操作完成,可以实现在异步任务执行过程中不阻塞主线程。
delegate关键字用于声明委托类型,即代表一个或多个方法的对象。使用delegate可以实现事件和回调机制,简化方法的调用和管理。
using指令为命名空间创建别名,或导入在其他命名空间中定义的类型。using语句定义一个范围,在此范围的末尾将释放对象资源,实现了IDisposiablef的类在using中创建,using结束后会自定调用该对象的Dispose)方法,释放资源。
in关键字用于参数传递时,将参数按只读引用传递。
ref指定此参数由引用传递,指定的参数在函数调用时必须先初始化(有进有出)。
。
out指定此参数由引用传递,指定的参数在进入函数时会清空参数值,因此该参数必须在调用函数内部进行初始化赋值操作(无进有出)
as运算符将表达式结果显式转换为给定的引用类型或可以为ull值的类型。如果无法进行转换,则as运算符返回null。
is只是做类型兼容判断,并不执行真正的类型转换。返回true或false,不会返回null,对象为null也会返回false.
null关键字是表示不引用任何对象的空引用的文字值。
new:创建实例,显示隐藏从基类继承的成员,泛型约束定义
return、continue、break
数据类型
堆(手动分配释放),栈(编译器自动)
- 值类型:整数、浮点、布尔、字符、结构、枚举
- 引用类型:对象、字符串、类、接口、委托、动态
- 指针类型
.GetType()获取当前实例类型,is关键兹判断类型
object类型是.NET里面System.Object的别名,在C#中所有的类型预定义、用户定
义、引用类型、值类型)都直接或者间接的继承自Object。所以我们可以将任何类型的值
用object对象来接收;动态类型(dynamic)在编译时会绕过类型检查,从而在运行时解析。所以动态类型只存在于编译时,不存在于运行时;
//声明并初始化
double[] balance new double[10];
//通过数组索引复制
balance[0]=66;
/定义多个不同类型的数组
var multiTypeArray = new object[]{"",'H',2021,"hello world",'!}
foreach (var item in multiTypeArray)
{
var currentValue item;
}
String:适用于少量修改和频繁读取的场景,而StringBuilderi适用于频繁修改字符串内容的场景,可以避免不必要的内存分配和提高性能。string.Empty,‘’“,null。string关键字是String的别名
面向对象
封装、继承、多态
五大基本原则:
- 单一职责原则(SRP):一个类或者一个方法只做一件事。
- 开放封闭原则(OCP):更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和心LL进行修改或重新编译文件!这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术。
- 里氏替换原则(LSP):所有基类出现的地方都可以用派生类替换而不会程序产生措误。子类可以扩展父类的功能,但不能改变父类原有的功能。例如机动车必须有轮胎和发动机,子类宝马和奔驰不应该改写没轮胎或者没发动机。
- 接口隔离原则(ISP):类不应该依赖不需要的接口,知道越少越好。例如电话接口只约束接电话和挂电话,不需要让依赖者知道还有通讯录。
- 依赖倒置原则(DIP):指的是高级模块不应该依赖低级模块,而是依赖抽象。抽象不能依赖细节,细节要依赖抽象。比如类A内有类B对象,称为类A依赖类B,但是不应该这样做,而是选择类A去依赖抽象。例如垃圾收集器不管垃圾是什么类型,要是垃圾就行。
泛型与集合
List<T>、Queue<T>、SortedLis<TKey,TValue>,Stack<T>等
多线程
应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
通过将Thread.IsBackground设置为true,就可以将线程指定为后台线程,主线程就是一个前台线程。
锁:lock、Monitor、Semaphore、Mutex、ReaderWriterLock、SpinLock