![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C#学习笔记
文章平均质量分 68
看到我请叫我学C++
这个作者很懒,什么都没留下…
展开
-
C#学习笔记(三十六)-- 多用途的事件处理程序
在处理事件中的Timer.Elapsed事件的委托包含了事件处理程序中常见的两类参数,如下所示: object.source——引发事件的对象的引用 ElapsedEventArgs e——由事件传送的参数 在这个事件(以及其他的事件中)使用object类型参数的原因是,我们常常要为由不同对象引发的几个相同事件使用同一个事件处理程序,但仍要指定是哪个对象生成了事件。 要说明这一点,下面将扩展使用事件中的示例。 ...原创 2021-08-10 11:17:42 · 261 阅读 · 2 评论 -
C#学习笔记(三十五)-- 定义事件
现在论述如何定义和使用自己的事件。我们将使用处理事件中介绍的即时消息传送应用程序示例,并创建一个Connection对象,该对象引发由Display对象处理的事件。1)在处理事件的源程序的同目录下,创建一个新的控制台应用程序Ch13Ex022)添加一个新类Connection,并修改Connection.cs,如下所示:using System;using System.Collections.Generic;using System.Lin...原创 2021-08-10 10:23:15 · 508 阅读 · 0 评论 -
C#学习笔记(三十四)-- 处理事件
要对事件进行处理,需要提供一个事件处理方法来订阅事件,该方法的返回类型和参数应该匹配事件指定的委托。下面的示例使用一个简单的计时器对象引发事件,调用一个处理方法。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Timers;using static System.Console;na...原创 2021-08-10 08:42:15 · 371 阅读 · 1 评论 -
C#学习笔记(三十三)-- 事件
事件类似于异常,因为他们都是由对象引发(抛出),并且都可以通过我们提供的代码来进行处理。但他们也有几个重要区别。最重要的区别是并没有与try...catch类似的结构来处理事件,你必须订阅(subscribe)它们。订阅一个事件的含义是提供代码,在事件发生时执行这些代码,它们被称为事件处理程序。 单个事件可供多个处理程序订阅,在该事件发生时,这些处理程序都会被调用,其中包括引发该事件的对象所在的类中的事件处理程序,但事件的处理程序也可能在其他的类中。 事件处理程序本身都是简单方法...转载 2021-08-09 14:56:51 · 62 阅读 · 0 评论 -
C#学习笔记(三十二)-- ::运算符和全局名称空间限定符
::运算符提供了另一种访问名称空间中的类型的方式。如果要使用一个名称空间的别名。但该别名与实际名称空间层次结构之间的界限并不清晰,就必须使用::运算符。在那种情况下,名称空间层次结构优先于名称空间的别名。为阐明其含义,考虑下列代码:using MyNamespaceAlices = MyRootNamespace.MyNestedNamespace;namespace MyRootNamespace{ namespace MyNamespaceAlices { pu...原创 2021-08-09 14:36:37 · 220 阅读 · 0 评论 -
C#学习笔记(三十一)-- 泛型接口、方法及委托
1 定义泛型接口 前面介绍了几个泛型接口,它们都位于Systems.Collections.Generic名称空间中,例如,上一个示例中使用的IEnumerable<T>。定义泛型接口与定义泛型类所用的技术相同,例如:interface MyFarmingInterface<T> where T : Animal{ bool AttemptToBreed(T animal1, T animal2); T OldestInHerd{ get; }...原创 2021-07-27 14:10:52 · 426 阅读 · 0 评论 -
C#学习笔记(三十)-- 定义泛型类型
要创建泛型类,只需要在类定义中包含尖括号语法:class MyGenericClass<T> {...} 其中T可以是任意标识符,只要遵循通常的C#命名规则即可,但一般只使用T。泛型类可在其定义中包含任意多个类型参数,参数之间用逗号分隔,例如:class MyGeneriaClass<T1, T2, T3> {...}class MyGenericClass<T1, T2, T3>{ private T1 innerT1Objec...原创 2021-07-27 11:35:56 · 965 阅读 · 0 评论 -
C#学习笔记(二十九)-- List<T>与Dictionary<K, V>
System.Collections.Generic名称空间包含用于处理集合的泛型类型,常与using语句一起使用。1 List<T> List<T>泛型集合类型更快捷、更便于使用:不必再从CollectionBase中派生一个类,然后实现需要的方法。它的另一个好处是正常情况下需要实现的许多方法(例如,Add())已经自动实现了。 创建T类型对象的集合需要如下代码:List<T> myCollection = new List<...原创 2021-07-27 09:34:52 · 281 阅读 · 0 评论 -
C#学习笔记(二十八)-- 可空类型
一、可空类型 值类型必须包含一个值,它们可以在声明之后、赋值之前,在未赋值的状态下存在,但不能使用未赋值的变量。而引用类型可以是null。 有时让值类型为空时很有用的(尤其是在处理数据库时),泛型使用System.Nullable<T>类型提供了使值类型为空的一种方式。例如:System.Nullable<int> nullableInt; 这行代码声明了一个变量nullableInt,它可以拥有int变量能包含的任意值,还可以拥有值null,所以可以编写如下...原创 2021-07-26 17:18:56 · 355 阅读 · 0 评论 -
C#学习笔记(二十七)-- 泛型的含义
基本集合可以包含在诸如ArrayList的类中,但这些集合是没有类型化的,所以需要把object项转换为集合中实际存储的对象类型,继承自System.Object的任何对象都可以存储在ArrayList中,所以要特别仔细。假定包含在集合中的某些类型可能导致抛出异常,而且代码逻辑崩溃。千米那介绍的技术可以处理这个问题,包括检查对象类型所需的代码。 但是更好的解决办法是一开始就使用强类型化的集合类。这种集合类派生于CollectionBase,并可以拥有自己的方法,来添加、删除和访问集合的成员,但它可...原创 2021-07-26 15:03:35 · 81 阅读 · 0 评论 -
C#学习笔记(二十六)-- 转换
到目前为止,在需要把一种类型转换为另一种类型时,使用的都是类型转换。但这并非是唯一方式。在计算过程中,int可隐式转换为long或double,采用相同的方式还可以定义所创建的类(隐式或显式)转换为其他类的方式。为此,可重载转换运算符,其方式与本章前面重载其他运算符的方式相同。本节第一部分就介绍重载方式。本节还将介绍另一个有用的运算符:as运算符,它一般适用于引用类型的转换。 1)重载转换运算符 除了重载上述数学运算符以外,还可以定义类型之间的隐式和显式转换。如果要在不相关的类型之间转换,例...原创 2021-07-20 09:53:57 · 177 阅读 · 0 评论 -
C#学习笔记(二十五)-- IComparable和IComparer接口
IComparable和IComparer接口是.NET Framework中比较对象的标准方式。这两个接口之间的区别如下: IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象。 IComparer在一个单独的类中实现,可以比较任意两个对象。 一般使用IComparable给出类的默认比较带啊,使用其他类给出非默认的比较代码。 IComparable提供了一个方法CompareTo(),这个方法接受一个对象。例如,在实现该方法时,使其可以接受一个Perso...原创 2021-07-20 08:58:33 · 809 阅读 · 0 评论 -
C#学习笔记(二十四)-- 值比较
考虑两个表示人的Person对象,它们都有一个Age整型属性。下面要比较它们,看看哪个人年龄较大。为此可以使用以下代码:if(person1.Age > person2.Age){ ...} 这是可以的,但还有其他方法,例如,使用下面的语法:if(person1 > person2){ ...} 可以使用运算符重载,如本节后面所述。这是一项强大的技术,但应谨慎使用。在上面的代码中,年龄的比较不是非常明显,该段代码还可以比较身高、体重、IQ等。...原创 2021-07-20 07:55:05 · 286 阅读 · 0 评论 -
C#学习笔记(二十三)-- 类型比较
在比较对象时,常需要了解它们的类型,才能确定是否可以进行值的比较。在这之前介绍了GetType()方法,所有的类都从System.Object中继承了这个方法,这个方法和typeof()运算符一起使用,就可以确定对象的类型,并据此执行操作:if (myObj.GetType() == typeof(MyComplexClass)){ //myObj is an instance of the class MyComplexClass.} 前面还提到过ToString()的默认实现方...原创 2021-07-19 16:01:01 · 1535 阅读 · 0 评论 -
C#学习笔记(二十二)-- 深度复制
通过GetCopy()方法,介绍了如何使用受保护的方法System.Object.MemberwiseClone()进行浅度复制。public class Cloner{ public int Val; public Cloner{int newVal} => Val = newVal; public object GetCopy() => MemberwiseClone();} 假定有一些引用类型的字段,而不是值类型的字段(例如:对象):public...原创 2021-07-19 14:40:28 · 285 阅读 · 0 评论 -
C#学习笔记(二十一)-- 迭代器
IEnumerable接口允许使用foreach循环。在foreach循环中并不是只能使用集合类,相反,在foreach循环中使用定制类通常有很多优点。 但是,重写使用foreach循环的方式或者提供定制的实现方式并不一定很简单。为了说明这一点,下面有必要深入研究一下foreach循环。在foreach循环中,迭代一个collectionObject集合的过程如下: (1)调用collectionObject.GetEnumerator(),返回一个IEnumerator引用,这个方法可通过...原创 2021-07-19 14:00:32 · 223 阅读 · 0 评论 -
C#学习笔记(二十)-- 键控集合和IDictionary
除实现IList接口外,集合还可以实现类似的IDictionary接口,允许项通过键值(如字符串名)进行索引,而不是通过一个索引。这也可以使用索引符来完成,但这次使用的索引符参数是一个与存储的项相关联的键,而不是int索引,这样集合就更便于用户使用了。 与索引的集合一样,可以使用一个基类简化IDictionary接口的实现,这个基类就是DictionaryBase,它也实现IEnumerable和ICollection,提供了对任何集合都相同的基本集合处理功能。 与CollectionBas...原创 2021-07-19 11:08:32 · 629 阅读 · 0 评论 -
C#学习笔记(十九)-- 定义集合
如何创建自己的强类型化的集合。 一种方式是手动实现需要的方法,但这缴费时间而且过程也非常复杂。我们还可以从一个类中派生自己的集合,例如System.Collections.CollectionBase类,这个抽象类提供了集合类的大量实现代码,因此也推荐使用这样的方式。 CollectionBase类有接口IEnumerable、ICollection和IList,但只提供了一些必要的实现代码,主要是IList的Clear()和RemoveAt()方法,以及ICollection的Count属...原创 2021-07-19 10:31:40 · 673 阅读 · 0 评论 -
C#学习笔记(十八)-- 使用集合
首先,是集合的创建。对于简单数组而言,只有用固定大小来初始化数组,才能使用它。以标准语法来创建数组animalArray:Animal[] animalArray = new Animal[2]; 而ArrayList集合不需要初始化其大小,所以可以使用以下代码创建animalArrayList列表:ArrayList animalArrayList = new ArrayList(); 这个类还有另外两个构造函数。第一个构造函数把现有的集合作为一个参数,将其内容复制到新实例中;...原创 2021-07-19 09:46:47 · 204 阅读 · 0 评论 -
C#学习笔记(十六)-- 部分定义
一、部分类定义 使用部分类定义,把类的定义放在多个文件中。例如,可将字段、属性和构造函数放在一个文件中,而把方法放在另一个文件中。为此,把包含部分类定义的每个文件中对类使用partial关键字即可,如下所示:public partial class MyClass {...} 如果使用部分类定义,partial关键字必须出现在包含部分类定义的每个文件的与此相同的位置。 应用于部分类的接口也会应用于整个类,也就是说,下面的两个定义:public partial class MyC...原创 2021-07-16 14:58:28 · 160 阅读 · 0 评论 -
C#学习笔记(十五)-- 接口的实现
一、接口的实现 定义和实现接口的方法与类相似:interface IMyInterface{ // Interface members.} 接口成员的定义与类成员的定义相似,但有以下几个重要区别: (1)不允许使用访问修饰符(public、private、protected或internal),所有的接口成员都是隐式公共的。 (2)不能用关键字static、virtual、abstract或sealed来定义接口成员。 (3)接口成员不能包含代码体。 (4...原创 2021-07-16 14:18:37 · 1202 阅读 · 0 评论 -
C#学习笔记(十四)-- 类成员的其他主题
一、类成员的其他主题 1 隐藏基类方法 2 调用重写或隐藏的基类方法 3 使用嵌套的类型定义 1)隐藏基类方法 当从基类继承一个(非抽象的)成员时,也就继承了其实现代码。如果继承的成员是虚拟的,就可以用override关键字重写这段实现代码。无论继承的成员是否为虚拟,都可以隐藏这些实现代码。当继承的公共成员不像预期的那样工作时,就可以隐藏它:public class MyBaseClass{ public void DoSomething { //Bas...原创 2021-07-16 11:18:12 · 69 阅读 · 0 评论 -
C#学习笔记(十三)-- 定义类成员
一、成员定义 成员的访问级别: public:成员可以被任何代码访问。 private:成员只能由类中的代码访问(如果没有使用任何的关键字,就默认使用这个关键字)。 internal:成员只能有定义它的程序集(项目)内部的代码访问。 protected:成员只能由类或派生类中的代码访问。 protected internal:成员只能由项目(更准确地说是程序集)中的派生类的代码来访问。 static:成员是类的静态成员,而不是对象实例的成员。1)定义字段 ...原创 2021-07-16 09:32:00 · 423 阅读 · 0 评论 -
C#学习笔记(十二)-- 定义类
一、类的相关概念 类的在默认情况下的声明是内部的,也可以通过internal关键字来显式声明,内部的类只能在项目内部被访问。 用public关键字可以将一个类指定为公共,这个类可以被其他项目中的代码访问。 此外,还可以指定类是抽象的abstract(不能实例化,只能继承,可以有抽象成员),或者密封的sealed(只能实例化,不能继承),抽象类和密封类也分为内部的和外部的。 可以在类的定义中指定继承,在类名后加上冒号,其后是基类名,编译器不允许派生类的可访问性高于基类。如果没有指定使用...原创 2021-07-16 07:57:05 · 634 阅读 · 0 评论 -
C#学习笔记(十一)-- 面向对象编程
一、面向对象编程的含义 过程化编程会导致单一的应用程序,即所有的功能都包含在一个或几个代码模块中。而模块化编程方法提供了丰富的多样性,增加了重用代码的机会,提高项目的可扩展性。二、对象的含义 对象是OOP程序的一个构件。这个构件封装了部分应用程序,这部分程序可以是一个过程、一些数据或者一些更加抽象的实体。 对象非常类似于前面所介绍的结构类型。它所包含的变量组成了存储在对象中的数据,其中包含的函数可以访问对象的功能。稍微复杂的对象可能不包含任何的数据,而只包含函数,表示一个过程。 ...原创 2021-07-12 09:35:46 · 129 阅读 · 0 评论 -
C#学习笔记(十)-- 调试和错误处理
一、非中断模式下的调试 非中断模式下的调试需要把调试信息输入到output窗口,在运行期间把文本写入output窗口是非常简单的,只需要将所需的调用代替WriteLine()的调用,此时可以使用如下两个命令:Debug.WriteLine();Trace.WriteLine(); 这两个命令函数的用法几乎完全相同,但有一个重要区别:第一个命令仅在调试模式下运行,而第二个命令还可以用于发布程序。Debug.WriteLine()和Trace.WriteLine()方法包含在System.D..原创 2021-07-07 11:04:23 · 9642 阅读 · 0 评论 -
C#学习笔记(九)-- 函数
1.函数的定义和使用using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using static System.Console;namespace Ch06Ex01{ class Program { //static string myString; static voi原创 2021-07-06 17:30:02 · 203 阅读 · 0 评论 -
C#学习笔记(八)-- 数据类型转换、枚举、结构、数组及字符串的处理
勤奋的含义是今天的努力,而不是明天的决心、后天的保证。一、类型转换 数据类型的转换可以分为以下两类: 隐式转换:从类型A到类型B的转换可在所有情况下进行,执行转换的规则非常简单,可以让编译器执行转换; 显式转换:从类型A到类型B的转换只能在某些情况下进行,转换的规则比较复杂,应进行某种类型的额外处理。 1.隐式转换:任何类型A只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B:ushort destinationvar;char sourcevar...原创 2021-07-06 10:54:44 · 672 阅读 · 0 评论 -
C#学习笔记(七)-- 布尔逻辑及流程控制
一、布尔逻辑 布尔比较运算符:"==" "!=" "<" ">" "<=" ">=" 注意布尔比较运算符限定范围:如果var1 = var2,那么var1 < var2和var1 > var2返回的布尔值,均为false。 条件布尔运算符:"&&" "||" "&" "|"&&和||与&和|的运算结果完全一致,但是&&与||只要在第一个操作数的值可以判断结果后,就不必再考虑第二个数。...原创 2021-07-05 15:45:57 · 521 阅读 · 0 评论 -
C#学习笔记(六)-- 变量、表达式及名称空间
一、变量和表达式 使用#region和#endregion定义可以展开和折叠的代码区域的开头和结尾(以#开头的任意关键字实际上是一个预处理指令,严格来说并不是C#关键字) 整数类型包括:类型 别名 允许的值 sbyte System.SByte -128 ~ 127 byte System.Byte 0 ~ 255 short System.Int16 -32768 ~ 32767 ushort System.UInt..原创 2021-07-05 14:05:11 · 173 阅读 · 0 评论 -
C#学习笔记(五)-- 初识控制台程序及WPF
一、编写应用程序 1.控制台应用程序: 控制台应用程序没有使用图形化的Windows环境,所以不需要考虑按钮、菜单、用鼠标指针进行交互,而是在命令行窗口中运行应用程序,用更简单的方式与其交互。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication1{ ...原创 2021-07-05 10:00:52 · 725 阅读 · 0 评论 -
C#学习笔记(一)-- C#开发环境初识
学习一下C#编程语言,首先给出本章的参考书目:《C#开发实战1200例(第一卷)》(再次感谢闯哥和大普哥!),使用的编译工具是Visual Studio 2019。第一章 C#开发环境的使用1.设置程序代码行号菜单栏中选择“工具” -- “选项” -- “文本编辑器” -- “所有语言” -- “行号”:2.使开发环境全屏显示菜单栏选择“视图” -- “全屏显示”,或者直接按快捷键Shift + Alt + Enter:开启全屏前:开启全屏后:3.根据需求创建所.原创 2021-07-01 15:55:12 · 371 阅读 · 0 评论 -
C#学习笔记(二)-- C#基本操作
第二章 C#语言基础应用1.利用//可以对单行代码进行注释:2.利用/* 和 */可以对多行代码进行注释:3.使用///给代码段添加说明:///标记还可以生成自动文档:在“解决方案资源管理器”对话框中点击项目,在弹出的快捷菜单中选择“属性”命令,再在弹出的对话框中选择“生成”选项卡,然后在“输出”栏中选中“XML文档文件”:4.用引号运算符进行赋值:转义序列包括标准的“/”字符,后跟一个“u”和一个4位的十六进制值。为了避免转义序列元素转义,可以通过以下.原创 2021-07-02 14:42:22 · 485 阅读 · 0 评论 -
C#学习笔记(三)-- 加密、编码及闰年判断
1.使用“^”运算符对数字进行加密: 1)新建Windows窗体应用,命名为Encrypt: 2)增加控件: label:用于提供说明性文字 textbox:用于显示字符串 button:用于完成相关操作 groupbox:用于对相关控件进行分组 3)设计界面: 4)加密原理: 通过异或运算符“^”将待加密数字与加密数字进行异或计算,解密只需要将加密好的数字与加密数字再次...原创 2021-07-05 08:07:34 · 176 阅读 · 0 评论 -
C#学习笔记(四)-- .NET Framework与C#简介
为了进一步打好基础下一步的学习将围绕《C#入门经典(第8版)》展开。一、.NET Framework和.NETCore简介 .NETFramework包含了一个庞大的代码库,主要应用于面向对象编程技术(Object-Oriented Promgramming,OOP),同时.NETFramework库还定义了一些基本类型,有助于使用.NETFramework的各种语言之间进行交互操作,这称为通用类型系统(Common Type System,CTS),除了这个库以外.NETFramewo...原创 2021-07-05 09:25:41 · 160 阅读 · 0 评论