c#学习1

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关键字可以将代码块标记为临界区,使得只有一个线程能够进入临界区执行代码。

asyncawait关键字用于异步编程。通过使用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