指针基础 C# 允许在由 unsafe 修饰符标记的函数或代码块中使用指针变量。不安全代码或非托管代码是使用指针变量的代码块。 指针声明 指针是其值为另一个变量地址的变量,即内存位置的直接地址。与任何变量或常量一样,必须先声明指针才能用它存储变量地址。 指针声明的一般形式: type *var-name; 有效的指针声明示例: int *ip; /* 指向整数的指针 */ double *dp; /* 指向双精度浮点数的指针 */ float *fp; /* 指向单精度浮点数的指针 */ char *ch; /* 指向字符的指针 */ 使用 unsafe 修饰符的指针示例 us
匿名方法简介 我们之前讨论过,委托用于引用与委托具有相同签名的任何方法。换句话说,你可以使用委托对象调用可被委托引用的方法。 匿名方法提供了一种将代码块作为委托参数传递的技术。匿名方法没有名称,只有方法体。 在匿名方法中无需指定返回类型;它从方法体内的 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[] array; publ
集合类概述 集合类是用于数据存储和检索的专用类,提供对栈、队列、列表和哈希表的支持。大多数集合类实现相同的接口。 集合类用途广泛,如动态分配内存给元素、基于索引访问项目列表等。这些类创建 Object 类对象的集合,Object 是 C# 中所有数据类型的基类。 常用集合类及其用途 以下是 System.Collections 命名空间中常用的类: 序号 类名与说明 1 Arra
什么是事件? 事件是用户操作(如按键、点击、鼠标移动等)或系统生成的通知等发生的事情。应用程序需要在事件发生时做出响应,例如中断处理。事件用于进程间通信。 委托与事件的配合使用 事件在类中声明并引发,通过委托与事件处理程序关联,可以在同一类或其他类中。包含事件的类用于发布事件,称为发布者类。接受该事件的其他类称为订阅者类。事件采用发布-订阅模型。 发布者:包含事件定义和委托的对象,也定义了事件-委托关联。发布者类对象调用事件,并通知其他对象。 订阅者:接受事件并提供事件处理程序的对象。发布者类中的委托调用订阅者类的方法(事件处理程序)。 声明事件 要在类中声明事件,首先
什么是委托? C# 委托类似于 C 或 C++ 中的函数指针。委托是一种引用类型变量,它持有对方法的引用,且该引用可以在运行时改变。 委托特别适用于实现事件和回调方法。所有委托都隐式派生自 System.Delegate 类。 声明委托 委托声明决定了可以被委托引用的方法。委托只能引用与其具有相同签名的方法。 例如,考虑以下委托声明: public delegate int MyDelegate(string s); 上述委托可用于引用任何带有单个 string 参数并返回 int 类型的方法。 委托声明的语法如下: delegate 实例化委托 声明委托类型后,必须使用 new 关
索引器允许对象像数组一样被索引。为类定义索引器后,该类表现如虚拟数组。可使用数组访问操作符 [ ] 访问类实例。 语法 一维索引器语法: element-type this[int index] { get { /* 返回 index 指定的值 */ } set { /* 设置 index 指定的值 */ } } 索引器用法 声明类似属性,使用 get/set 访问器。但属性返回/设置特定数据成员,索引器返回/设置对象实例的特定值——将实例数据分割成更小部分并索引。 属性有名称,索引器无名称,用 this 关键字指代对象实例。 基本示例 using System;
属性是类、结构体、接口的命名成员。成员变量或方法称为字段。属性是字段的扩展,使用相同语法访问。它们通过访问器读取、写入或计算私有字段值。 属性不命名存储位置,而是有访问器获取、设置或计算值。 访问器 属性的访问器包含获取(读取/计算)或设置(写入)属性的可执行语句。可包含 get 访问器、set 访问器或两者皆有。 完整属性示例 // Code 属性 public string Code { get { return code; } set { code = value; } } // Name 属性 public string Name { get { ret
反射对象用于在运行时获取类型信息。提供访问运行中程序元数据的类位于 System.Reflection 命名空间。该命名空间包含类,允许获取应用程序信息、动态添加类型、值、对象。 反射应用场景 运行时查看特性信息 检查程序集中的各种类型并实例化 方法和属性的晚绑定 运行时创建新类型并执行任务 查看元数据 初始化 System.Reflection.MemberInfo 对象发现与类关联的特性: System.Reflection.MemberInfo info = typeof(MyClass); 示例:读取类上的特性 using System; [AttributeUsage(
特性是声明性标记,用于向运行时传达程序元素(类、方法、结构、枚举、程序集等)的行为信息。通过方括号 [ ] 放在目标元素上方。特性用于添加元数据:编译器指令、注释、描述、方法、类等。 .NET Framework 提供两类特性:预定义特性和自定义特性。 指定特性语法 [attribute(positional_parameters, name_parameter = value, ...)] element 特性名及值在方括号内,位于应用元素之前。位置参数指定必需信息,命名参数指定可选信息。 三大预定义特性 AttributeUsage Conditional Obsolete A
文件是存储在磁盘上具有特定名称和目录路径的数据集合。打开文件进行读写时,它成为流。流本质是通过通信路径传递的字节序列。两大主流:输入流(读操作)和输出流(写操作)。 C# I/O 核心类 System.IO 命名空间提供文件操作类:创建/删除文件、读写、关闭等。 序号类及说明 1BinaryReader:从二进制流读取基元数据 2BinaryWriter:以二进制格式写入基元数据 3BufferedStream:字节流临时存储 4Directory:操作目录结构(静态方法) 5DirectoryInfo:目录操作(实例方法) 6DriveInfo:驱动器信息 7File:文件操作(静
异常是程序执行期间出现的问题。C# 异常是对程序运行时异常情况的响应(如除零)。异常提供从程序一部分向另一部分转移控制的方式。C# 异常处理基于四个关键字:try、catch、finally、throw。 关键字说明 try:标识可能激活特定异常的代码块,后跟一个或多个 catch 块。 catch:在想处理问题的地方捕获异常,catch 关键字指示捕获。 finally:无论是否抛出异常都执行的语句块。如打开文件,必须关闭无论是否异常。 throw:问题出现时抛出异常,使用 throw 关键字。 语法结构 try { // 可能引发异常的语句 } catch (Excepti
正则表达式是可匹配输入文本的模式。.NET 框架提供正则表达式引擎执行匹配。模式由字符字面量、运算符、构造组成。 正则表达式构造分类 字符转义 字符类 锚点 分组构造 量词 反向引用构造 替代构造 替换 杂项构造 Regex 类常用方法 序号方法及说明 1IsMatch(input):指示正则是否在输入字符串中找到匹配 2IsMatch(input, startat):从指定位置开始匹配 3IsMatch(input, pattern):静态方法,指定模式匹配 4Matches(input):搜索所有匹配项,返回 MatchCollection 5Replace(input,
预处理器指令指示编译器在实际编译开始前预处理信息。所有指令以 # 开头,行首仅允许空白字符。预处理器指令不是语句,不以分号结尾。 C# 编译器无独立预处理器,但按有预处理器方式处理指令。C# 预处理器指令用于条件编译,不同于 C/C++ 不用于创建宏。每行只能有一条预处理器指令。 C# 预处理器指令列表 序号指令及说明 1#define:定义符号(字符序列) 2#undef:取消定义符号 3#if:测试符号是否为真 4#else:配合 #if 创建复合条件 5#elif:创建复合条件指令 6#endif:结束条件指令 7#line:修改编译器行号和文件名输出 8#error:从特定位
命名空间旨在将一组名称与另一组名称分离。一个命名空间中声明的类名不会与另一命名空间中相同的类名冲突。 定义命名空间 namespace namespace_name { // 代码声明 } 调用命名空间成员:namespace_name.item_name 基本示例 using System; namespace first_space { class namespace_cl { public void func() { Console.WriteLine(Inside first_space); } } } namespace second_s
接口定义为语法契约,所有继承接口的类必须遵循。接口定义是什么,派生类定义怎么做。 接口定义属性、方法、事件(仅声明)。实现成员由派生类负责。接口提供派生类遵循的标准结构。抽象类类似但用于少量方法由基类声明、派生类实现功能的场景。 声明接口 使用 interface 关键字,成员默认 public: public interface ITransactions { void showTransaction(); double getAmount(); } 实现接口示例 using System; namespace InterfaceApplication { pu
C# 允许重定义或重载大多数内置运算符,使程序员能将运算符用于用户定义类型。重载运算符是特殊名称的函数:operator 关键字后跟运算符符号。与其他函数一样,有返回类型和参数列表。 运算符重载实现 以 Box 类为例,重载加法运算符 +: 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
多态意为多种形态。面向对象编程中常表达为一个接口,多种功能。多态分为静态和动态: 静态多态:编译时确定函数响应(早绑定) 动态多态:运行时决定函数响应(晚绑定) 静态多态 C# 通过两种技术实现静态多态: 函数重载 运算符重载(下章详解) 函数重载 同一作用域内可有多个同名函数定义,参数类型/数量不同即可。仅返回类型不同不能重载。 示例 using System; namespace PolymorphismApplication { class Printdata { void print(int i) { Console.WriteLine(Print
继承是面向对象编程最重要概念之一。继承允许以现有类为基础定义新类,便于创建和维护应用,实现代码复用,加快实现速度。 新类(派生类)继承现有类(基类)的成员。继承实现 IS-A 关系:哺乳动物 IS-A 动物,狗 IS-A 哺乳动物,因此狗 IS-A 动物。 基类与派生类 类可从多个类或接口派生,继承多个基类或接口的数据和函数。C# 创建派生类语法: <access-specifier> class <base_class> { ... } class <derived_class> : <base_class> { ... } 示例:Sha
定义类即定义数据类型蓝图。类定义不包含实际数据,但定义了类名含义:对象包含什么、能执行什么操作。对象是类的实例。类的方法和变量称为类成员。 定义类 类定义以 class 关键字开始,后跟类名,类体用大括号包围: <access specifier> class class_name { // 成员变量 <access specifier> <data type> variable1; <access specifier> <data type> variable2; ... // 成员方法
C语言