0 C# 基础知识
基础原理解析
arvinzd
把握当下,读书如豪饮
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
委托和事件
委托的定义是对被委托调用的一种规范定义,如返回值,参数等,可以看做是一个抽象方法。Func<参数类型,返回值类型> 委托对象=((参数)=>{具体实现});事件用event关键字,但在使用方面与委托一样,其中+=是订阅,是多播委托。Action<参数类型> 委托对象= ((参数)=>{具体实现});委托名 委托对象=delegate(参数){具体实现};委托名 委托对象=new 委托名(被调用的方法)委托名 委托对象=((参数)=>{具体实现});委托的定义与方法的定义类似,但委托是一种类型。原创 2024-09-26 19:23:21 · 248 阅读 · 0 评论 -
线程基础篇-线程同步
Lock是将一段代码定义为临界区,临界区中的代码在同一时刻只能有一个线程访问,当临界区代码执行时,其他线程调用会被阻塞,需等待资源释放。语法:private object locker=new object();void Method(){ lock(locker) { 代码块… }}注意:1 lock不能锁定空值2 lock不能string类型,因为字符驻留机制,无法被释放3 lock不能锁定值类型4 lock避免锁定public类型或不受程序原创 2021-04-15 09:16:04 · 210 阅读 · 0 评论 -
EF基础篇-Model First
Model First 是先有模型,再根据模型创建数据库,进行相关的数据操作1 新建一个控制台程序2 右键添加 新建项 选择如图的ADO.NET实体数据模型3 实体数据模型向导 选择如图空EF设计器模型4 模型构造 完成上一步后,得到如图的设计文件,右键或从工具箱中拖拽实体实体添加完成后得到如图的实体模型5 由模型构建数据库 右键选择“根据模型生成数据库”数据库连接部分6 打开数据库验证7 实例操作进行数据新增和查询 using (var scContext=new原创 2021-02-23 14:54:09 · 461 阅读 · 2 评论 -
线程基础篇-线程和进程
什么是进程进程是操作系统进行资源分配和调度的基本单位,进程是独立运行的程序进程的基本用法Process 是System.Diagnostics命名空间中的类常用属性常用方法实例应用什么是线程线程是进程的执行单元,一个进程至少包含一个线程多线程就类似排队买票,单线程只有一个窗口开放,多线程是多个窗口同时开放,但某一时刻只有一个线程在执行,因此多线程并不能提高程序的运行速度,但能提高程序的运行效率,提高CPU的使用率。线程的基本用法常用属性常用方法前台线程和后台线程前台线原创 2021-04-07 09:06:15 · 171 阅读 · 0 评论 -
EF基础篇-Code First
Code First 通过代码反向生成数据库,无需关心数据库方面1 新建一个控制台项目2 打开NuGet程序包管理,添加EntityFramework添加完成后查看是否有如下两个引用3 代码编写及配置新建Goods类 class Goods { [Key] public int GID { get; set; } public string GName { get; set; } public int GPrice { get; set; } public int S原创 2021-02-24 16:12:24 · 527 阅读 · 0 评论 -
EF基础篇-DB First
EDM entity data model 实体数据模型Conceptual models 概念模型Mappings 连接Storage models 存储模型Orm object relational mapping 对象关系映射DB first1 新建一个控制台程序2 右键点击添加,新建项,如图,选择ADO.NET实体数据模型3 模型配置选择来自数据库的EF设计器数据库连接配置和测试选择所需的表、视图,点击完成文件分析如图edmx文件是实体属性原创 2021-02-06 09:52:38 · 800 阅读 · 0 评论 -
LINQ基础篇(下)
分页 Skip Takevar query = DataSource.Skip((PageNo-1)*PageSize).Take(PageSize).ToList();Skip 跳过多少个元素Take取出多少个元素SkipWhile 逐一判断直到不满足条件,将该元素及其后的元素取出TakeWhile 逐一判断取出满足条件的元素Except语法 a.Except(b)作用 a中去除b中元素后剩余部分 List<string> strListA = new List<原创 2021-02-02 14:19:32 · 159 阅读 · 0 评论 -
LINQ基础篇(中)
聚合函数Max 最大值Min 最小值Sum 求和Average 求平均值Aggregate 自定义累计Count 统计元素个数LongCount 统计元素个数返回long型代码例子 List<int> tempList = new List<int> { 56,34,23,21,78,99 }; var maxValue = tempList.Max(); var minValue = tempList.Min(); var sumValue = tempLi原创 2021-02-01 09:47:27 · 265 阅读 · 2 评论 -
LINQ基础篇(上)
LINQLanguage Integrated Query 语言集成查询举个例子 int[] scores = new int[] { 65,50,45,90,87,65}; Console.WriteLine("高分有:"); //方法一 var highsore = from score in scores where score > 80 select score; var highscore2 = scores.Where(score =>原创 2021-01-27 08:41:41 · 184 阅读 · 0 评论 -
序列化和反序列化
serialize(序列化)和deserialize(反序列化)常用的两种序列化方法二进制和xmlBinaryFormatter代码示例[Serializable]public class Person{ public string name; public int age; [NonSerialized] public string sex; public void SayHi() { Console.WriteLine("我叫{0},今年{1}岁,我是{2}",t原创 2021-01-23 08:56:31 · 136 阅读 · 0 评论 -
抽象类和接口
抽象类abstract 修饰抽象类是一种比较特殊的类特殊性:1 不能被实例化2 抽象类可包含抽象方法和属性,也可以包含非抽象的成员,但抽象方法一定存在于抽象类中3 抽象基类的方法的抽象成员必须在具体派生类中重写(override)4 抽象类满足类的单一继承和继承传递性public abstract class Animal{ public void Eat() { Console.WriteLine("吃饭"); } public abstract void Run();原创 2021-01-20 14:22:42 · 120 阅读 · 0 评论 -
面向对象关键字-new virtual override base
virtual 虚拟的被virtual标记的方法或属性,本质上是在内存空间中做了定义,但其对应的地址是不固定的,是在运行时根据规则来判定的。A类对象名=new B类(),A类叫做申明类,B类叫做实例类规则:1 当调用方法时,先检查在申明类中该方法是否是virtual,如果不是虚方法则直接执行,如果是虚方法则需检查实例类。2 在实例类中检查是否有override该方法,如果有则直接调用该方法,如没有则在其父类中逐级查找,直到找到第一个override方法。注意 被virtual标记的方法被ove原创 2021-01-20 13:56:15 · 168 阅读 · 0 评论 -
面向对象三大特征之一多态
多态-不同对象作用于相同方法,呈现的结果不同表现形式为A类 对象名=new B类() A类和B类之间存在直接或间接的继承关系,A类叫做申明类,B类叫做实例类运行时多态:重载(overload)编译时多态:重写(override)重载:方法名相同,形参的类型个数顺序不同,只与形参有关,与返回值无关在这里插入代码片...原创 2021-01-20 11:26:07 · 114 阅读 · 0 评论 -
面向对象三大特征之一继承
继承-类似于现实世界中的子承父业,实现字段、属性、方法(构造方法例外)的继承,但私有的是无法访问的,将类和类之间进行关联,增加系统的耦合性,被继承的类-父类或基类,继承的类-子类或派生类。代码重用性-子类继承父类的非私有的成员代码例子 class People { private int _age; private string _name; public int Age { get;原创 2021-01-17 16:20:47 · 122 阅读 · 0 评论 -
面向对象三大特征之一封装
封装是对方法、字段、属性等成员的一种保护,是将客观的现实世界抽象为类、对象等,将操作等集中在一个类中,通过实例化的对象调用属性、方法,而不需要连接类内部的实现,且类内部的改变不会影响对象对属性、方法的调用C#中常用的修饰符public 公共的,人和地方都能访问private 私有的,只能在类内部访问(类中的成员默认是私有的)protected 受保护的,类内部和子类中能访问internal 内部的,在程序集(命名空间)中可以访问(类默认是内部的,可以修改为公共的)封装最常见的例子是属性对字段的保原创 2021-01-17 11:39:16 · 156 阅读 · 0 评论 -
string和StringBuilder
string 字符串定义语法:string s=”abc” string str=newstring(new char[]{‘a’,’b’,’c’})string和Stringstring is an alias for String in the .Net Frameworkstring 是String的别名,string是C#的类型,String是.Net Framework的类型string经过编译变成String,为了符合语法,建议使用stringImmutable字符串不变性代原创 2021-01-17 09:04:06 · 176 阅读 · 0 评论 -
const和readonly
常量的定义常量一经赋值不能再改变其值const 静态常量在类型前加const修饰,在定义时为其赋值,因为在静态常量是在编译时进行解析,将常量的值替换初始值readonly 动态常量在类型前加readonly修饰,定义时默认有初始值,在运行时可进行赋值由于const修饰是静态常量,所以被static修饰时会报错const 可以修饰类中和方法中的成员,而readonly只能修饰类中成员public static const int num = 1;public static readonly原创 2021-01-17 11:25:51 · 163 阅读 · 1 评论 -
无法逃避的装箱和拆箱
概念装箱:由值类型转换为引用类型拆箱:由引用类型转换为值类型代码解析逐步分析以上代码:1 int i=5; 在栈中新建变量i,值为52 object o=i;在堆中新建变量o,储存实际值5,并将5在堆中的地址储存在栈中3 int j=(int)o;在栈中新建变量j,通过栈中o的地址访问对应内存的值,并将该值储存在栈中j的地址上图解补充从代码分析和图解可以看出装箱和拆箱存在以下问题:1 占用空间,装箱和拆箱在堆和栈上开辟空间,已占用的空间无法及时回收2 性能影响,拷贝占用CPU,额原创 2021-01-17 08:33:20 · 374 阅读 · 1 评论 -
C#中的堆和栈
什么是栈?什么是堆?什么是值类型?什么是引用类型?值类型中的引用类型,引用类型中的值类型。栈(stack)概念:内存中连续存放的区域,空间小,速度快,存取按先进后出(FILO First In Last Out)比如一叠盘子,存:一个个的堆叠,取:从上取存取:主要是值类型和引用类型的地址等值类型概念:继承于System.ValueType,它是System.Object的子类一般存放于栈中主要值类型准确的说值类型的存放与定义的区域有关,在值类型(struct)中定义的引用类型是存放在原创 2021-01-16 17:00:09 · 507 阅读 · 0 评论 -
ref、out和params
值传递和引用传递形参:方法定义处定义的参数实参:方法调用时提供的参数值传递:方法传递值,值传递实参和形参都会在栈中占用内存,相互之间并不影响,而是形参限制了实参的类型,形参作为临时变量在调用结束后即销毁。引用传递:方法传递引用,引用传递实参和形参在堆中占用同一块内存,形参的改变会影响实参的值。例子: public static bool Test(int i,string s) { i = i + 2; s = (i + 5).To原创 2021-01-17 11:05:46 · 224 阅读 · 0 评论 -
GC原理知多少
GC (Garbage Collector) 垃圾回收器 GC是对内存的管理,计算机的内存是有限的,早期的C/C++是没有GC的,需要编程者手动回收内存,主要是那时候内存小,程序员重视对内存的管理,但是也存在内存回收时机和忘记回收的问题,会造成内存泄露的灾难。 随着Java的JVM对内存的管理的发展,以及随之而来的CLR对内存的管理,在内存管理上,逐步解放程序员的对内存的管理,使程序员可以将精力集中在功能实现等方面,但是GC存在两个问题:1 GC不能回收非托管代码(stream文件原创 2021-01-16 16:53:59 · 260 阅读 · 0 评论 -
分不清IEnumerable和IEnumerator
首先看几个单词Enum 枚举类型IEnumerator 枚举器IEnumerable 可枚举从单词上大概可以看出IEnumerator是实际枚举器查看源码源码分析:1 IEnumerable接口仅定义了一个返回IEnumerator类型的GetEnumerator方法2 IEumerator接口定义了三个方法,Current获取当前的对象返回Object类型,MoveNext指针下移,Reset将指针重置3 IEnumerator才是真正的集合遍历器,为了实现集合对象的遍历,必须实现IE原创 2021-01-17 09:32:55 · 162 阅读 · 0 评论 -
struct和class异同
struct 和 class的异同一图理解struct和class的异同1 相同点A struct和class是同一等级的,属于命名空间下B 可以定义字段、属性、方法、构造器等C 有默认的无参构造方法2 不同点A 定义语法关键字不同(struct class)B struct是值类型,class是引用类型,struct存储在栈中,但其中定义的引用类型是存储在堆中的C struct中字段不能赋初始值,class中字段没有影响D struct不能定义无参数的构造方法,且在有参构造函数中必原创 2021-01-17 09:23:25 · 1617 阅读 · 0 评论 -
C# 编译运行原理
CSC.exe是.Net Framework 下的编译器作用:将C#源程序编译程序集,程序集指EXE或DLL文件编译过程进行语法检查和程序分析MSIL IL CIL 三者是同一概念,IL(Intermediate Language)微软中间语言,它介于汇编语言和高级语言JST(Just in Time)即时编译器作用:将MSIL编译成本机指令,实际是优化以匹配操作系统和CPUCLR(Common Language Runtime)公共语言运行时,是.Net 框架的核心之一,本质是一段驻留在内存中原创 2021-01-16 16:49:13 · 701 阅读 · 0 评论
分享