![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C# 笔记从入门到放弃
文章平均质量分 95
C# 从入门到放弃,记录每次学习的笔记
sufengmarket
这个作者很懒,什么都没留下…
展开
-
CLR C#--计算型异步操作
线程池的代码从这个队列中提取记录项,将这个记录项派发(dispatch)给一个线程池线程。构造好一个CanceUationTokenSource(一个引用类型)之后,可从它的Token属性获得一个或多个CancellationToken(—个值类型)实例,并传给你的操作,使操作可以取消。线程池是你的应用程序能使用的线程集合。线程池是启 发式的。如果你的应用程序发出请求的速度超过了线程池线程处理它们的速度,就会创建额 外的线程。如果你的应用程序向线程池发出许多请求,线程池会尝试只用这一个线程来服务所有请求。原创 2022-09-30 15:39:30 · 609 阅读 · 0 评论 -
CLR C#--线程基础
出于 对安全的考虑,针对从用户模式的代码传给内核的任何实参,Windows都会把它们从线程的用户模式栈复制到线程的内核模式栈。Windows的一个策略是,任何时候在进程中创建线程,都会调用进程中加载的所有非托管DLL的DllMain方法,并向该方法传递DLL_THREAD_ATTACH标志。所以,应该用前台线程执行确实想完成的任务,非关键性任务则使用后台线程,比如重新计算电子表格的单元格,或者为记录建立索引等。我们知道,每个AppDomain都可运行一个单独的应用程序,而每个应用程序都有自己的前台线程。原创 2022-09-30 11:31:33 · 493 阅读 · 0 评论 -
CLR C#--引用类型和值类型
第一步获取己装箱Point对象中的各个Point字段的地址。这个过 程称为拆箱(unboxing)o第二步将字段包含的值从堆复制到基于栈的值类型实例中。拆箱的代价比装箱低得多。拆箱其实就是获取指针的过 程,该指针指向包含在一个对象中的原始值类型(数据字段)。其实,指针指向的是已装箱 实例中的未装箱部分。最后一行,C#编译器生成一条1L指令对0拆箱(获取己装箱实例中的字段的地址),并生成另一条IL指令将这些字段从堆复制到基于栈的变量p中.设计自己的类型时,要仔细考虑类型是否应该定义成值类型而不是引用类型。原创 2022-09-29 19:44:41 · 533 阅读 · 0 评论 -
CLR C#--类型基础
然后,代码在类型对象的方法表中查找引用了被调用方法的记录项,对方法进行JIT编译(如果需要的话),再调用JIT编译好的代码。这造成在托管堆创建Manager类型的一个实例(也就是一个Manager对象)在调用类型的构 造器(本质上是可能修改某些实例数据字段的方法)之前,CLR会先初始化同步块索引,并 将对象的所有实例字段设为nuU或0(零)。再假定数据库指出Joe是公司的 一名经理,所以在内部,Lookup方法在堆上构造一个新的Manager对象,用Joe的信息初始化它,返回该对象的地址。原创 2022-09-29 17:24:37 · 517 阅读 · 0 评论 -
C#基础--异步编程
BeginXXX方法接受其同步方法的所有输入参数, EndXXX方法使用同步方法的所有输出参数,并按照同步方法的返回类型来返回结果。使用异步模式时, BeginXXX方法还定义了一个AsyncCallback参数,用于接受在异步方法执行完成后调用的委托。在有些情况下,如果一个异步方法依赖另一个异步方法的结果, await关键字就非常有用。例如,某方法可以有一个路径,其中数据 是从一个具有异步API的服务中检索出来的。基于任务的异步模式指定,在异步方法名后加上Async后缀, 并返回一个任务。原创 2022-09-26 15:34:55 · 2326 阅读 · 0 评论 -
C#基础--错误和异常
这个示例称为SolicitColdCall,它包 含两个嵌套的try块,说明了如何定义自定义异常类,再从try块中抛出另一个异常。} if(!return;_fs?原创 2022-09-26 11:59:07 · 2062 阅读 · 0 评论 -
C#基础--函数编程
从面向对象的观点来看,最好总是使用具体的类型和接口来解决问题。可以使用本地函数,而不是使用仅一 个地方需要的私有方法。为此,只需要从前面的代码示例中删除元组变量,并在括号中定义变量名。使用数组可以组合相同类型的对象,而元组允许使用类型的不同组合。另一个使用本地函数的场景是递归调用,如下面使用Quicksort方法的示例所示。如果需要与泛型相匹配的模式,则需要将编译器配置为至少C# 7.1 C# 7.1为泛型添加了模式匹配。可以使用圆括号声明一个元组,并使用通过括号创建的元组字面量来初始化。原创 2022-09-25 22:31:21 · 859 阅读 · 0 评论 -
C#基础--LINQ
LINQ(Language Integrated Query,语言集成查询)在C#编程语言中集成了查询语法,可以用相同的语法访问 不同的数据源。LINQ提供了不同数据源的抽象层,所以可以使用相同的语法。Team这个类仅包含车队冠军的名字和获得冠军的年份。与赛车手冠军类似,针对一年中 最好的车队也有一个冠军奖项Formulal类在GetChampions()方法中返回一组赛车手。这个列表包含了 1950—2016年之间的所有一级方程式冠军Championship类型。该类包含冠军年份以及该年原创 2022-09-25 12:01:10 · 1491 阅读 · 0 评论 -
C#基础--特殊的集合
WPF定义的,这样UI就可以得知集合的变化,通用Windows应用程序使用它的方式相同。这个类的名称空间 是System.Collections. ObjectModeloObservableCollection类派生自Collection基类,该基类可用于创建自定义集合,并在内部使用Ust 类。不变的集合很容易在多个线程中使用,因为它们不能改变。如果希望使用应在多个线程中改变的集合,.NET 在名称空间System.Collections.Concurrent中提供了几个线程安全的集合类。原创 2022-09-25 08:59:23 · 291 阅读 · 0 评论 -
C#基础--集合
除了使用IndexOf()方法搜索指定的元素之外,还可以搜索有某个特性的元素,该特性可以用Findlndex() 方法来定义。在插入一个元素时,只需要修改 上一个元素的Next引用和下一个元素的Previous引用,使它们引用所插入的元素。O(logn)表示操作需要的时间随集合中元素的增加而增加,但每个元素需要增加的时间不是线性的,而是呈 对数曲线。按索引删除比较快,因为必须在集合中 搜索要删除的元素。Remove()方法先在集合中搜索,用IndexOf()方法获取元素的索引,再使用该索引删除元素。原创 2022-09-24 08:17:08 · 1727 阅读 · 0 评论 -
C#基础--字符串和正则表达式
在占位符 中,格式字符串跟在表达式的后面,用冒号隔开。StringBuilder类则不同,每次操作都是对自身对象进行操作,而不是生成新的对象,其所占空间会随着内容的增加而扩充,这样,在做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。StringTormat方法的第一个参数接受一个格式字符串,其中的占位符从0开始编号,其后是放入字符串空白处的参数。重复修改给定的字符串,效率会很低,它实际上是一个不可变的数据类型,这意味着一旦对字符串对象进行了 初始化,该字符串对象就不能改变了。原创 2022-09-22 16:06:00 · 1102 阅读 · 0 评论 -
C#基础--委托、lambda表达式和事件
Actioni3用带一个参数的方法,Action调用带两个参数的方法,Action调用带8个参数的方法。Func委托类型可以调用带 返回类型且无参数的方法,Func调用带一个参数的方法,Func调用带4个参数的方法。匿名方法是用作委托的参数的一段代码。原创 2022-09-22 14:19:54 · 3202 阅读 · 0 评论 -
C#基础--数组
get;set;get;set;} } //调用 Person [ ] myPersons = new Person [ 2 ];注意:如果数组中的元素是引用类型,就必须为每个数组元素分配内存。实现IComparable接口的CompareTo()方法,如果比较的对象相等,则该方法返回0,如果该实例应排在参数对象的前面,则返回小于0的值。反之返回大于0的值。//因为lastName属性是string简单类型,因此具有CompareTo()方法 if (result == 0) {原创 2022-09-20 19:31:13 · 741 阅读 · 0 评论 -
C#基础--运算符和类型强制转换
自定义索引器不能使用运算符重载语法来实现,但是它们可以用与属性非常相似的语法来实现。get;get;get;get;get;get;get;} }C#允许定义自己的数据类型(结构和类),这意味着需要某些工具支持在自定义的数据类型之间进行类型强制转换。方法是把类型强制转换运算符定义为相关类的一个成员运算符。原创 2022-09-20 11:42:04 · 2959 阅读 · 0 评论 -
C#基础--泛型
泛型允许我们延迟编写类或方法中的参数类型,直到在程序中使用它的时候,模块内高内聚,模块间低耦合。原创 2022-09-19 18:07:51 · 1217 阅读 · 0 评论 -
C#基础--继承
单重继承:表示一个类可以派生自一个基类。C#就采用这种继承。多重继承:多重继承允许一个类派生自多个类。C#不支持类的多重继承,但允许接口原创 2022-09-18 21:35:43 · 1297 阅读 · 0 评论 -
C#基础--对象和类型
类包含成员,成员可以是静态成员或实例成员。静态成员属于类,实例成员属于对象。静态字段的值对每个对象都是相同的。而每个对象的实例字段都可以有不同的值。静态成员关联了static修饰符。成员的种类如下字段是与类相关的变量,一旦实例化PhoneCustomer对象,就可以使用语法Object.FieldName来访问这些字段,如下例所示:只读字段为了保证对象的字段不能改变,字段可以用readonly修饰符声明。带有readonly修饰符的字段只能在构造函数中分配值。它与const修饰符不同。编译器通过co原创 2022-09-16 17:47:54 · 1706 阅读 · 0 评论 -
C#基础---变量、常量、数据类型
在这里,data_type 必须是一个有效的 C# 数据类型,可以是 char、int、float、double 或其他用户自定义的数据类型。variable_list 可以由一个或多个用逗号分隔的标识符名称组成。顾名思义,常量是其值在使用过程(生命周期)中不会发生变化的变量。原创 2022-09-14 16:49:39 · 1489 阅读 · 0 评论 -
多线程编程学习系列之---Mutex类
代码static void Main(){ //定义一个互斥量 const string MutextName = "CSharpThreadingCookbook"; using (var m = new Mutex(false, MutextName)) { if (!m.WaitOne(TimeSpan.FromSeconds(5), false)) ...原创 2019-03-29 09:22:12 · 245 阅读 · 1 评论 -
多线程编程学习系列之--SemaphoreSlim类
示例代码//设置同时访问线程最大数量static SemaphoreSlim _semaphore = new SemaphoreSlim(4);static void AccessDatabase(string name, int seconds){ Console.WriteLine($"{name} waits to access a database"); _sema...原创 2019-04-01 14:24:03 · 3346 阅读 · 0 评论 -
多线程编程学习系列之---线程基础
1:创建线程static void Main(string[] args){ #region 创建线程 Thread thread = new Thread(PrintNumbers); thread.Start(); PrintNumbers(); Console.ReadKey(); #endregion}static void Pr...原创 2019-03-25 16:01:44 · 243 阅读 · 0 评论 -
多线程编程学习系列之---Monitor类
先看一段代码:class Program{ static void Main(string[] args) { //开启两个线程 var threadOne = new Thread(new ThreadSample("ThreadOne").CountNumbersByLock); threadOne.Start(); ...原创 2019-03-26 14:10:15 · 368 阅读 · 0 评论 -
多线程编程学习系列之--AutoResetEvent类
示例代码//private static AutoResetEvent _workerEvent = new AutoResetEvent(false);private static AutoResetEvent _mainEvent = new AutoResetEvent(false);static void Process(int seconds){ //输出顺序:2 ...原创 2019-04-01 19:29:30 · 364 阅读 · 0 评论 -
多线程编程学习系列之---Interlocked类
先看一段代码class Program{ static void Main(string[] args) { var counter = new Counter(); var t1 = new Thread(() => TestCount(counter)); var t2 = new Thread(() => Tes...原创 2019-03-28 18:37:18 · 235 阅读 · 0 评论 -
多线程编程系列学习之---lock关键字
概念lock 语句获取给定对象的互斥 lock,执行语句块,然后释放 lock。 持有 lock 时,持有 lock 的线程可以再次获取并释放 lock。 阻止任何其他线程获取 lock 并等待释放 lock。lock 只适用单机情况,分布式和负债均衡可以考虑分布式锁。形式lock(this)lock(string)lock(object)lock(staticObject)测...转载 2019-03-25 21:00:50 · 320 阅读 · 0 评论