线程 定义为程序的执行路径。每个线程定义一个独特的控制流。如果您的应用程序涉及复杂且耗时的操作,那么设置不同的执行路径或线程通常很有帮助,每个线程执行特定的工作。 线程是轻量级进程 .使用线程的一个常见示例是现代操作系统实现并发编程。线程的使用节省了CPU周期的浪费,提高了应用的效率。 到目前为止,我们编写了单个线程作为单个进程运行的程序,该进程是应用程序的运行实例。但是,通过这种方式,应用程序可以一次执行一项工作。为了使其一次执行多个任务,可以将其划分为更小的线程。 线程生命周期 线程的生命周期从 System.Threading.Thread 类的对象创建开始,到线程终止或完成执行结
C# 允许在代码块的函数中使用指针变量,当它被 unsafe 标记时 修饰符。 不安全代码 或者非托管代码是使用指针的代码块 变量。 指针 指针 是一个变量,其值是另一个变量的地址,即内存位置的直接地址。与任何变量或常量类似,必须先声明一个指针,然后才能使用它来存储任何变量地址。 指针声明的一般形式是 - 输入 *var-name; 以下是有效的指针声明 - int *ip; /* 指向整数的指针 */double *dp; /* 指向双精度 */float *fp; /* 指向浮点数的指针 */char *ch /* 指向字符的指针 */ 下面的例子说明了在 C# 中指针的使用,使用
我们讨论了委托用于引用与委托具有相同签名的任何方法。换句话说,您可以使用该委托对象调用可由委托引用的方法。 匿名方法 提供一种将代码块作为委托参数传递的技术。匿名方法就是没有名字的方法,只有方法体。 您无需在匿名方法中指定返回类型;它是从方法体内部的返回语句推断出来的。 编写匿名方法 匿名方法是在创建委托实例时声明的,带有 delegate 关键词。例如, delegate void NumberChanger(int n);...NumberChanger nc =delegate(int x) { Console.WriteLine(匿名方法:{0}, x);}; 代码块 Cons
泛型 允许您在类或方法中定义编程元素的数据类型规范,直到它在程序中实际使用。换句话说,泛型允许您编写可以处理任何数据类型的类或方法。 您编写类或方法的规范,并使用数据类型的替代参数。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理特定的数据类型。一个简单的例子将有助于理解这个概念 - 现场演示using System;using System.Collections.Generic;namespace GenericApplication { public class MyGenericArray { private T[] array; public MyGenericAr
集合类是用于数据存储和检索的专门类。这些类提供对堆栈、队列、列表和哈希表的支持。大多数集合类实现相同的接口。 集合类有多种用途,例如动态地为元素分配内存和根据索引访问项目列表等。这些类创建 Object 类的对象集合,Object 类是 C# 中所有数据类型的基类。 各种集合类及其用法 以下是System.Collection的各种常用类 命名空间。点击以下链接查看详情。 Sr.No. 类别、描述和用途 1 数组列表 它表示可以索引的对象的有序集合 个别。 它基本上是数组的替代品。但是,与数组不同的是,您可以使用 index 从列表中的指定位置添加和删除项目 并且数组会自动调整大小
活动 是用户操作,例如按键、点击、鼠标移动等,或某些事件,例如系统生成的通知。应用程序需要在事件发生时做出响应。例如,中断。事件用于进程间通信。 在事件中使用委托 事件在类中声明和引发,并使用同一类或某个其他类中的委托与事件处理程序相关联。包含事件的类用于发布事件。这称为发布者 班级。接受此事件的其他一些类称为订阅者 班级。事件使用发布者-订阅者 模型。 出版商 是一个包含事件和委托定义的对象。事件委托关联也在此对象中定义。发布者类对象调用该事件并通知其他对象。 订阅者 是一个接受事件并提供事件处理程序的对象。发布者类中的委托调用订阅者类的方法(事件处理程序)。 声明事件 要在类中声明
C# 委托类似于 C 或 C++ 中的函数指针。 代表 是一个引用类型变量,用于保存对方法的引用。可以在运行时更改引用。 委托特别用于实现事件和回调方法。所有委托都隐式派生自 System.Delegate 课。 声明代表 委托声明决定了委托可以引用的方法。委托可以引用与委托具有相同签名的方法。 例如,考虑一个委托 - 公共委托 int MyDelegate (string s); 前面的委托可用于引用任何具有单个 string 的方法 参数并返回一个 int 类型变量。 委托声明的语法是 - delegate 实例化委托 一旦声明了委托类型,就必须使用 new 创建委托对
索引器 允许对对象进行索引,例如数组。当您为类定义索引器时,该类的行为类似于虚拟数组 .然后,您可以使用数组访问运算符 ([ ]) 访问此类的实例。 语法 一维索引器具有以下语法 - element-type this[int index] { // 获取访问器。 get { // 返回索引指定的值 } // 集合访问器。 set { // 设置索引指定的值 }} 索引器的使用 索引器的行为声明在某种程度上类似于属性。与属性类似,您使用 get 并设置 用于定义索引器的访问器。但是,属性返回或设置特定数据成员,而索引器从对象实例返回或设置特定值。换句话说,它将实例数据分解成更小的部分并对
属性 被命名为类、结构和接口的成员。类或结构中的成员变量或方法称为字段 .属性是字段的扩展,可以使用相同的语法进行访问。他们使用访问器 通过它可以读取、写入或操作私有字段的值。 属性不命名存储位置。相反,他们有访问器 读取、写入或计算它们的值。 例如,让我们有一个名为 Student 的类,其中包含年龄、姓名和代码的私有字段。我们无法从类范围之外直接访问这些字段,但我们可以拥有访问这些私有字段的属性。 访问器 访问器 属性包含有助于获取(读取或计算)或设置(写入)属性的可执行语句。访问器声明可以包含 get 访问器、set 访问器或两者。例如 - // 声明一个字符串类型的 Code 属
反思 对象用于在运行时获取类型信息。可以访问正在运行的程序的元数据的类位于 System.Reflection 命名空间。 System.Reflection 命名空间包含允许您获取有关应用程序的信息并向应用程序动态添加类型、值和对象的类。 反射的应用 反射有以下应用 - 它允许在运行时查看属性信息。 它允许检查程序集中的各种类型并实例化这些类型。 它允许后期绑定到方法和属性 它允许在运行时创建新类型,然后使用这些类型执行一些任务。 查看元数据 上一章我们提到过使用反射可以查看属性信息。 会员信息 System.Reflection 的对象 需要初始化类以发
属性 是一个声明性标签,用于向运行时传达有关程序中各种元素(如类、方法、结构、枚举器、程序集等)行为的信息。您可以使用属性向程序添加声明性信息。声明性标签由放置在它所使用的元素上方的方括号 ([ ]) 描述。 属性用于向程序添加元数据,例如编译器指令和其他信息,例如注释、描述、方法和类。 .Net Framework 提供两种类型的属性:预定义 属性和自定义构建 属性。 指定属性 指定属性的语法如下 - [attribute(positional_parameters, name_parameter =value, ...)]element 属性的名称及其值在方括号内指定,在应用该属性的
文件 是存储在磁盘中的数据集合,具有特定名称和目录路径。当一个文件被打开进行读或写时,它变成了一个流 . 流基本上是通过通信路径的字节序列。有两个主要流:输入流 和输出流 . 输入流 用于从文件中读取数据(读取操作)和输出流 用于写入文件(写操作)。 C# I/O 类 System.IO 命名空间有各种类,用于对文件执行大量操作,例如创建和删除文件、读取或写入文件、关闭文件等。 下表显示了 System.IO 命名空间中一些常用的非抽象类 - Sr.No. I/O 类和描述 1 二进制读取器 从二进制流中读取原始数据。 2 二进制写入器 以二进制格式写入原始数据。
异常是在程序执行过程中出现的问题。 C# 异常是对程序运行时出现的异常情况的响应,例如试图除以零。 异常提供了一种将控制从程序的一个部分转移到另一个部分的方法。 C# 异常处理建立在四个关键字之上:try , 捕捉 , 终于 , 和 抛出 . 试试 - try 块标识激活特定异常的代码块。后面跟着一个或多个catch块。 抓住 − 程序在程序中要处理问题的位置使用异常处理程序捕获异常。 catch关键字表示捕获异常。 终于 − finally 块用于执行给定的语句集,无论是否抛出异常。例如,如果您打开一个文件,无论是否引发异常,它都必须关闭。 扔 − 出现问题时程序抛
正则表达式 是一种可以与输入文本匹配的模式。 .Net 框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符文字、运算符或结构组成。 定义正则表达式的构造 有多种类型的字符、运算符和结构可让您定义正则表达式。单击以下链接可找到这些结构。 字符转义 字符类 锚 分组结构 量词 反向引用结构 交替结构 替换 杂项构造 正则表达式类 Regex 类用于表示正则表达式。它有以下常用的方法 - Sr.No. 方法和说明 1 public bool IsMatch(字符串输入) 指示在 Regex 构造函数中指定的正则表达式是
预处理器指令指示编译器在实际编译开始之前对信息进行预处理。 所有预处理器指令都以 # 开头,并且在一行中的预处理器指令之前只能出现空格字符。预处理器指令不是语句,因此它们不以分号 (;) 结尾。 C# 编译器没有单独的预处理器;然而,指令的处理就像有一个指令一样。在 C# 中,预处理器指令用于帮助条件编译。与 C 和 C++ 指令不同,它们不用于创建宏。预处理器指令必须是一行中的唯一指令。 C# 中的预处理器指令 下表列出了 C# 中可用的预处理器指令 - Sr.No. 预处理器指令和说明 1 #define 它定义了一个字符序列,称为符号。 2 #undef 它允
命名空间 旨在提供一种将一组名称与另一组名称分开的方法。在一个命名空间中声明的类名与在另一个命名空间中声明的相同类名不冲突。 定义命名空间 命名空间定义以关键字 namespace 开头 后跟命名空间名称如下 - namespace namespace_name { // 代码声明} 要调用函数或变量的启用命名空间的版本,请按如下方式添加命名空间名称 - namespace_name.item_name; 以下程序演示了命名空间的使用 - 现场演示using System;namespace first_space { class namespace_cl { public void
接口被定义为所有继承接口的类都应该遵循的语法契约。接口定义了what 语法契约的一部分和派生类定义了 how 语法契约的一部分。 接口定义属性、方法和事件,它们是接口的成员。接口只包含成员的声明。定义成员是派生类的责任。它通常有助于提供派生类将遵循的标准结构。 抽象类在一定程度上起到了相同的作用,但它们主要用于基类只声明少数方法而派生类实现功能的情况。 声明接口 接口是使用 interface 关键字声明的。它类似于类声明。接口语句默认是公开的。以下是接口声明的示例 - public interface ITransactions { // 接口成员 void showTransacti
您可以重新定义或重载 C# 中可用的大多数内置运算符。因此,程序员也可以使用具有用户定义类型的运算符。重载运算符是具有特殊名称的函数,关键字为 operator 后跟正在定义的运算符的符号。与任何其他函数类似,重载运算符具有返回类型和参数列表。 例如,通过以下函数 - public static Box operator+ (Box b, Box c) { Box box =new Box(); box.length =b.length + c.length; box.breadth =b.breadth + c.breadth; box.height =b.height + c.heigh
多态性这个词 意味着有多种形式。在面向对象编程范式中,多态性常被表述为“一个接口,多个功能”。 多态可以是静态的,也可以是动态的。在静态多态 ,对函数的响应是在编译时确定的。在动态多态 ,在运行时决定。 静态多态性 在编译期间将函数与对象链接的机制称为早期绑定。它也称为静态绑定。 C# 提供了两种技术来实现静态多态。他们是 - 函数重载 运算符重载 我们将在下一章讨论运算符重载。 函数重载 您可以在同一范围内为同一函数名称定义多个定义。函数的定义必须因参数列表中的参数类型和/或参数数量而异。您不能重载仅因返回类型不同的函数声明。 以下示例显示使用函数 print() 打印不同的数
面向对象编程中最重要的概念之一是继承。继承允许我们根据另一个类来定义一个类,这使得创建和维护应用程序更容易。这也提供了重用代码功能并加快实现时间的机会。 创建类时,程序员可以指定新类应继承现有类的成员,而不是编写全新的数据成员和成员函数。这个现有的类被称为基础 类,新类被称为派生 课。 继承的思想实现了IS-A 关系。例如,哺乳动物IS A 动物,狗 IS-A 哺乳动物因此狗 IS-A 动物,等等。 基类和派生类 一个类可以派生自多个类或接口,这意味着它可以从多个基类或接口继承数据和函数。 C#中用于创建派生类的语法如下 - class { ...}class : { ...}
C语言