
C#
文章平均质量分 61
C#学习笔记
Hello Bug.
记录一点点
展开
-
C#字典底层原理
Dictionary是一种键值对的形式存放数据,即 key和value一一映射。key的类型没有限制,可以是整数、字符串甚至是实例对象原创 2024-04-21 17:49:09 · 2439 阅读 · 0 评论 -
C#中i++和++i的底层原理
我们都知道,i++是先取值,后计算。++i是先计算,后取值。下面说下它的底层原理i++先入栈再+1,++i先+1再入栈。原创 2023-07-31 14:13:29 · 1380 阅读 · 0 评论 -
C#中的深拷贝和浅拷贝
深拷贝:一个对象深拷贝的时候,无论是引用类型对象还是值类型对象,都会创造一个全新的对象,新产生的对象和老对象没有关系浅拷贝:一个对象浅拷贝的时候,对于对象的值类型成员,会复制其本身,对于对象的引用类型成员,仅仅复制对象引用总结来说深拷贝和浅拷贝对于引用类型的处理不同,引用类型在浅拷贝时,拷贝的是对象的引用,引用类型在深拷贝时,拷贝的是完整的一份对象。原创 2023-03-16 15:14:16 · 1649 阅读 · 0 评论 -
C#中的String和StringBuilder
String和StringBuilder都是引用类型。StringBuilder是可变的字符串,它不会创建当前字符串的新修改实例而是在现有字符串对象中进行修改。String是不可变字符串,一旦被初始化后就不能改变其内容,String值改变的过程其实是创建了一个新的String对象赋值给了原对象(引用的改变)如果有大量的字符串修改、拼接操作则使用StringBuilder会极大的减少系统的开销。原创 2022-12-25 11:06:14 · 2693 阅读 · 0 评论 -
C#中的Socket
一:什么是Socket?通过ip地址知道哪个计算机,通过端口号0-60000知道哪个计算机中的哪个软件原创 2021-11-08 22:06:03 · 11451 阅读 · 1 评论 -
C#中的协变与逆变
一:什么是协变与逆变协变指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,逆变指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型只有泛型接口和泛型委托参数支持协变和逆变二:引言using System;using System.Collections.Generic;class MainClass{ static void Main() { object o = "str"; List<object&g.原创 2021-10-26 18:20:33 · 5107 阅读 · 1 评论 -
C#中的LINQ
一:什么是LINQ二:用法——where:查询特定条件using System;using System.Collections.Generic;using System.Linq;class MainClass{ static List<Person> personList = new List<Person>() { new Person(){ Id=1,Name="小明",Age=20,Score=100},原创 2021-10-09 17:44:05 · 27028 阅读 · 2 评论 -
C#中的多线程
一:线程与进程对于所有需要等待的操作,例如移动文件,数据库和网络访问都需要一定的时间,此时就可以启动一个新的线程去执行这些耗时的操作,一个进程的多个线程可以同时运行在不同的CPU上或多核CPU的不同内核上。一个进程至少包含一个线程,一个应用程序启动,一般会启动一个进程,然后进程启动多个线程前台线程与后台线程:只要有任何一个前台进程在运行那么应用程序的进程就会在运行,默认情况下使用Thread创建的线程都是前台线程,使用线程池创建的线程都是后台线程,使用Thread创建的线程可以通过Thread.I原创 2021-10-03 10:08:48 · 9835 阅读 · 0 评论 -
C#中强化ChangeType方法使其支持枚举类型转换
一:前言反射操作时经常需要类型转换操作,但System.Convert.ChangeType不支持枚举类型的转换这是因为ChangeType的value必须实现IConvertible接口,所以强化一下ChangeType方法使其支持枚举类型的转换二:代码实现using System; /// <summary>/// 转换工具/// </summary>public static class ConvertUtils{ /// <summa原创 2021-08-20 15:39:52 · 2660 阅读 · 0 评论 -
C#中的反射
一:什么是反射通俗来讲,反射就是我们在只知道一个对象的外部而不了解内部结构的情况下,通过反射可以使我们明确这个对象的内部实现反射是.Net中获取运行时类型信息的一种方式,.Net应用程序由几个部分组成:程序集(Assembly)、模块(Module)、类型(Class)。而反射提供一种编程的方式,可以在程序运行期获得这几个组成部分的相关信息二:反射的作用利用反射可以在不需要使用new关键词的情况下,就可以动态创建对象,使用对象三:反射是如何实现的反射的内部实现依赖于元数据元数据简单来原创 2021-08-06 16:00:11 · 16642 阅读 · 1 评论 -
C#中的特性
一:前言通过特性与代码(程序集、类型、方法、属性等)相关联。特性与程序实体关联后,即可在运行时使用反射技术查询特性可以通过使用特性向程序添加声明性信息,一个声明性标签是通过放置在它所应用的元素前面的方括号[ ]来描述的二:使用——Conditional可以为一个方法添加Conditional特性使这个方法的执行依赖于指定的预处理标识符#define Debugusing System;using System.Diagnostics;class MainClass{原创 2021-08-04 11:08:25 · 4013 阅读 · 0 评论 -
C#中的==、Equal、ReferenceEqual
一:前言C#中==、Equals、ReferenceEquals都可以用于判断两个对象的个体是不是相等二:==运算符——对于值类型,比较的是两个对象的代数值是否相等,比较时会自动进行类型转换(自定义值类型需要重载运算符后才可以使用==比较)——对于引用类型,比较的是两个对象的引用(string类型比较的是值)private void Awake(){ int a = 1; long b = 1; Debug.Log(a == b);//true str原创 2021-07-01 18:03:49 · 3313 阅读 · 0 评论 -
C#中获取枚举类的描述特性
using System;using System.ComponentModel;using System.Reflection;/// <summary>/// 枚举类扩展/// </summary>public static class EnumExt{ /// <summary> /// 转换为Description /// </summary> public static string ToDescri.原创 2021-05-04 23:11:47 · 2806 阅读 · 0 评论 -
C#中的partial关键字
一:使用场景——多人合作编写一个类——类的作用特别大,不宜放在一个文件中实现——类中一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起二:将类进行拆分在C#语法中,同一命名空间下的类名不能重复但是使用partial关键字可以将一个类拆分成多个分部类三:将方法进行拆分使用partical关键字可以将方法的声明和实现进行拆分...原创 2021-03-09 23:28:34 · 3132 阅读 · 0 评论 -
C#中的装箱和拆箱
一:定义装箱与拆箱就是值类型与引用类型的转换,是值类型和引用类型之间的桥梁装箱是将值类型转换为引用类型,拆箱是将引用类型转换为值类型与拆箱比较,装箱的性能消耗更大,不光拷贝数据还需要开辟内存空间二:装箱的过程int i = 1;object o = i;装箱就是生成图中除了一开始i=1的变量之外另外两块变量的过程(开辟新内存空间+拷贝数据)三:拆箱的过程int i = 1;object o = i;int b = (int)o;创建一个新的对象b,并将拆箱获得的原创 2020-11-23 13:01:27 · 2610 阅读 · 0 评论 -
C#中的正则表达式
一:什么是正则表达式正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符以及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。简写为regex二:语法规则——基本匹配"the" => The car parked in the garage"The" => The car parked in the gara...原创 2020-04-14 17:42:23 · 2149 阅读 · 0 评论 -
Visual Studio批量删除所有注释
——上方工具栏—搜索—在文件中替换(或者Command+Shift+H)——勾选上正则表达式搜索,查找 //.*\n,替换为空即可原创 2020-04-13 16:12:42 · 9752 阅读 · 2 评论 -
C#中的命名空间
一:什么是命名空间命名空间是为了让一组名称与其他名称分隔开,在一个命名空间中声明的类名与另一个命名空间中声明的相同的类名并不冲突例如计算机系统中,一个文件夹中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但是不同的文件夹中文件可以重名二:示例namespace space1{ class MainClass {}}namespace space2...原创 2020-01-31 11:46:42 · 2416 阅读 · 0 评论 -
C#中的多态性
C#语言三大特性:继承,封装,多态一:多态性多态是指一个行为具有多个不同表现形式的能力,在C#中通过多态性的检测时机可以分为静态多态性和动态多态性静态多态性:函数重载和运算符重载动态多态性:抽象方法、重写方法、隐藏方法二:函数重载(overlode)——函数名必须相同——函数参数类型不同——函数参数个数不同——函数参数顺序不同三:抽象(abstract)—...原创 2020-01-30 19:24:10 · 4215 阅读 · 0 评论 -
C#中的ref、out、params关键字
一:引用参数ref在C#中对于值类型的参数传递,传递的都是值,但是加上ref参数后就变成了引用传递,也就是说没有ref传递的是值,有ref传递的是值的地址using System;class Test{ //值传递 static void Swap(int x, int y) { int temp = x; x = y; ...原创 2020-01-30 10:40:30 · 3169 阅读 · 2 评论 -
C#中的static
一:为什么要有静态变量C#中没有全局变量的概念,所有的变量必须由该类的实例进行操作,这样做是为了提升安全性,但是有些时候会显得很不方便,所以引入了静态变量二:静态变量与非静态变量的区别——静态变量是通过类名去访问的非静态变量是当该变量所在的类被实例化后,通过实例化的对象名访问——静态变量是全局变量,被所有类所共享,即一个类中改变了这个静态变量后,其他类读到的就是变化后的值...原创 2020-01-29 16:38:55 · 3740 阅读 · 0 评论 -
C#中的常量
一:常量与变量——变量:是指在程序的运行过程中随时可以发生变化的量——常量:可以当做常规的变量,只是他们的值在定义后不能再被修改,常量可以是任何的基本数据类型,比如整型,浮点型,字符串型,Class等二:两种写法——静态常量(const)using UnityEngine;public class Test : MonoBehaviour{ public cons...原创 2020-01-22 17:50:59 · 4501 阅读 · 0 评论 -
C#中的泛型
泛型:通过参数化代码来实现同一个代码上操作多种类型,利用参数化类型将类型抽象化,体现了复用性C#中的集合类就是泛型最典型的应用一:泛型类定义一个类A,但是这个类中的某些字段的类型是不确定的,这些字段的类型需要在类被构造出来才确定下来 二:泛型方法定义一个方法Methon,但是方法中的参数类型是不确定的,当调用这个方法时函数的参数类型才确定下来 ...原创 2019-09-06 13:55:36 · 2126 阅读 · 0 评论 -
值类型与引用类型
一:C#语言中的数据类型C#的数据类型分为两类:值类型(基本的数据类型)和引用类型值类型:byte,int,float,bool,struct.....引用类型:string,数组,自定义的类,内置的类.....二:堆和栈我们把内存分为堆空间和栈空间栈空间比较小,但是读取速度快堆空间比较大,但是读取速度慢栈只能从栈顶插入或删除元素,类似于桶装的薯片,先进后出堆能够以任意顺序...原创 2019-09-04 19:48:38 · 3795 阅读 · 1 评论 -
C#中的接口
一:什么是接口面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分——接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则必须能……”的理念。例如人都能吃饭,即“如果你是人,则必须能吃饭”。那么模拟到计算机程序中,就应该有一个IPerson接口,并有一个方法叫Eat()...原创 2019-09-04 10:44:37 · 1999 阅读 · 1 评论 -
C#中的属性
一:字段与属性的概念字段:又称为成员变量,一般在类的内部做数据交互使用,一般使用private作修饰但在一些情况下,我们需要限制字段的赋值范围,或是要求字段只读或只写,或是在改变字段时希望改变对象的其他一些字段值,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块,set块和get块,set块负责属性的写入工作,get块负责属性的读取工作属性:——外界访问私有字段的入...原创 2019-09-03 10:03:08 · 4773 阅读 · 0 评论 -
C#中的构造函数
当我们需要对一个类中的字段进行初始化时,可以这样做:显然很麻烦,使用构造函数可以简单很多:class Weapon{ public int id; public string name; public int price; public Weapon() { Console.WriteLine("无参构造函数被调用"); ...原创 2019-09-02 16:42:58 · 13270 阅读 · 0 评论 -
C#中的异常处理
一:错误类型——语法错误:容易解决,IDE会提示——逻辑错误:需要通过Debug或者打断点进行调试二:异常处理的语法对于一段代码段:——try块只能有一个(在try块中如果有一行代码发生异常,那么try块中剩余的代码都不会执行)——catch块可以有一个或多个——finally块只能有一个(是否捕获到异常都会执行finally块)——catch块和finally块至少有一个...原创 2019-09-02 15:34:32 · 2010 阅读 · 0 评论 -
Visual Studio的断点调试
一:使用断点鼠标单击需要打断点行的最前面,显示一个红色的实心圆圈,即代表打了断点,再次点击红色的实心圆圈即取消断点点击运行程序,程序将会暂停在断点处点击工具栏的进行一步一步的断点调试逐语句会一句一句地执行,遇到函数会进入到函数内逐过程遇到函数不会进入到函数内,而是把函数当做一条语句执行二:断点调试的几个窗口点击运行后将会出现以下窗口,若窗口没有显示则选择调试——断点——相应的...原创 2019-08-30 16:12:09 · 3518 阅读 · 0 评论 -
C#中的委托和事件
一:定义——委托是一种存储函数引用的类型——就像我们定义一个string str一样,这个str变量就是string类型,因为C#中没有函数类型,但是可以定义一个委托类型,把一个函数赋给这个委托——委托的定义与函数的定义类似,需要加上delegate关键字但是不需要函数体——委托与枚举体,结构体等一样,需要先定义,再声明,再使用——当我们给一个委托的变量赋值时,返回值与参数必须与定义的委托...原创 2019-08-28 18:08:06 · 11479 阅读 · 1 评论 -
C#练习题
一:求1000以内所有的完数,并输出所有因子(完数:一个数恰好等于它的所有因子之和)因子和因数:因子不包括数本身,因数包括数本身using System;class MainClass{ public static void Main(string[] args) { for (int i = 1; i <= 1000; i++) ...原创 2019-08-27 17:17:03 · 3021 阅读 · 0 评论 -
C#中的数据类型与类型转换
一:电脑是用什么来存储所使用的数据这个问题用一句话比较笼统的概括,那就是:电脑使用内存来记忆计算时所使用的数据在现实生活中的数据各种各样,整数、小数、字符串、字符等等,它们都类型是不一样的,所以你要想在计算机中使用这些类型,就必须在内存中为它申请一块合适的空间二:基础数据类型首先要了解一点:C#认可的基础数据类型并没有内置于C#语言中,而是内置于.net Framework中(例如在...原创 2019-08-01 18:38:05 · 2828 阅读 · 1 评论 -
C#中的扩展方法
当我们需要从一个字典中取得值时,需要先定义一个out的变量,再用TryGetValue方法传入键去判断是否取得字典的值:可以定义一个字典的扩展类把两句规整为一句:using System.Collections.Generic;/// <summary>/// 对字典类的扩展/// </summary>public static class D...原创 2019-05-27 19:58:36 · 2935 阅读 · 0 评论 -
语言中的溢出
语言中的溢出分为缓冲区溢出,内存溢出和数据溢出。最常见的就是数据溢出,当要表示的数据超出计算机所使用的数据类型所能够表示d的范围时,就会产生数据的溢出假如有一个需求:计算从0到10,0到100,0到1000,0到10000,0到100000的和using System;class Program{ static void Main(string[] args) ...原创 2019-05-05 23:41:09 · 2866 阅读 · 0 评论 -
C#中$符号的作用
—使用Format格式化这种写法,需要自己在字符串中写占位符(标记),在后面跟上参数。但是如果要格式化的参数比较多,写起来就比较麻烦。因为C#是美国人发明的,所以用$符号,那么如果是中国人发明的C#或许这个语法糖就使用¥符号了吧.....$符号的作用相当于对String.format()的简化。——由代码显然可见第一种写法复杂麻烦,使用起来是不方便的。——使用$语法糖的写法可读性高,代码简洁。——注意$与第一个"之前不能有空格。原创 2019-04-25 00:21:54 · 14056 阅读 · 0 评论 -
C#中@符号的作用
一:原意输出字符串如果要加载指定文件目录中的文件时,需要使用文件的路径,例如D:\\User\\text.txtusing System;class Program{ static void Main(string[] args) { string path = "D:\\User\\text.txt"; Console.WriteL...原创 2019-04-23 23:48:37 · 3917 阅读 · 2 评论 -
C#中的的输入与输出
一:Console.Read()using System;class Test{ static void Main(string[] args) { int inputNum = Console.Read(); Console.WriteLine(inputNum); }}读取用户输入的第一个字符(如果输入一个字符串则只读...原创 2019-04-23 15:34:03 · 9629 阅读 · 0 评论 -
基础知识——常用单位介绍
一、计算机中的常用单位——位(比特位):bit(b)存放一位二进制数,即只能存储0或1,是计算机中最小的存储单位。——字节:Byte(B)8个二进制位为一个字节(8位是一个字节),是计算机存储的基本单位。一般一个英文字母占一个字节,一个汉字占两个字节,同样的,一个英文标点占1字节,一个中文标点占2字节。数据存储多以字节为单位,数据传输多以位为单位——字:word计...原创 2019-04-16 23:24:02 · 3087 阅读 · 0 评论 -
基础知识——进位制
一:什么是进位制?进制也就是进位计数制,是人为定义的带进位的计数方法,也有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正字计数法,以及外国人常用的tally mark计数(四条竖杠和一条斜线)基数:某数字可以使用的数码个数,通俗说就是这个数字有多少位。数码:一组用来表示某种数制的符号,这个数字可以由什么数字组成。二:常见的进位制十进制,二进制,八进制,十六进制...原创 2019-04-03 00:16:03 · 11664 阅读 · 1 评论 -
关于NaN的问题
NaN:Not a Number一些简单的计算例子:0 / 0 = NaN1 + NaN = NaN2 * NaN = NaN1 / NaN=NaN——可以说任何数涉及到与NaN的计算都会被直接同化因为c是NaN所以整个的计算都会受到影响——NaN与任何值都不相等,包括NaN本身结束为false——只有0除以0才是NaN。结果为NaN结果为...原创 2019-03-19 13:13:28 · 3942 阅读 · 0 评论