![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c#
mr.chenyuelin
纯属为个人笔记
展开
-
c#基础-20、深拷贝与浅拷贝
先说结论:浅拷贝,在修改类的属性时,值类型在栈上不是同一块内存空间(不变),而引用类型在堆上是同一块内存空间(改变)深拷贝,在修改类的属性时,值类型和引用类型都不会是同一块内存空间,跟原来没有关系了using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace test{ class Program转载 2021-05-23 21:29:54 · 167 阅读 · 0 评论 -
c#基础-19.重写(override)和覆盖(new)的区别
重写 override用 virtual 修饰的方法,叫虚方法。重写会改变父类方法的功能。覆盖 new在子类中用 new 修饰 定义的与父类中同名的方法,叫覆盖。覆盖不会改变父类方法的功能。代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace @override{ class An原创 2021-05-17 09:18:01 · 127 阅读 · 0 评论 -
c#进阶-12.特殊语法
目录var隐式类型设置对象初始值匿名类型可空类型内插字符串var隐式类型var是用来表示任意类型的变量,js里也有,c++11里的auto一样偷懒使用,用在不确定类型的时候注意:1.不能作为类成员,只能用于临时变量申明时,也就是写在函数中2.var必须初始化var a = 5;var s = "abc";设置对象初始值就是在实例化对象时设置成员变量的值,先调用构造函数,后执行大括号里的内容。我感觉用在忘记在构造函数里初始化了,然后临时增加比较方便class Test {原创 2021-03-09 15:06:26 · 204 阅读 · 0 评论 -
c#进阶-11.迭代器
迭代器(iterator)提供一种方法顺序访问一个聚合对象的元素,而不暴露内部的标识,是可以在容器上遍历访问的接口凡是可以用foreach遍历的类都实现了迭代器用法:using System;using System.Collections;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 迭代器{ #region 标准迭代器的使用 //接口:IEnumerable, IE原创 2021-03-09 11:47:44 · 97 阅读 · 0 评论 -
c#进阶-10.特性
特性概念用法:概念特性本质上是个类,利用特性类为元数据添加额外信息,之后通过反射来获取这些信息。用法:#define funcusing System;using System.Collections.Generic;using System.Linq;using System.Runtime.CompilerServices;using System.Diagnostics;namespace 特性{ //知识点4 限制自定义特性的范围 //参数一:Attribut原创 2021-03-08 14:26:06 · 111 阅读 · 0 评论 -
c#进阶-9.反射和关键类Type,Activator类,Assembly类
目录一些概念Type类一些概念1.程序集是由编译器得到的中间产物,一般为.dll和.exe的文件,程序集就是我们的一个代码集合,最终会被编译器翻译为程序集供别人使用2.元数据就是程序的类,类里的函数,变量。保存在程序集中3.反射是一个运行程序查看自己或其他程序的元数据的行为,作用就是程序运行时得到所有元数据,获取类型,来操作它们,提高程序拓展性Type类Type是访问元数据的主要方式,获取成员(如构造函数,成员函数,属性等)主要用法:class Test { priv原创 2021-03-07 14:27:51 · 365 阅读 · 0 评论 -
c#进阶-8.多线程
多线程是多个可以同时代码逻辑的“管道”,开启多线程,可以处理一些复杂的逻辑影响到主线程的流畅,比如寻路、网络通信。具体用法:class Program { static bool isrun = true; static object obj = new object(); static void Main(string[] args) { //1.创建线程 Thread t = .原创 2021-03-04 21:58:07 · 117 阅读 · 1 评论 -
c#进阶-7.协变和逆变
协变就是和谐的变化,逆变是不正常的变化//协变和逆变都是用来修饰泛型的 协变:out 逆变:in //只有泛型接口和泛型委托能使用 //用out修饰的泛型只能作为返回值 delegate T TestOut<out T>(); //用in修饰的泛型只能作为参数 delegate void TestIn<in T>(T t); class Father { } class Son:Father原创 2021-03-03 17:57:35 · 115 阅读 · 1 评论 -
c#进阶-6、List排序
共有3种:1.系统自带的类型,直接Sort();list.Sort();2.自定义类的排序//继承泛型接口来自定义排序 class item : IComparable<item> { public int money; public item(int money) { this.money = money; } public int CompareTo(item原创 2021-03-03 15:08:43 · 108 阅读 · 1 评论 -
c#进阶-5.匿名函数和lambad表达式、闭包
匿名函数就是没有名字的函数,基于委托和事件语法:delegate(参数列表){//逻辑};使用范围:1.函数中传递委托参数时2.委托或事件赋值时具体代码:class Program { static void Main(string[] args) { //无参无返回值 Action action = delegate () { Conso原创 2021-03-03 11:04:00 · 212 阅读 · 0 评论 -
c#进阶-4.泛型和泛型约束
目录1.泛型的概述和语法2.泛型约束1.泛型的概述和语法泛型的作用:1.不同类型对象的相同逻辑就可以用泛型2.泛型一定程度上可以避免拆箱和装箱//接口泛型 interface Testinterface<K> { K name { get; set; } } //需指明类型 class Test2 : Testinterface<string&原创 2021-03-02 12:09:44 · 226 阅读 · 0 评论 -
c#进阶-3.Stack和Queue
Stack、Queue都是是obect类型的,栈是先进后出FILO的特点,队列是先进先出的特点同样知道一些函数的用即可:需引入命名空间using System.Collections;栈的用法:static void Main(string[] args) { Stack stack = new Stack(); stack.Push(1); stack.Push("123"); sta原创 2021-03-01 12:07:45 · 109 阅读 · 0 评论 -
c#进阶-2.ArrayList、List、Hashtable、Dictionary
ArrayList是万物之父object类型的数组,就是可以存储任意类型的动态数组,但同时存在装箱和拆箱,所以ArrayList少用最重要就是它的增删改查的一些函数了:static void Main(string[] args) { ArrayList array = new ArrayList(); array.Add(1); array.Add("s"); array.Add(new原创 2021-03-01 11:26:31 · 182 阅读 · 1 评论 -
c#进阶-1.委托(delegate)与事件(event)
delegate定义语法基本使用委托可以装载多个函数系统自带的委托定义委托是函数方法的容器,可以理解为表示函数的变量类型,用来存储函数。委托本质是一个类,用来定义函数的类型(返回值和参数的类型),不同函数必须对应格式一致的委托,也就是返回值类型和参数要一致。语法访问修饰符 delegate 返回值 委托名(参数列表);一般写在namespace中,类外。基本使用namespace test2{ //委托申明 public delegate void Func1();原创 2021-01-14 20:51:44 · 176 阅读 · 0 评论 -
c#基础-18、类与结构体的区别
最大区别为结构体为值类型存在栈上,类为引用类型存在堆上。细节区别:1.结构体不具有多态、继承特性,只有封装,所以不能用protected修饰符,而类可以2.结构体变量在申明时不能初始化,而类可以(后面说明)3.结构体不能申明无参构造函数,而类可以4.结构体申明有参构造函数后,不会覆盖无参构造函数,而类会覆盖5.结构体不能申明析构函数,而类可以6.结构体要在构造函数中初始化所有成员变量,而类不用7.结构体不能在内部申明和自己一样的结构体变量,而类可以结构体虽然没有继承特性,但是可以继承接口。原创 2021-01-07 12:23:36 · 159 阅读 · 0 评论 -
c#基础-17.StringBuilder
StringBuilder为什么用StringBulder?StringBuider的使用string与StringBuilder的区别常用函数了解string,请点击这里为什么用StringBulder?例子:string a = "str_1";a = "str_2";在内存中创建"str_1"和"str_2"两个字符串,但只有"str_2"在被使用,"str_1"不会被修改或消失,这样就浪费了内存资源,而且字符串一旦创建就不可修改大小,每次使用System.String类中的方法之一时,原创 2021-01-05 12:23:15 · 125 阅读 · 0 评论 -
c#基础-基础-16.string
static void Main(string[] args) { string str = "123456456"; //正向查找(IndexOf) int index = str.IndexOf("234"); Console.WriteLine(index); //反向查找(LastIndexOf) index = str.LastIndexO原创 2021-01-03 22:42:03 · 286 阅读 · 0 评论 -
c#基础-多态-15、接口(interface)
接口用法接口继承接口显示实现接口用法接口为所有抽象行为的“基类”。 为什么这么说呢,比如飞机类和鸟类,两者没有关系,但是飞机和鸟都拥有飞这个行为,就都去继承飞这个接口,但两者飞的动作肯定也不一样,也是多态的体现。申明的规范:1.不能包含成员变量2.只包含方法,成员属性,索引器,事件3.成员不能被实现4.成员修饰符默认为public,不能为私有5.接口不能继承类,但是可以继承另一个接口6.类继承接口后,必须实现接口中所有成员特点:1.接口不能被实例化2.可以作为容器存储对象,也就是满足原创 2021-01-03 20:27:30 · 214 阅读 · 0 评论 -
c#基础-多态-14vob(virtual、override、base),抽象类
多态分为编译时多态和运行时多态。编译时多态就是函数重载和运算符重载。运行时多态就是通过虚函数实现的多态的目的:让同一对象在执行相同行为有不同表现。解决的物体:让同一对象有同一的行为特征。例子:class Father { public string name; public Father(string name) { this.name = name; } public virtual原创 2021-01-02 13:03:30 · 212 阅读 · 0 评论 -
c#基础-13.万物之父(object)和装箱、拆箱、密封类
概念:它是所有类型的基类,基于里氏替换原则,可以用object容器装任何物体。例子:static void Main(string[] args) { //引用类型,用as object son = new Son(); if(son is Son) { (son as Son).Speak(); } object原创 2021-01-02 12:08:02 · 435 阅读 · 1 评论 -
c#基础-继承-12.继承中的构造函数
特点:在子类对象实例化时,默认会先调用父类的构造函数,一直往上找父亲。从老祖宗开始执行,一代一代往下。例子:class GameObject { public GameObject() { Console.WriteLine("物体位置"); } } class Animal : GameObject { public Animal() { Co原创 2021-01-02 11:24:44 · 419 阅读 · 0 评论 -
c#基础-继承-11.里氏替换原则
c#中只能单继承。概念:父类容器装子类对象作用:方便对子类对象的管理使用:1.is 判断一个对象是否是指定类对象,是返回true,不是返回false2.as 将一个对象转化为指定类对象例子:class GameObject { } class Animal : GameObject { public int number; public void plane() { Conso原创 2021-01-02 10:32:53 · 255 阅读 · 0 评论 -
c#基础-10.扩展方法
概念:为非静态现有变量类型添加方法,如string、int作用:1.不需要在对象中重新写方法2.不需要继承来添加方法3.为别人封装的类型写额外的方法特点:1.一定写在静态类中2.一定是静态函数3.第一个参数为扩展目标,用this修饰...原创 2020-12-30 22:43:57 · 99 阅读 · 0 评论 -
c#基础-9.静态成员、静态类、静态构造函数
关键字:static特点:类名点出来使用(全局)生命周期:程序运行后一直存在,程序结束后才释放内存,因此静态成员具有唯一性。就是因为它的生命周期的特点,如果成员变量不具有唯一性,就不要频繁声明为static,否则堆内存因静态成员过多而溢出。注意:1.静态成员函数不能使用非静态成员成员2.非静态成员函数可以使用静态成员例子:class Test { public static float pi = 3.14f; public float a=3.14f;原创 2020-12-30 21:03:39 · 317 阅读 · 0 评论 -
c#基础-8.索引器
索引器的使用示例如下所示:class Person { private string name; private int number; //这里要分配空间,否则在索引器里f将不会完成对象的实例化 private Person[] f=new Person[5]; public Person() { } public Person(string name,int num原创 2020-12-30 20:21:36 · 97 阅读 · 0 评论 -
c#基础-7.成员属性(get和set)
作用:1.保护成员变量2.可以为成员变量添加逻辑定义方法:class Person { private int number; //首字母大写区别 public int Number { get { return number; } set { /*逻辑原创 2020-12-30 11:34:10 · 955 阅读 · 0 评论 -
c#基础-6.构造、析构函数和垃圾回收机制
目录构造函数构造函数的特殊写法析构函数(了解)垃圾回收机制构造函数基本内容不写了,学过c++或java都知道。构造函数的特殊写法通过this重用构造函数代码,结构为:public 类命():this(参数1,…);class Person { string name; int number; public Person(int number) { this.number = number;原创 2020-12-29 21:57:52 · 223 阅读 · 0 评论 -
c#基础-5.变长参数和参数默认值
1.变长参数关键字params作用:可以传入n个通类型参数注意:1.params后面必须是数组2.变长参数只能有一个3.必须在所有参数最后写变长参数static void setsole(params int[]res) { int sum = 0; for (int i = 0; i < res.Length; i++) sum += res[i]; Console.W原创 2020-12-28 21:46:36 · 476 阅读 · 0 评论 -
c#-4.ref和out
ref和out的相同点:一个对变量的内存位置的引用。使用 ref 和out关键字声明引用参数,当形参的值发生改变时,会影响实参的值,两者作用结果一样。 static void setsole(ref int b) { b = 3; } static void Main(string[] args) { int a = 1; setsole(ref a);原创 2020-12-28 21:09:02 · 71 阅读 · 0 评论 -
c#基础-3.值与引用类型
引用类型:string,数组,class类值类型:其他都是。以下均以数组为例,值类型与值类型在使用上的区别: int a = 10; int[] res = new int[]{ 1, 2, 3, 4 }; int b = a; int[] s = res; Console.WriteLine("a={0},b={1}", a, b); Console.WriteLine("re原创 2020-12-28 20:12:52 · 87 阅读 · 0 评论 -
c#基础-2.枚举
枚举类型基本概念在哪里声明枚举枚举的使用枚举的类型转换枚举的作用基本概念1.枚举是一个被命名的整形常量的集合,默认是int一般用它来表示状态、类型等等2.声明枚举语法枚举名 以E或E_开头 作为命名规范声明枚举:enum E_player{ runing=5, sit, walk,}枚举常量默认初值为0,后者固定在前者的值上累加1.在哪里声明枚举1.一般在命名空间namespace(常用)2.在class和struct中注意,枚举不能在函数里声明。枚举的使用申明枚举变原创 2020-12-27 22:47:21 · 136 阅读 · 0 评论 -
c#基础-1.可为空的值类型
可空类型的创建使用以下任何一种可互换形式引用具有基础类型 T 的可为空值类型:Nullable 或 T?。声明和赋值值类型可隐式转换为相应的可为空的值类型int m2 = 10;int? m = m2;检查可为空值类型的实例使用is运算符既检查 null 的可为空值类型的实例,又检索基础类型的值:int? a = 42;if (a is int valueOfA){ Console.WriteLine($"a is {valueOfA}");}也可用a.HasValue来原创 2020-12-27 19:51:37 · 519 阅读 · 0 评论