
C#知识
文章平均质量分 57
此类文章是观看B站唐老狮视频后的笔记,对C#基础知识复习巩固,并为日后复习奠定基础。
weixin_53163894
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C#-特殊语法
申明对象时,可以通过直接写大括号的形式初始化公共成员变量和属性。 var 是一种特殊的变量类型,它可以用来表示任意类型的变量。原创 2023-06-29 16:34:32 · 888 阅读 · 0 评论 -
C#-迭代器
设计人员无需关心容器对象的内存分配的实现细节,可以用 foreach 遍历的类,都是实现了迭代器的。 迭代器就是可以让我们在外部直接通过 foreach 遍历对象中元素而不需要了解其结构。 迭代器(iterator)有时又称光标(cursor),是程序设计的软件设计模式。 迭代器模式提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的标识。 在表现效果上看,是可以在容器对象(例如链表或数组)上遍历访问的接口。 主要作用就是将复杂逻辑简单化,可以增加程序的可读性。原创 2023-06-29 16:34:41 · 1535 阅读 · 0 评论 -
C#-特性
特性提供功能强大的方法以将声明信息与 C# 代码(类型、方法、属性等)相关联。 比如一个类、成员变量、成员方法等等为他们添加更多的额外信息。 特性的目的是告诉编译器把程序结构的某组元数据嵌入程序集中。 特性与程序实体关联后,即可在运行时使用反射查询特性信息。 它可以放置在几乎所有的声明中(类、变量、函数等等申明)特性是一种允许我们向程序的程序集添加元数据的语言结构。 它是用于保存程序结构信息的某种特殊类型的类。 我们可以利用特性类为元数据添加额外信息。原创 2023-06-29 16:30:21 · 709 阅读 · 0 评论 -
C#-反射
主要用来加载其它程序集,加载后才能用 Type 来使用其它程序集中的信息。在程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息。一个运行的程序查看本身或者其它程序的元数据的行为就叫做反射。类,函数,变量,对象等等,实例化它们,执行它们,操作它们。有关程序以及类型的数据被称为元数据,它们保存在程序集中。程序集就是我们写的一个代码集合,我们现在写的所有代码。程序中的类,类中的函数、变量等等信息就是程序的元数据。程序正在运行时,可以查看其它程序集或者自身的元数据。它是访问元数据的主要方式。原创 2023-06-29 16:30:54 · 636 阅读 · 1 评论 -
C#-多线程
当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。原创 2023-06-29 16:25:34 · 564 阅读 · 0 评论 -
C#-协变逆变
因为里氏替换原则 父类可以装子类 但是子类不能装父类,所以父类变子类。 用于在泛型中修饰泛型字母的,只有泛型接口和泛型委托能使用。 比如 object 变成 string,感受是不和谐的。 因为里氏替换原则,父类可以装子类,所以子类变父类。 用来修饰泛型替代符,只能修饰接口和委托中的泛型。 协变:父类泛型委托装子类泛型委托。 逆变:子类泛型委托装父类泛型委托。 逆常规的变化,不正常的变化。 协变和逆变是用来修饰泛型的。 和谐的变化,自然的变化。原创 2023-06-29 16:24:22 · 563 阅读 · 0 评论 -
C#-List 排序
系统自带的变量 (int,float,double,…) 一般都可以直接 Sort。 自定义类 Sort 有两种方式。原创 2023-06-29 16:23:28 · 1143 阅读 · 0 评论 -
C#-委托事件匿名函数lambda表达式闭包
/ 访问修饰默认不写 为public 在别的命名空间中也能使用// private 其它命名空间就不能用了// 一般使用public// 申明了一个可以用来存储无参无返回值函数的容器// 这里只是定义了规则 并没有使用// 委托规则的申明 是不能重名(同一语句块中)// 表示用来装载或传递 返回值为int 有一个int参数的函数的 委托 容器规则// 委托是支持 泛型的 可以让返回值和参数 可变 更方便我们的使用。原创 2023-05-16 14:58:27 · 1015 阅读 · 0 评论 -
浅析for循环与foreach
3.如果对集合中的值进行修改,就要用for循环了。for循环和foreach循环其实可以算得上是从属关系的,即foreach循环是可以转化成for循环,但是for循环不一定能转换成foreach循环。总结∶若需要遍历集合或数组,并且遍历的过程中只需要读取而不会更改,使用foreach循环最合适,反之,则根据需要,选择其他循环。从数组或集合中,依次取出每一项的数据,每取出一项的数据,就把数据赋值给循环变量,每一次赋值后,运行一次循环体。foreach循环也叫只读循环,在循环体中,不能更改集合或数组;原创 2023-04-04 16:23:30 · 1021 阅读 · 0 评论 -
常用数据结构-队列
常用方法入列:Enqueue出列:Dequeue查看头部:Peek查看元素存在:Contains数量:Count清空:Clear注意:先进先出装箱拆箱无法遍历无法访问指定元素。原创 2023-03-20 13:54:55 · 90 阅读 · 0 评论 -
常用数据结构-Hashtable哈希表
由于用万物之父来存储数据,自然存在装箱拆箱。当往其中进行值类型存储时就是在装箱,当将值类型对象取出来转换使用时,就存在拆箱。Hashtable(又称散列表)是基于键的哈希代码组织起来的 键/值对。需要引用命名空间using System.Collections;Add方法,向Hashtable中添加键值对。以中括号的形式访问,通过键快速获取值。它的主要作用是提高数据查询的效率。通过键去移除存储的键值对信息。ContainsValue方法。ContainsKey方法。使用键来访问集合中的元素。原创 2023-03-21 13:31:16 · 120 阅读 · 0 评论 -
常用泛型数据结构类-LinkedList
LinkedList是一个C#为我们封装好的类它的本质是一个 可变类型的 泛型双向链表。原创 2023-04-04 14:30:19 · 142 阅读 · 0 评论 -
常用泛型数据结构类-顺序存储、链式存储及单向链表
/查:顺序存储使用上优于链式存储(数组可以直接通过下标得到元素,链式需要遍历)//改:顺序存储使用上优于链式存储(数组可以直接通过下标得到元素,链式需要遍历)//数组、Stack、Queue、List、ArrayList —顺序存储。//简单点理解,就是人定义的存储数据和表示数据之间关系的规则而已。//用一组任意的存储单元存储线性表中的各个数据元素。//数据结构是计算机存储、组织数据的方式(规则)//数组、栈、队列、链表、树、图、堆、散列表。//单向链表、双向链表、循环链表—链式存储。原创 2023-04-03 17:05:09 · 295 阅读 · 0 评论 -
常用泛型数据结构类-Dictionary
实例化:Dictionary 名字dic=new Dictionary();键值对类型从Hashtable的object变为了可以自己指定的泛型。它也是基于键的哈希代码组织起来的 键/值对。可以理解为拥有泛型的Hashtable。原创 2023-03-27 15:38:57 · 120 阅读 · 0 评论 -
常用泛型数据结构类-List
1,列表内部数据是使用数组进行的存储,一个空的列表内部会有一个长度为0的数组,当给列表中添加元素的时候,列表的容量会扩大为4,如果添加第5个的时候,列表的大小会重新设置为8,如果添加第9个元素,列表容量会扩大为16,依次增加。当列表的中的容量发生改变的时候,它会创建一个新的数组,使用Array.Copy()方法将旧数组中的元素复制到新数组中。2,注意容量和列表中元素个数的区别,容量是列表中用于存储数据的数组的长度通过Capacity 获取,列表中的元素是我们添加进去需要管理的数据,通过Count获取。原创 2023-03-27 14:37:06 · 126 阅读 · 0 评论 -
C#-i++与++i的区别
i++:先赋值后自增,先使用i的当前值,然后再将i加1。++i:先自增后赋值,先将i加1,然后再使用i的新值。原创 2023-03-25 18:05:43 · 1044 阅读 · 0 评论 -
常用数据结构-ArrayList
由于ArrayList本质上是一个可以自动扩容的object数组,由于用万物之父来存储数据,自然存在装箱拆箱。//和数组一样的访问方式,通过中括号加索引访问指定位置元素。arrayList.Contains(1)//查找指定元素是否存在 返回值为bool。//移除指定位置的元素 从0开始。它的本质是一个object类型的数组,所以可以存储任意类型的变量。arrayList[0]="李华";原创 2023-03-16 19:25:56 · 159 阅读 · 0 评论 -
常用数据结构-Stack栈
常用方法压栈:Push弹栈:Pop查看栈顶:Peek查看元素存在:Contains数量:Count清空:Clear注意:先进后出装箱拆箱无法遍历无法访问指定元素。原创 2023-03-18 17:24:58 · 145 阅读 · 0 评论 -
C#-泛型
声明语法泛型类class 类名泛型接口interface 接口名泛型方法返回值类型 函数名(参数类型 参数...)概念泛型相当于类型占位符占位字母可以有多个占位字母一般为大写字母定义类或方法时使用替代符代表变量类型当真正使用类或者方法时再具体指定类型。原创 2023-03-23 16:47:38 · 425 阅读 · 0 评论 -
C#-抽象类和接口的区别
/4.抽象类中可以申明成员方法,虚方法,抽象方法,静态方法;接口中只能申明没有实现的抽象方法。仅包含方法、属性、索引器、时间,成员都不能实现,建议不写访问修饰符,默认public。// 5.抽象类方法可以使用访问修饰符;抽象方法只能在抽象类中声明 是个纯虚方法 必须在子类中实现。//2.抽象类只能被单一—继承;不同对象拥有的共同行为,我们往往可以使用接口来实现。//1.抽象类中可以有构造函数;//3.抽象类中可以有成员变量;表示对象的用抽象类,表示行为拓展的用接口。interface 自定义类型。原创 2023-03-13 18:07:11 · 157 阅读 · 0 评论 -
C#-StringBuilder
修改字符串而不创建新的对象,需要频繁修改和拼接的字符串可以使用它,可以提升性能。StringBuilder存在一个容量的问题,每次往里面增加时,会自动扩充。str.Remove(0,10) 从第0个元素删10个。产生垃圾的频率比string低 ,产生的垃圾少。概念:C#提供的一个用于处理字符串的公共类。str.Replace("1","唐“);str.Insert(0,"唐老狮");使用前 需要引用命名空间。原创 2023-03-07 16:34:47 · 123 阅读 · 0 评论 -
面向对象-多态
不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;重写的方法的返回值必须和被重写的方法的返回一致;原创 2023-02-28 10:48:06 · 99 阅读 · 0 评论 -
C#多态-接口
关键字:interface概念:接口表示一种规范特点:它和类的声明类似接口是用来继承的接口不能直接实例化接口成员不包含成员变量仅包含方法、属性、索引器、事件成员不能够实现成员不能使用访问修饰符,默认public继承接口:接口不能够继承类接口可以继承另一个接口一个类可以继承多个接口类继承接口后,必需实现接口中所有成员注意:可以显示实现多接口同名方法实现的接口方法可以是虚方法作用:不同类型对象有相同行为属性结合里氏替换原则使用。原创 2023-02-27 14:34:24 · 108 阅读 · 0 评论 -
C#多态-密封类和密封方法
我们在Person和WhitePerson都重写了父类的方法,但是我们在WhitePerson中重写时前面加上了密封关键字 sealed。意味着到此,这两个函数之后不能够再在子类中进行重写了。在面向对象程序的设计中,密封类的主要作用就是不允许最底层子类被继承。作用:它可以让虚方法和抽象方法在子类中停止被后来者重写。让类无法再被继承 ,加强面向对象设计的规范性,结构性。使用sealed密封关键字的方法。使用sealed密封关键字的类。原创 2023-02-24 14:07:35 · 169 阅读 · 0 评论 -
C#多态-抽象类和抽象方法
1. 抽象类中的抽象属性和抽象方法必须是公有的,因此必须有public修饰符;2. 子类必须override抽象类中的所有抽象属性和抽象方法,如果没有全部override,那么子类必须是抽象类;3. 抽象类中可以有非抽象属性和非抽象方法,也可以是私有或者公有,但是如果是私有的话子类就不能访问,无意义,所以一般情况下都设置为公有public访问修饰符;4. 有抽象方法或抽象属性的类一定是抽象类,抽象类中的属性或方法不一定都是抽象的;原创 2023-02-23 15:22:19 · 165 阅读 · 0 评论 -
C#多态-vob
利用里氏替换原则用子类容器装载子类对象时,最终调用的是父类容器中的Atk方法,但是由于使用vo多态,所以最终我们调用的方法其实是子类中重写的方法。virtualoverride体现出 同一类型对象,执行相同行为,有不同的表现。base对于我们来说,可以保留父类行为,进行逻辑拓展。原创 2023-02-22 11:42:00 · 169 阅读 · 0 评论 -
万物之父和装箱拆箱
简单理解object,它就是可以用来装载所有变量类型对象的容器。它可以表示任意对象,我们可以通过as转换,可以通过括号强转,可以通过ToString转换。1.可以利用里氏替换原则,用object容器装所有对象。把引用类型存储的值类型取出来,堆内存会前移到栈内存中。object是所有类型的基类,它是一个类(引用类型)把值类型用引用类型存储,栈内存会迁移到堆内存中。2.可以用来表示不确定类型,作为函数参考类型。好处:不确定类型时可以方便参数的存储和传递。再把object转为值类型(拆箱)关键字:object。原创 2023-02-21 11:42:37 · 134 阅读 · 0 评论 -
C#继承-继承中的构造函数
构造函数实例化对象时调用的函数主要用来初始化成员变量不写返回值函数名和类名相同访问修饰符根据需求而定一般为public可以重载构造函数可以用this语法重用代码可以用this区分同名参数和成员变量有参构造会顶掉默认的无参构造如想保留无参构造需重载出来当声明一个子类对象时构造函数的执行顺序,先执行父类的再执行子类的。只要声明子类对象,就必须把自己的父类构造函数都走一遍。默认调用父类无参构造,所以父类无参构造很重要。...原创 2022-08-31 11:06:54 · 1963 阅读 · 0 评论 -
C#封装-里氏替换原则
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。里氏替换原则概念:父类容器装子类对象作用:方便进行对象的存储和管理。...原创 2022-08-26 17:39:13 · 454 阅读 · 0 评论 -
C#继承-基本内容
继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类,这个新的类被称为派生类。继承的思想实现了 属于(IS-A) 关系。例如,哺乳动物 属于(IS-A) 动物,狗 属于(IS-A) 哺乳动物,因此狗 属于(IS-A) 动物。原创 2022-08-24 16:09:34 · 271 阅读 · 0 评论 -
C#封装-静态成员
静态成员变量使用static关键字修饰的成员变量静态成员变量属于类,类被加载时初始化,且只有一份。(饮水机会议室)实例成员变量属于对象,在每个对象被创建时(new)初始化,每个对象一份。(杯子工位)特点存在有先于对象,被所有对象所共享,常驻内存静态类使用static关键字修饰的类。不能实例化,只能包含静态成员。静态类不能被继承,但是静态方法、属性可以被继承静态构造函数初始化类的静态数据成员仅在类被加载是执行一次不允许使用访问修饰符适用性利转载借鉴网址https。...原创 2022-07-24 17:29:35 · 458 阅读 · 0 评论 -
C#封装-索引器(Indexer)
索引器(Indexer)是C#引入的一个新型的类成员,它使得类中的对象可以像数组那样方便、直观的被引用。可以让我们以中括号的形式范围自定义类中的元素规则自己定访问时和数组一样。比较适用于在类中有数组变量时引用可以方便的访问和进行逻辑处理。固定写法访问修饰符返回值this[参数列表]get和set语句块可以重载注意结构体里面也支持索引器。...原创 2022-07-24 16:11:12 · 365 阅读 · 0 评论 -
构造函数,析构函数和垃圾回收器
GC对于前者的回收需要通过两步完成,第一步是调用对象的析构函数,第二步是回收内存,但是要注意这两步不是在GC一次轮循完成,即需要两次轮循。值类型在栈(Stack)中分配内存的,它们有自己的生命周期,不用管理,会自动分配和释放内存。引用类型都是存在堆(Heap)中的,所以他的分配和释放都通过垃圾回收机制来管理。:GC的工作大致是,查询内存中对象是否成为垃圾,然后对垃圾进行释放和回收。在一次内存回收过程开始时,垃圾回收期会认为堆中全是垃圾,会进行以下两步。基本概念:在实例化对象时 会调用的用于初始化的函数。原创 2022-07-19 17:28:01 · 383 阅读 · 0 评论 -
封装--成员变量,访问修饰符和成员函数
基本概念:成员方法(函数)用来表现对象行为声明在类语句块中用来描述对象的行为规则和函数声明规则相同受到访问修饰符规则影响返回值参数不做限制方法数量不做限制注意:目前决定类内部的访问权限值类型 数字类型默认值为0 bool类型 false引用类型 默认为null 空基本概念:成员方法(函数)用来表现对象行为注意:1.成员方法不要加static关键字2.成员方法 必须是实例化出对象 再通过对象来使用 相当于该对象执行了某个行为3.成员方法 受到访问修饰符影响实例化出对象 再通过对象来使用 相当于该对象执行原创 2022-07-10 14:58:28 · 180 阅读 · 0 评论 -
封装--类和对象
面向对象 万物皆对象 用程序来抽象形容对象 描述对象 (属性 方法)面向对象三大特性: 封装,继承和多态。本文将介绍封装中的类和对象。一般声明namespace语句块中代码如下(示例):三、类声明的语法类的访问修饰符 修饰符 类名{类的成员}类的访问修饰符:用于设定对类的访问限制,包括 public、internal 或者不写,用 internal 或者不写时代表只能在当前项目中访问类;public 则代表可以在任何项目中访问类。修饰符:修饰符是对类本身特点的描述,包括 abs原创 2022-07-09 18:25:39 · 320 阅读 · 0 评论 -
C#中的三种参数传递
在 C# 中,有三种向方法传递参数的方式。1.值参数:调用方法时,会为每个值参数创建一个新的存储位置,复制参数的实际值给函数的形参。 按值传递--传递实参变量存储的内容作用:传递信息2.引用参数:引用参数是一个对变量的内存位置的引用,复制参数的内存位置的引用给形参。 按引用传递--传递实参变量自身的内存地址作用:改变数据3.输出参数:可以返回多个值。 按引用传递--传递实参变量自身的内存地址作用:返回结果输出参数与引用原创 2022-06-30 18:17:58 · 5765 阅读 · 0 评论