一个线程 定义为程序的执行路径。每个线程定义一个独特的控制流。如果您的应用程序涉及复杂且耗时的操作,那么设置不同的执行路径或线程通常会很有帮助,每个线程执行特定的作业。 线程是轻量级进程 .使用线程的一个常见示例是现代操作系统实现并发编程。使用线程可以节省 CPU 周期的浪费并提高应用程序的效率。 到目前为止,我们编写了将单个线程作为单个进程运行的程序,该进程是应用程序的运行实例。但是,这样应用程序一次可以执行一项工作。为了使其一次执行多个任务,可以将其划分为更小的线程。 线程生命周期 线程的生命周期从创建 System.Threading.Thread 类的对象开始,到线程终止或完成执
当代码块被 unsafe 标记时,C# 允许在代码块的函数中使用指针变量 修饰符。 不安全的代码 或者非托管代码是一个使用指针的代码块 变量。 指针 一个指针 是一个变量,其值是另一个变量的地址,即内存位置的直接地址。与任何变量或常量类似,您必须先声明一个指针,然后才能使用它来存储任何变量地址。 指针声明的一般形式是 - type *var-name; 以下是有效的指针声明 - int *ip; /* pointer to an integer */ double *dp; /* pointer to a double */ float *fp; /* p
我们讨论了委托用于引用与委托具有相同签名的任何方法。换句话说,您可以使用该委托对象调用可由委托引用的方法。 匿名方法 提供一种将代码块作为委托参数传递的技术。匿名方法是没有名字的方法,只是主体。 您无需在匿名方法中指定返回类型;它是从方法体内的return语句推断出来的。 编写匿名方法 匿名方法是在创建委托实例时声明的,带有 delegate 关键词。例如, delegate void NumberChanger(int n); ... NumberChanger nc = delegate(int x) { Console.WriteLine(Anonymous Method:
泛型 允许您在类或方法中定义编程元素的数据类型规范,直到它在程序中实际使用。换句话说,泛型允许你编写一个可以处理任何数据类型的类或方法。 您为类或方法编写规范,并使用数据类型的替代参数。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理特定的数据类型。一个简单的例子将有助于理解这个概念 - 现场演示 using System; using System.Collections.Generic; namespace GenericApplication { public class MyGenericArray<T> { private T[] a
集合类是用于数据存储和检索的专用类。这些类提供对堆栈、队列、列表和哈希表的支持。大多数集合类都实现了相同的接口。 集合类有多种用途,例如为元素动态分配内存和基于索引访问项目列表等。这些类创建 Object 类的对象集合,Object 类是 C# 中所有数据类型的基类。 各种集合类及其用法 以下是System.Collection的各种常用类 命名空间。点击以下链接查看详细信息。 Sr.No. Class &Description and Useage 1 数组列表 它表示可以索引的对象的有序集合 个人。 它基本上是数组的替代品。但是,与数组不同,您可以使用 index 在指定位置从
活动 是用户操作,例如按键、点击、鼠标移动等,或某些事件,例如系统生成的通知。应用程序需要在事件发生时对其作出响应。例如,中断。事件用于进程间通信。 在事件中使用委托 事件在类中声明和引发,并使用同一类或其他类中的委托与事件处理程序相关联。包含事件的类用于发布事件。这称为发布者 班级。接受此事件的其他一些类称为 subscriber 班级。事件使用 publisher-subscriber 型号。 一个出版商 是一个包含事件定义和委托的对象。事件委托关联也在此对象中定义。发布者类对象调用事件并通知其他对象。 一个订阅者 是一个接受事件并提供事件处理程序的对象。发布者类中的委托调用订阅者
C# 委托类似于 C 或 C++ 中的函数指针。一个代表 是一个引用类型变量,它保存对方法的引用。可以在运行时更改引用。 委托特别用于实现事件和回调方法。所有委托都隐式派生自 System.Delegate 类。 声明委托 委托声明决定了委托可以引用的方法。委托可以引用与委托具有相同签名的方法。 例如,考虑一个委托 - public delegate int MyDelegate (string s); 前面的委托可用于引用具有单个 string 的任何方法 参数并返回一个 int 类型变量。 委托声明的语法是 - delegate <return type> &l
索引器 允许对对象进行索引,例如数组。当您为类定义索引器时,该类的行为类似于 虚拟数组 .然后,您可以使用数组访问运算符 ([ ]) 访问此类的实例。 语法 一维索引器具有以下语法 - element-type this[int index] { // The get accessor. get { // return the value specified by index } // The set accessor. set { // set the value specified by index } } 索引器
属性 是类、结构和接口的命名成员。类或结构中的成员变量或方法称为字段 .属性是字段的扩展,可以使用相同的语法进行访问。他们使用访问器 通过它可以读取、写入或操作私有字段的值。 属性不命名存储位置。相反,他们有访问器 读取、写入或计算它们的值。 例如,让我们有一个名为 Student 的类,其中包含年龄、姓名和代码的私有字段。我们不能从类范围之外直接访问这些字段,但我们可以拥有访问这些私有字段的属性。 访问器 访问器 属性包含有助于获取(读取或计算)或设置(写入)属性的可执行语句。访问器声明可以包含一个 get 访问器、一个 set 访问器或两者兼有。例如 - // Declare a
反思 对象用于在运行时获取类型信息。 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 BinaryWriter 以二进制格式
异常是在程序执行过程中出现的问题。 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 { // code declarations } 要调用函数或变量的命名空间启用版本,请在命名空间名称前添加如下 - namespace_name.item_name; 以下程序演示了名称空间的使用 - 现场演示 using System; namespace first_space { class n
接口被定义为所有继承该接口的类都应遵循的语法契约。接口定义了what 句法契约的一部分和派生类定义了how 句法契约的一部分。 接口定义属性、方法和事件,它们是接口的成员。接口只包含成员的声明。定义成员是派生类的责任。它通常有助于提供派生类遵循的标准结构。 抽象类在一定程度上起到了相同的作用,但是,它们主要用于基类只声明少数方法并且派生类实现功能的情况。 声明接口 接口是使用 interface 关键字声明的。它类似于类声明。默认情况下,接口语句是公共的。以下是接口声明的示例 - public interface ITransactions { // interface memb
您可以重新定义或重载 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.
多态性 意味着有多种形式。在面向对象的编程范式中,多态性常被表述为“一个接口,多个函数”。 多态性可以是静态的或动态的。在静态多态中 ,对函数的响应是在编译时确定的。在动态多态中 , 是在运行时决定的。 静态多态 在编译期间将函数与对象链接的机制称为早期绑定。它也称为静态绑定。 C# 提供了两种技术来实现静态多态性。他们是 - 函数重载 运算符重载 我们将在下一章讨论运算符重载。 函数重载 您可以在同一范围内对同一函数名称进行多个定义。函数的定义必须因参数列表中参数的类型和/或数量而有所不同。不能重载仅返回类型不同的函数声明。 以下示例显示使用函数 print() 打印不同的数据
面向对象编程中最重要的概念之一是继承。继承允许我们根据另一个类来定义一个类,这使得创建和维护应用程序变得更加容易。这也提供了重用代码功能并加快实现时间的机会。 在创建类时,程序员可以指定新类应该继承现有类的成员,而不是编写全新的数据成员和成员函数。这个现有的类称为 base 类,新的类被称为派生的 类。 继承的思想实现了IS-A 关系。例如,哺乳动物 IS A 动物,狗 IS-A 哺乳动物因此是狗 IS-A 动物也是如此,等等。 基类和派生类 一个类可以从多个类或接口派生,这意味着它可以从多个基类或接口继承数据和函数。 C# 中用于创建派生类的语法如下 - <acess-spe
C语言