-
委托, lambda表达式和事件-C#学习笔记
第八章 委托, lambda表达式和事件 委托是 .NET 对方法的寻址方式. 它相当于 C/C++ 的函数指针, 但比函数指针更加安全, 用法也略有不同. Lambda 表达式与委托直接相关, 当参数为委托类型时, 可以使用 lambda 表达式实现委托引用的方法. 事件一般的思路是通知代码发生了什么. GUI 编程主要处理事件. 在引发事件时, 运行库需要知道应当执行哪个方法, 这就需要把处理事件的方法作为一个参数(实参, argument)传递给委托参数(形参, parameter). 委托 委托是一种特殊类型的对象, 其包含一个或多个方法的地址. 在 .NET 中, 如果要传递方法, 就必须把方法的细节封装在委托中. 声明委托 使用类时, 一般情况下... Read More
-
数组-C#学习笔记
第七章 数组 简单数组 数组的声明与初始化 声明一个int数组: int[] myArray = new int[4]; 可以在声明时使用花括号(数组初始化器)来初始化: int[] myArray = new int[4] {4, 7, 11, 2}; 如果使用花括号数组初始化器, 则可以不声明数组大小, 此时编译器会自动统计元素个数: int[] myArray = new int[] {4, 7, 11, 2}; 使用 C# 编译器还有一种更简化的方式: 使用花括号可以同时声明和初始化数组. int[] myArray = {4, 7, 11, 2}; 对于上面声明并初始化数组的三者, 编译器生成的代码都是相同的. 声明后的数组引用实际上指向数... Read More
-
运算符和类型强制转换-C#学习笔记
第六章 运算符和类型强制转换 运算符 C# 运算符非常类似于 C++, 但也有一些区别. 下表由上到下按照 C# 运算符优先级排列. | 运算符 | 类别或名称 | | ———————————————————— | ————————- | | x.y, f(x), a[i], x?.y, x?[y\], x++, x–, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x->y | 主要 ... Read More
-
泛型-C#学习笔记
第五章 泛型 本章介绍类, 接口, 方法的泛型. 用于委托的泛型参见第 8 章. 泛型概述 不同于 C++ 中模板在实例化时需要模板的源代码且会为每个模板的实例化创建单独的二进制码, C# 的泛型是 C# 语言的一种结构, 是 CLR (公共语言运行库)定义的. 性能 使用泛型集合类可以避免大量装箱和拆箱操作, 进而提升性能表现. 如果对值使用非泛型集合类(位于命名空间System.Collections中, 如ArrayList), 在把值类型转化为引用类型(boxing, 装箱), 和把引用类型转化为值类型(unboxing, 拆箱)时会产生较大性能损失, 尤其在遍历很多项时. 如果在把值类型传递给需要对象的变量, 装箱就会自动进行; 装箱后的值类型可... Read More
-
继承-C#学习笔记
第四章 继承 继承的类型 C# 中一个类可以派生自一个基类, 允许多层继承, 但不支持一个类派生自多个类, 但支持继承自多个接口. 类总是派生自System.Object或用户选择的一个类. 结构总是派生自System.ValueType, 结构不支持继承其他结构或类, 但结构可以继承任意多个接口. 实现继承 如果类与接口都用于派生, 则类总是放在接口的前面. public class MyDerivedClass: MyBaseClass, IInterface1, IInterface2 { //members } 结构只能派生自接口: public struct MyDerivedStruct: IInterface1, IInterfa... Read More
