C#中结构体数组指针如何赋值

dayong657 2013-08-04 09:31:30
结构体定义如下
 public struct LPBITMAPINFOHEADER
{
public UInt32 biSize;//DWORD=UInt32
public Int32 biWidth;
public Int32 biHeight;
public UInt16 biPlanes;// WORD=UInt16
public UInt16 biBitCount;
public UInt32 biCompression;
public UInt32 biSizeImage;
public Int32 biXPelsPerMeter;
public Int32 biYPelsPerMeter;
public UInt32 biClrUsed;
public UInt32 biClrImportant;
}

我想在类DemoClient定义成员变量时定义这个结构体类型的指针
 unsafe static LPBITMAPINFOHEADER* lpbi;

然后怎么给它一个初始地址和一定大小的内存空间。
PS:我是在做C++程序转C#。C++里是这样的
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;//定义
LPBITMAPINFOHEADER lpbi;//定义
lpbi = (LPBITMAPINFOHEADER)GlobalAlloc(GPTR, 2000 * 2000 * 4 + 5120);//这句赋值是在窗体加载函数里执行的
...全文
692 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dayong657 2013-08-13
  • 打赏
  • 举报
回复
[quote=引用 11 楼 dayong657 的回复:] [quote=引用 10 楼 soaringbird 的回复:] LPBITMAPINFOHEADER d; LPBITMAPINFOHEADER* pd=&d; 改一下: 最后我也是这么做的,我并没有建立LPBITMAPINFOHEADER结构体的指针,而是建立了这样的一个结构体变量,在需要传这个结构体地址参数的时候,我建立它的指针并得到它的地址。这个跟定义结构体变量的位置也有关系,最后算是解决了吧。
dayong657 2013-08-13
  • 打赏
  • 举报
回复
引用 10 楼 soaringbird 的回复:
LPBITMAPINFOHEADER d; LPBITMAPINFOHEADER* pd=&d;
最后我也是这么做的,我并没有建立LPBITMAPINFOHEADER结构体的指针,而是建立了这样的一个类,在需要传这个结构体地址参数的时候,我建立它的指针并得到它的地址。这个跟定义结构体的位置也有关系,最后算是解决了吧。
Trent1985 2013-08-05
  • 打赏
  • 举报
回复
上面这个Inptr就是指针,Marshal.AllocHGlobal就是用来分配内存的!懂了没?
soaringbird 2013-08-05
  • 打赏
  • 举报
回复
LPBITMAPINFOHEADER d; LPBITMAPINFOHEADER* pd=&d;
Trent1985 2013-08-05
  • 打赏
  • 举报
回复
//Class [StructLayout(LayoutKind.Sequential)] public struct Class { public int number; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] public Student[] students; // 结构体数组定义 } // 调用复杂结构体测试 int size = Marshal.SizeOf(typeof(Class)) * 50; IntPtr pBuff = Marshal.AllocHGlobal(size); //直接分配50个元素的空间,比Marshal.copy方便多了
soaringbird 2013-08-05
  • 打赏
  • 举报
回复
LPBITMAPINFOHEADER* pdd = (LPBITMAPINFOHEADER*)Marshal.AllocHGlobal(sizeof(LPBITMAPINFOHEADER)).ToPointer();
  • 打赏
  • 举报
回复
引用 3 楼 dayong657 的回复:
我想在类DemoClient定义成员变量时定义这个结构体类型的指针
你定义一个指针作什么用?
dayong657 2013-08-05
  • 打赏
  • 举报
回复
引用 2 楼 Trent1985 的回复:
看下就会了:http://dongtingyueh.blog.163.com/blog/static/4619453201302392757923/
我没看懂
dayong657 2013-08-05
  • 打赏
  • 举报
回复
引用 1 楼 MicrosoftCenterOfHN 的回复:
LPBITMAPINFOHEADER lpbi;就可以了。分配内存的事情你不用考虑,CLR帮你去做。
我想把lpbi定义成指针类型,上面这种定义不是结构体类型吗?
Trent1985 2013-08-05
  • 打赏
  • 举报
回复
看下就会了:http://dongtingyueh.blog.163.com/blog/static/4619453201302392757923/
dayong657 2013-08-05
  • 打赏
  • 举报
回复
引用 7 楼 Trent1985 的回复:
上面这个Inptr就是指针,Marshal.AllocHGlobal就是用来分配内存的!懂了没?
这个指针就是指向结构体类型的吗?是的话,是哪句实现的?
  • 打赏
  • 举报
回复
LPBITMAPINFOHEADER lpbi;就可以了。分配内存的事情你不用考虑,CLR帮你去做。
目录 1. 简介 1 1.1 Hello world 1 1.2 程序结构 2 1.3 类型和变量 3 1.4 表达式 6 1.5 语句 8 1.6 类和对象 12 1.6.1 成员 12 1.6.2 可访问性 13 1.6.3 类型参数 13 1.6.4 基类 14 1.6.5 字段 14 1.6.6 方法 15 1.6.6.1 参数 15 1.6.6.2 方法体和局部变量 17 1.6.6.3 静态方法和实例方法 17 1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 1.8 数组 26 1.9 接口 27 1.10 枚举 28 1.11 委托 29 1.12 特性 30 2. 词法结构 33 2.1 程序 33 2.2 文法 33 2.2.1 文法表示法 33 2.2.2 词法文法 34 2.2.3 句法文法 34 2.3 词法分析 34 2.3.1 行结束符 35 2.3.2 注释 35 2.3.3 空白 36 2.4 标记 37 2.4.1 Unicode 字符转义序列 37 2.4.2 标识符 38 2.4.3 关键字 39 2.4.4 文本 41 2.4.4.1 布尔值 41 2.4.4.2 整数 41 2.4.4.3 实数 42 2.4.4.4 字符 43 2.4.4.5 字符串 44 2.4.4.6 null 文本 46 2.4.5 运算符和标点符号 46 2.5 预处理指令 46 2.5.1 条件编译符号 47 2.5.2 预处理表达式 48 2.5.3 声明指令 49 2.5.4 条件编译指令 49 2.5.5 诊断指令 52 2.5.6 区域指令 52 2.5.7 行指令 53 2.5.8 Pragma 指令 53 2.5.8.1 Pragma warning 54 3. 基本概念 55 3.1 应用程序启动 55 3.2 应用程序终止 56 3.3 声明 56 3.4 成员 58 3.4.1 命名空间成员 58 3.4.2 结构成员 59 3.4.3 枚举成员 59 3.4.4 类成员 59 3.4.5 接口成员 59 3.4.6 数组成员 60 3.4.7 委托成员 60 3.5 成员访问 60 3.5.1 已声明可访问性 60 3.5.2 可访问域 61 3.5.3 实例成员的受保护访问 63 3.5.4 可访问性约束 64 3.6 签名和重载 65 3.7 范围 66 3.7.1 名称隐藏 68 3.7.1.1 通过嵌套隐藏 68 3.7.1.2 通过继承隐藏 69 3.8 命名空间和类型名称 70 3.8.1 完全限定名 72 3.9 自动内存管理 73 3.10 执行顺序 75 4. 类型 77 4.1 值类型 77 4.1.1 System.ValueType 类型 78 4.1.2 默认构造函数 78 4.1.3 结构类型 79 4.1.4 简单类型 79 4.1.5 整型 80 4.1.6 浮点型 81 4.1.7 decimal 类型 82 4.1.8 bool 类型 82 4.1.9 枚举类型 82 4.1.10 可以为 null 的类型 83 4.2 引用类型 83 4.2.1 类类型 84 4.2.2 对象类型 84 4.2.3 dynamic 类型 84 4.2.4 string 类型 85 4.2.5 接口类型 85 4.2.6 数组类型 85 4.2.7 委托类型 85 4.3 装箱和拆箱 85 4.3.1 装箱转换 85 4.3.2 拆箱转换 87 4.4 构造类型 87 4.4.1 类型实参 88 4.4.2 开放和封闭类型 88 4.4.3 绑定和未绑定类型 89 4.4.4 满足约束 89 4.5 类型形参 90 4.6 表达式树类型 91 4.7 dynamic 类型 91 5. 变量 93 5.1 变量类别 93 5.1.1 静态变量 93 5.1.2 实例变量 93 5.1.2.1 类的实例变量 93 5.1.2.2 结构的实例变量 94 5.1.3 数组元素 94 5.1.4 值参数 94 5.1.5 引用形参 94 5.1.6 输出形参 94 5.1.7 局部变量 95 5.2 默认值 95 5.3 明确赋值 96 5.3.1 初始已赋值变量 96 5.3.2 初始未赋值变量 97 5.3.3 确定明确赋值的细则 97 5.3.3.1 一般语句规则 98 5.3.3.2 块语句、checked 和 unchecked 语句 98 5.3.3.3 表达式语句 98 5.3.3.4 声明语句 98 5.3.3.5 if 语句 98 5.3.3.6 switch 语句 99 5.3.3.7 while 语句 99 5.3.3.8 do 语句 99 5.3.3.9 for 语句 99 5.3.3.10 break、continue 和 goto 语句 100 5.3.3.11 throw 语句 100 5.3.3.12 return 语句 100 5.3.3.13 try-catch 语句 100 5.3.3.14 try-finally 语句 100 5.3.3.15 try-catch-finally 语句 101 5.3.3.16 foreach 语句 102 5.3.3.17 using 语句 102 5.3.3.18 lock 语句 102 5.3.3.19 yield 语句 102 5.3.3.20 简单表达式的一般规则 102 5.3.3.21 带有嵌入表达式的表达式的一般规则 103 5.3.3.22 调用表达式和对象创建表达式 103 5.3.3.23 简单赋值表达式 103 5.3.3.24 && 表达式 104 5.3.3.25 || 表达式 104 5.3.3.26 ! 表达式 105 5.3.3.27 ?? 表达式 106 5.3.3.28 ?: 表达式 106 5.3.3.29 匿名函数 106 5.4 变量引用 107 5.5 变量引用的原子性 107 6. 转换 109 6.1 隐式转换 109 6.1.1 标识转换 110 6.1.2 隐式数值转换 110 6.1.3 隐式枚举转换 110 6.1.4 可以为 null 的隐式转换 110 6.1.5 null 文本转换 111 6.1.6 隐式引用转换 111 6.1.7 装箱转换 111 6.1.8 隐式动态转换 112 6.1.9 隐式常量表达式转换 112 6.1.10 涉及类型形参的隐式转换 112 6.1.11 用户定义的隐式转换 113 6.1.12 匿名函数转换和方法组转换 113 6.2 显式转换 113 6.2.1 显式数值转换 114 6.2.2 显式枚举转换 115 6.2.3 可以为 null 的显式转换 115 6.2.4 显式引用转换 116 6.2.5 拆箱转换 117 6.2.6 显式动态转换 117 6.2.7 涉及类型形参的显式转换 118 6.2.8 用户定义的显式转换 118 6.3 标准转换 119 6.3.1 标准隐式转换 119 6.3.2 标准显式转换 119 6.4 用户定义的转换 119 6.4.1 允许的用户定义转换 119 6.4.2 提升转换运算符 119 6.4.3 用户定义转换的计算 120 6.4.4 用户定义的隐式转换 120 6.4.5 用户定义的显式转换 121 6.5 匿名函数转换 122 6.5.1 匿名函数转换为委托类型的计算 123 6.5.2 匿名函数转换为表达式树类型的计算 124 6.5.3 实现示例 124 6.6 方法组转换 126 7. 表达式 129 7.1 表达式的分类 129 7.1.1 表达式的值 130 7.2 静态和动态绑定 130 7.2.1 绑定时间 131 7.2.2 动态绑定 131 7.2.3 构成表达式的类型 131 7.3 运算符 131 7.3.1 运算符的优先级和顺序关联性 132 7.3.2 运算符重载 133 7.3.3 一元运算符重载决策 134 7.3.4 二元运算符重载决策 134 7.3.5 候选用户定义运算符 134 7.3.6 数值提升 135 7.3.6.1 一元数值提升 135 7.3.6.2 二元数值提升 135 7.3.7 提升运算符 136 7.4 成员查找 137 7.4.1 基类型 138 7.5 函数成员 138 7.5.1 实参列表 140 7.5.1.1 对应形参 141 7.5.1.2 实参列表的运行时计算 142 7.5.2 类型推断 143 7.5.2.1 第一阶段 144 7.5.2.2 第二阶段 144 7.5.2.3 输入类型 144 7.5.2.4 输出类型 145 7.5.2.5 依赖 145 7.5.2.6 输出类型推断 145 7.5.2.7 参数类型显式推断 145 7.5.2.8 精确推断 145 7.5.2.9 下限推断 145 7.5.2.10 上限推断 146 7.5.2.11 固定 147 7.5.2.12 推断返回类型 147 7.5.2.13 方法组转换的类型推断 148 7.5.2.14 查找一组表达式的最通用类型 148 7.5.3 重载决策 149 7.5.3.1 适用函数成员 149 7.5.3.2 更好的函数成员 150 7.5.3.3 表达式的更佳转换 151 7.5.3.4 类型的更佳转换 151 7.5.3.5 更佳转换目标 151 7.5.3.6 泛型类的重载 151 7.5.4 动态重载决策的编译时检查 152 7.5.5 函数成员调用 152 7.5.5.1 已装箱实例上的调用 153 7.6 基本表达式 154 7.6.1 文本 154 7.6.2 简单名称 154 7.6.2.1 块的固定含义 155 7.6.3 带括号的表达式 156 7.6.4 成员访问 157 7.6.4.1 相同的简单名称和类型名称 158 7.6.4.2 语法多义性 159 7.6.5 调用表达式 159 7.6.5.1 方法调用 160 7.6.5.2 扩展方法调用 161 7.6.5.3 委托调用 163 7.6.6 元素访问 164 7.6.6.1 数组访问 164 7.6.6.2 索引器访问 165 7.6.7 this 访问 165 7.6.8 基访问 166 7.6.9 后缀增量和后缀减量运算符 166 7.6.10 new 运算符 167 7.6.10.1 对象创建表达式 168 7.6.10.2 对象初始值设定项 169 7.6.10.3 集合初始值设定项 171 7.6.10.4 数组创建表达式 172 7.6.10.5 委托创建表达式 174 7.6.10.6 匿名对象创建表达式 175 7.6.11 typeof 运算符 177 7.6.12 checked 和 unchecked 运算符 178 7.6.13 默认值表达式 180 7.6.14 匿名方法表达式 181 7.7 一元运算符 181 7.7.1 一元加运算符 181 7.7.2 一元减运算符 181 7.7.3 逻辑否定运算符 182 7.7.4 按位求补运算符 182 7.7.5 前缀增量和减量运算符 182 7.7.6 强制转换表达式 183 7.8 算术运算符 184 7.8.1 乘法运算符 184 7.8.2 除法运算符 185 7.8.3 余数运算符 186 7.8.4 加法运算符 187 7.8.5 减法运算符 189 7.9 移位运算符 190 7.10 关系和类型测试运算符 192 7.10.1 整数比较运算符 192 7.10.2 浮点比较运算符 193 7.10.3 小数比较运算符 194 7.10.4 布尔相等运算符 194 7.10.5 枚举比较运算符 194 7.10.6 引用类型相等运算符 194 7.10.7 字符串相等运算符 196 7.10.8 委托相等运算符 196 7.10.9 相等运算符和 null 197 7.10.10 is 运算符 197 7.10.11 as 运算符 197 7.11 逻辑运算符 198 7.11.1 整数逻辑运算符 199 7.11.2 枚举逻辑运算符 199 7.11.3 布尔逻辑运算符 199 7.11.4 可以为 null 的布尔逻辑运算符 199 7.12 条件逻辑运算符 200 7.12.1 布尔条件逻辑运算符 200 7.12.2 用户定义的条件逻辑运算符 201 7.13 空合并运算符 201 7.14 条件运算符 202 7.15 匿名函数表达式 203 7.15.1 匿名函数签名 204 7.15.2 匿名函数体 205 7.15.3 重载决策 205 7.15.4 匿名函数与动态绑定 206 7.15.5 外层变量 206 7.15.5.1 捕获的外层变量 206 7.15.5.2 局部变量实例化 207 7.15.6 匿名函数表达式计算 209 7.16 查询表达式 209 7.16.1 查询表达式的多义性 210 7.16.2 查询表达式转换 210 7.16.2.1 带继续符的 select 和 groupby 子句 211 7.16.2.2 显式范围变量类型 211 7.16.2.3 退化查询表达式 212 7.16.2.4 from、let、where、join 和 orderby 子句 212 7.16.2.5 select 子句 216 7.16.2.6 Groupby 子句 216 7.16.2.7 透明标识符 216 7.16.3 查询表达式模式 218 7.17 赋值运算符 219 7.17.1 简单赋值 219 7.17.2 复合赋值 221 7.17.3 事件赋值 222 7.18 表达式 222 7.19 常量表达式 223 7.20 布尔表达式 224 8. 语句 225 8.1 结束点和可到达性 225 8.2 块 227 8.2.1 语句列表 227 8.3 空语句 228 8.4 标记语句 228 8.5 声明语句 229 8.5.1 局部变量声明 229 8.5.2 局部常量声明 230 8.6 表达式语句 231 8.7 选择语句 231 8.7.1 if 语句 231 8.7.2 switch 语句 232 8.8 迭代语句 236 8.8.1 while 语句 236 8.8.2 do 语句 236 8.8.3 for 语句 237 8.8.4 foreach 语句 238 8.9 跳转语句 240 8.9.1 break 语句 241 8.9.2 continue 语句 242 8.9.3 goto 语句 242 8.9.4 return 语句 243 8.9.5 throw 语句 244 8.10 try 语句 245 8.11 checked 语句和 unchecked 语句 247 8.12 lock 语句 248 8.13 using 语句 248 8.14 yield 语句 250 9. 命名空间 253 9.1 编译单元 253 9.2 命名空间声明 253 9.3 Extern 别名 254 9.4 using 指令 255 9.4.1 using 别名指令 256 9.4.2 Using 命名空间指令 258 9.5 命名空间成员 260 9.6 类型声明 260 9.7 命名空间别名限定符 261 9.7.1 别名的唯一性 262 10. 类 263 10.1 类声明 263 10.1.1 类修饰符 263 10.1.1.1 抽象类 264 10.1.1.2 密封类 264 10.1.1.3 静态类 264 10.1.2 分部修饰符 265 10.1.3 类型形参 265 10.1.4 类基本规范 266 10.1.4.1 基类 266 10.1.4.2 接口实现 267 10.1.5 类型形参约束 268 10.1.6 类体 272 10.2 分部类型 272 10.2.1 特性 272 10.2.2 修饰符 273 10.2.3 类型形参和约束 273 10.2.4 基类 273 10.2.5 基接口 274 10.2.6 成员 274 10.2.7 分部方法 275 10.2.8 名称绑定 277 10.3 类成员 277 10.3.1 实例类型 278 10.3.2 构造类型的成员 279 10.3.3 继承 280 10.3.4 new 修饰符 280 10.3.5 访问修饰符 281 10.3.6 构成类型 281 10.3.7 静态成员和实例成员 281 10.3.8 嵌套类型 282 10.3.8.1 完全限定名 282 10.3.8.2 已声明可访问性 282 10.3.8.3 隐藏 283 10.3.8.4 this 访问 283 10.3.8.5 对包含类型的私有和受保护成员的访问 284 10.3.8.6 泛型类的嵌套类型 285 10.3.9 保留成员名称 286 10.3.9.1 为属性保留的成员名称 286 10.3.9.2 为事件保留的成员名称 287 10.3.9.3 为索引器保留的成员名称 287 10.3.9.4 为析构函数保留的成员名称 287 10.4 常量 287 10.5 字段 289 10.5.1 静态字段和实例字段 290 10.5.2 只读字段 291 10.5.2.1 对常量使用静态只读字段 291 10.5.2.2 常量和静态只读字段的版本控制 291 10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 295 10.6 方法 296 10.6.1 方法形参 298 10.6.1.1 值参数 299 10.6.1.2 引用形参 299 10.6.1.3 输出形参 300 10.6.1.4 形参数组 301 10.6.2 静态方法和实例方法 303 10.6.3 虚方法 304 10.6.4 重写方法 305 10.6.5 密封方法 307 10.6.6 抽象方法 308 10.6.7 外部方法 309 10.6.8 分部方法 310 10.6.9 扩展方法 310 10.6.10 方法体 311 10.6.11 方法重载 311 10.7 属性 311 10.7.1 静态属性和实例属性 312 10.7.2 访问器 313 10.7.3 自动实现的属性 317 10.7.4 可访问性 318 10.7.5 虚、密封、重写和抽象访问器 319 10.8 事件 321 10.8.1 类似字段的事件 323 10.8.2 事件访问器 324 10.8.3 静态事件和实例事件 325 10.8.4 虚、密封、重写和抽象访问器 325 10.9 索引器 326 10.9.1 索引器重载 329 10.10 运算符 329 10.10.1 一元运算符 331 10.10.2 二元运算符 331 10.10.3 转换运算符 332 10.11 实例构造函数 334 10.11.1 构造函数初始值设定项 335 10.11.2 实例变量初始值设定项 336 10.11.3 构造函数执行 336 10.11.4 默认构造函数 338 10.11.5 私有构造函数 338 10.11.6 可选的实例构造函数形参 339 10.12 静态构造函数 339 10.13 析构函数 341 10.14 迭代器 343 10.14.1 枚举器接口 343 10.14.2 可枚举接口 343 10.14.3 产生类型 343 10.14.4 枚举器对象 343 10.14.4.1 MoveNext 方法 344 10.14.4.2 Current 属性 345 10.14.4.3 Dispose 方法 345 10.14.5 可枚举对象 345 10.14.5.1 GetEnumerator 方法 346 10.14.6 实现示例 346 11. 结构 353 11.1 结构声明 353 11.1.1 结构修饰符 353 11.1.2 分部修饰符 353 11.1.3 结构接口 354 11.1.4 结构体 354 11.2 结构成员 354 11.3 类和结构的区别 354 11.3.1 值语义 355 11.3.2 继承 355 11.3.3 赋值 356 11.3.4 默认值 356 11.3.5 装箱和拆箱 356 11.3.6 this 的含义 358 11.3.7 字段初始值设定项 358 11.3.8 构造函数 358 11.3.9 析构函数 359 11.3.10 静态构造函数 359 11.4 结构示例 360 11.4.1 数据库整数类型 360 11.4.2 数据库布尔类型 361 12. 数组 365 12.1 数组类型 365 12.1.1 System.Array 类型 366 12.1.2 数组和泛型 IList 接口 366 12.2 数组创建 366 12.3 数组元素访问 367 12.4 数组成员 367 12.5 数组协变 367 12.6 数组初始值设定项 367 13. 接口 369 13.1 接口声明 369 13.1.1 接口修饰符 369 13.1.2 分部修饰符 369 13.1.3 Variant 类型形参列表 370 13.1.3.1 变化安全性 370 13.1.3.2 变化转换 371 13.1.4 基接口 371 13.1.5 接口体 372 13.2 接口成员 372 13.2.1 接口方法 373 13.2.2 接口属性 373 13.2.3 接口事件 374 13.2.4 接口索引器 374 13.2.5 接口成员访问 374 13.3 完全限定接口成员名 376 13.4 接口实现 376 13.4.1 显式接口成员实现 377 13.4.2 所实现接口的唯一性 379 13.4.3 泛型方法实现 380 13.4.4 接口映射 381 13.4.5 接口实现继承 383 13.4.6 接口重新实现 385 13.4.7 抽象类和接口 386 14. 枚举 387 14.1 枚举声明 387 14.2 枚举修饰符 387 14.3 枚举成员 388 14.4 System.Enum 类型 390 14.5 枚举值和运算 390 15. 委托 391 15.1 委托声明 391 15.2 委托兼容性 393 15.3 委托实例化 393 15.4 委托调用 394 16. 异常 397 16.1 导致异常的原因 397 16.2 System.Exception 类 397 16.3 异常的处理方式 397 16.4 公共异常类 398 17. 特性 399 17.1 特性类 399 17.1.1 特性用法 399 17.1.2 定位和命名参数 400 17.1.3 特性参数类型 401 17.2 特性说明 401 17.3 特性实例 406 17.3.1 特性的编译 406 17.3.2 特性实例的运行时检索 406 17.4 保留特性 407 17.4.1 AttributeUsage 特性 407 17.4.2 Conditional 特性 408 17.4.2.1 条件方法 408 17.4.2.2 条件特性类 410 17.4.3 Obsolete 特性 411 17.5 互操作的特性 412 17.5.1 与 COM 和 Win32 组件的互操作 412 17.5.2 与其他 .NET 语言的互操作 412 17.5.2.1 IndexerName 特性 412 18. 不安全代码 413 18.1 不安全上下文 413 18.2 指针类型 415 18.3 固定和可移动变量 418 18.4 指针转换 418 18.4.1 指针数组 419 18.5 表达式指针 420 18.5.1 指针间接寻址 420 18.5.2 指针成员访问 421 18.5.3 指针元素访问 422 18.5.4 address-of 运算符 422 18.5.5 指针递增和递减 423 18.5.6 指针算术运算 423 18.5.7 指针比较 424 18.5.8 sizeof 运算符 425 18.6 fixed 语句 425 18.7 固定大小缓冲区 429 18.7.1 固定大小缓冲区的声明 429 18.7.2 表达式的固定大小缓冲区 430 18.7.3 明确赋值检查 431 18.8 堆栈分配 431 18.9 动态内存分配 432 A. 文档注释 435 A.1 简介 435 A.2 建议的标记 436 A.2.1 437 A.2.2 437 A.2.3 437 A.2.4 438 A.2.5 438 A.2.6 439 A.2.7 440 A.2.8 440 A.2.9 441 A.2.10 441 A.2.11 442 A.2.12 442 A.2.13 442 A.2.14 443 A.2.15 443 A.2.16 444 A.2.17 444 A.2.18 444 A.3 处理文档文件 445 A.3.1 ID 字符串格式 445 A.3.2 ID 字符串示例 446 A.4 示例 449 A.4.1 C# 源代码 449 A.4.2 生成 XML 452 B. 语法 455 B.1 词法文法 455 B.1.1 行结束符 455 B.1.2 注释 455 B.1.3 空白 456 B.1.4 标记 456 B.1.5 Unicode 字符转义序列 456 B.1.6 标识符 456 B.1.7 关键字 458 B.1.8 文本 458 B.1.9 运算符和标点符号 460 B.1.10 预处理指令 460 B.2 句法文法 463 B.2.1 基本概念 463 B.2.2 类型 463 B.2.3 变量 464 B.2.4 表达式 464 B.2.5 语句 471 B.2.6 命名空间 475 B.2.7 类 475 B.2.8 结构 483 B.2.9 数组 483 B.2.10 接口 484 B.2.11 枚举 485 B.2.12 委托 486 B.2.13 特性 486 B.3 不安全代码的语法扩展 487 C. 参考资料 491
这个是C#语言规范2.0,3.0,4.0的合集,是关于 C# 语法的权威资料。它们包含该语言各个方面的详细信息,包括 Visual C# 产品文档未涉及的许多语法点。 4.0目录 1. 简介 1 1.1 Hello world 1 1.2 程序结构 2 1.3 类型和变量 3 1.4 表达式 6 1.5 语句 8 1.6 类和对象 12 1.6.1 成员 12 1.6.2 可访问性 13 1.6.3 类型参数 13 1.6.4 基类 14 1.6.5 字段 14 1.6.6 方法 15 1.6.6.1 参数 15 1.6.6.2 方法体和局部变量 17 1.6.6.3 静态方法和实例方法 17 1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 1.8 数组 26 1.9 接口 27 1.10 枚举 28 1.11 委托 29 1.12 特性 30 2. 词法结构 33 2.1 程序 33 2.2 文法 33 2.2.1 文法表示法 33 2.2.2 词法文法 34 2.2.3 句法文法 34 2.3 词法分析 34 2.3.1 行结束符 35 2.3.2 注释 35 2.3.3 空白 36 2.4 标记 37 2.4.1 Unicode 字符转义序列 37 2.4.2 标识符 38 2.4.3 关键字 39 2.4.4 文本 41 2.4.4.1 布尔值 41 2.4.4.2 整数 41 2.4.4.3 实数 42 2.4.4.4 字符 43 2.4.4.5 字符串 44 2.4.4.6 null 文本 46 2.4.5 运算符和标点符号 46 2.5 预处理指令 46 2.5.1 条件编译符号 47 2.5.2 预处理表达式 48 2.5.3 声明指令 49 2.5.4 条件编译指令 49 2.5.5 诊断指令 52 2.5.6 区域指令 52 2.5.7 行指令 53 2.5.8 Pragma 指令 53 2.5.8.1 Pragma warning 54 3. 基本概念 55 3.1 应用程序启动 55 3.2 应用程序终止 56 3.3 声明 56 3.4 成员 58 3.4.1 命名空间成员 58 3.4.2 结构成员 59 3.4.3 枚举成员 59 3.4.4 类成员 59 3.4.5 接口成员 59 3.4.6 数组成员 60 3.4.7 委托成员 60 3.5 成员访问 60 3.5.1 已声明可访问性 60 3.5.2 可访问域 61 3.5.3 实例成员的受保护访问 63 3.5.4 可访问性约束 64 3.6 签名和重载 65 3.7 范围 66 3.7.1 名称隐藏 68 3.7.1.1 通过嵌套隐藏 68 3.7.1.2 通过继承隐藏 69 3.8 命名空间和类型名称 70 3.8.1 完全限定名 72 3.9 自动内存管理 73 3.10 执行顺序 75 4. 类型 77 4.1 值类型 77 4.1.1 System.ValueType 类型 78 4.1.2 默认构造函数 78 4.1.3 结构类型 79 4.1.4 简单类型 79 4.1.5 整型 80 4.1.6 浮点型 81 4.1.7 decimal 类型 82 4.1.8 bool 类型 82 4.1.9 枚举类型 82 4.1.10 可以为 null 的类型 83 4.2 引用类型 83 4.2.1 类类型 84 4.2.2 对象类型 84 4.2.3 dynamic 类型 84 4.2.4 string 类型 85 4.2.5 接口类型 85 4.2.6 数组类型 85 4.2.7 委托类型 85 4.3 装箱和拆箱 85 4.3.1 装箱转换 85 4.3.2 拆箱转换 87 4.4 构造类型 87 4.4.1 类型实参 88 4.4.2 开放和封闭类型 88 4.4.3 绑定和未绑定类型 89 4.4.4 满足约束 89 4.5 类型形参 90 4.6 表达式树类型 91 4.7 dynamic 类型 91 5. 变量 93 5.1 变量类别 93 5.1.1 静态变量 93 5.1.2 实例变量 93 5.1.2.1 类的实例变量 93 5.1.2.2 结构的实例变量 94 5.1.3 数组元素 94 5.1.4 值参数 94 5.1.5 引用形参 94 5.1.6 输出形参 94 5.1.7 局部变量 95 5.2 默认值 95 5.3 明确赋值 96 5.3.1 初始已赋值变量 96 5.3.2 初始未赋值变量 97 5.3.3 确定明确赋值的细则 97 5.3.3.1 一般语句规则 98 5.3.3.2 块语句、checked 和 unchecked 语句 98 5.3.3.3 表达式语句 98 5.3.3.4 声明语句 98 5.3.3.5 if 语句 98 5.3.3.6 switch 语句 99 5.3.3.7 while 语句 99 5.3.3.8 do 语句 99 5.3.3.9 for 语句 99 5.3.3.10 break、continue 和 goto 语句 100 5.3.3.11 throw 语句 100 5.3.3.12 return 语句 100 5.3.3.13 try-catch 语句 100 5.3.3.14 try-finally 语句 100 5.3.3.15 try-catch-finally 语句 101 5.3.3.16 foreach 语句 102 5.3.3.17 using 语句 102 5.3.3.18 lock 语句 102 5.3.3.19 yield 语句 102 5.3.3.20 简单表达式的一般规则 102 5.3.3.21 带有嵌入表达式的表达式的一般规则 103 5.3.3.22 调用表达式和对象创建表达式 103 5.3.3.23 简单赋值表达式 103 5.3.3.24 && 表达式 104 5.3.3.25 || 表达式 104 5.3.3.26 ! 表达式 105 5.3.3.27 ?? 表达式 106 5.3.3.28 ?: 表达式 106 5.3.3.29 匿名函数 106 5.4 变量引用 107 5.5 变量引用的原子性 107 6. 转换 109 6.1 隐式转换 109 6.1.1 标识转换 110 6.1.2 隐式数值转换 110 6.1.3 隐式枚举转换 110 6.1.4 可以为 null 的隐式转换 110 6.1.5 null 文本转换 111 6.1.6 隐式引用转换 111 6.1.7 装箱转换 111 6.1.8 隐式动态转换 112 6.1.9 隐式常量表达式转换 112 6.1.10 涉及类型形参的隐式转换 112 6.1.11 用户定义的隐式转换 113 6.1.12 匿名函数转换和方法组转换 113 6.2 显式转换 113 6.2.1 显式数值转换 114 6.2.2 显式枚举转换 115 6.2.3 可以为 null 的显式转换 115 6.2.4 显式引用转换 116 6.2.5 拆箱转换 117 6.2.6 显式动态转换 117 6.2.7 涉及类型形参的显式转换 118 6.2.8 用户定义的显式转换 118 6.3 标准转换 119 6.3.1 标准隐式转换 119 6.3.2 标准显式转换 119 6.4 用户定义的转换 119 6.4.1 允许的用户定义转换 119 6.4.2 提升转换运算符 119 6.4.3 用户定义转换的计算 120 6.4.4 用户定义的隐式转换 120 6.4.5 用户定义的显式转换 121 6.5 匿名函数转换 122 6.5.1 匿名函数转换为委托类型的计算 123 6.5.2 匿名函数转换为表达式树类型的计算 124 6.5.3 实现示例 124 6.6 方法组转换 126 7. 表达式 129 7.1 表达式的分类 129 7.1.1 表达式的值 130 7.2 静态和动态绑定 130 7.2.1 绑定时间 131 7.2.2 动态绑定 131 7.2.3 构成表达式的类型 131 7.3 运算符 131 7.3.1 运算符的优先级和顺序关联性 132 7.3.2 运算符重载 133 7.3.3 一元运算符重载决策 134 7.3.4 二元运算符重载决策 134 7.3.5 候选用户定义运算符 134 7.3.6 数值提升 135 7.3.6.1 一元数值提升 135 7.3.6.2 二元数值提升 135 7.3.7 提升运算符 136 7.4 成员查找 137 7.4.1 基类型 138 7.5 函数成员 138 7.5.1 实参列表 140 7.5.1.1 对应形参 141 7.5.1.2 实参列表的运行时计算 142 7.5.2 类型推断 143 7.5.2.1 第一阶段 144 7.5.2.2 第二阶段 144 7.5.2.3 输入类型 144 7.5.2.4 输出类型 145 7.5.2.5 依赖 145 7.5.2.6 输出类型推断 145 7.5.2.7 参数类型显式推断 145 7.5.2.8 精确推断 145 7.5.2.9 下限推断 145 7.5.2.10 上限推断 146 7.5.2.11 固定 147 7.5.2.12 推断返回类型 147 7.5.2.13 方法组转换的类型推断 148 7.5.2.14 查找一组表达式的最通用类型 148 7.5.3 重载决策 149 7.5.3.1 适用函数成员 149 7.5.3.2 更好的函数成员 150 7.5.3.3 表达式的更佳转换 151 7.5.3.4 类型的更佳转换 151 7.5.3.5 更佳转换目标 151 7.5.3.6 泛型类的重载 151 7.5.4 动态重载决策的编译时检查 152 7.5.5 函数成员调用 152 7.5.5.1 已装箱实例上的调用 153 7.6 基本表达式 154 7.6.1 文本 154 7.6.2 简单名称 154 7.6.2.1 块的固定含义 155 7.6.3 带括号的表达式 156 7.6.4 成员访问 157 7.6.4.1 相同的简单名称和类型名称 158 7.6.4.2 语法多义性 159 7.6.5 调用表达式 159 7.6.5.1 方法调用 160 7.6.5.2 扩展方法调用 161 7.6.5.3 委托调用 163 7.6.6 元素访问 164 7.6.6.1 数组访问 164 7.6.6.2 索引器访问 165 7.6.7 this 访问 165 7.6.8 基访问 166 7.6.9 后缀增量和后缀减量运算符 166 7.6.10 new 运算符 167 7.6.10.1 对象创建表达式 168 7.6.10.2 对象初始值设定项 169 7.6.10.3 集合初始值设定项 171 7.6.10.4 数组创建表达式 172 7.6.10.5 委托创建表达式 174 7.6.10.6 匿名对象创建表达式 175 7.6.11 typeof 运算符 177 7.6.12 checked 和 unchecked 运算符 178 7.6.13 默认值表达式 180 7.6.14 匿名方法表达式 181 7.7 一元运算符 181 7.7.1 一元加运算符 181 7.7.2 一元减运算符 181 7.7.3 逻辑否定运算符 182 7.7.4 按位求补运算符 182 7.7.5 前缀增量和减量运算符 182 7.7.6 强制转换表达式 183 7.8 算术运算符 184 7.8.1 乘法运算符 184 7.8.2 除法运算符 185 7.8.3 余数运算符 186 7.8.4 加法运算符 187 7.8.5 减法运算符 189 7.9 移位运算符 190 7.10 关系和类型测试运算符 192 7.10.1 整数比较运算符 192 7.10.2 浮点比较运算符 193 7.10.3 小数比较运算符 194 7.10.4 布尔相等运算符 194 7.10.5 枚举比较运算符 194 7.10.6 引用类型相等运算符 194 7.10.7 字符串相等运算符 196 7.10.8 委托相等运算符 196 7.10.9 相等运算符和 null 197 7.10.10 is 运算符 197 7.10.11 as 运算符 197 7.11 逻辑运算符 198 7.11.1 整数逻辑运算符 199 7.11.2 枚举逻辑运算符 199 7.11.3 布尔逻辑运算符 199 7.11.4 可以为 null 的布尔逻辑运算符 199 7.12 条件逻辑运算符 200 7.12.1 布尔条件逻辑运算符 200 7.12.2 用户定义的条件逻辑运算符 201 7.13 空合并运算符 201 7.14 条件运算符 202 7.15 匿名函数表达式 203 7.15.1 匿名函数签名 204 7.15.2 匿名函数体 205 7.15.3 重载决策 205 7.15.4 匿名函数与动态绑定 206 7.15.5 外层变量 206 7.15.5.1 捕获的外层变量 206 7.15.5.2 局部变量实例化 207 7.15.6 匿名函数表达式计算 209 7.16 查询表达式 209 7.16.1 查询表达式的多义性 210 7.16.2 查询表达式转换 210 7.16.2.1 带继续符的 select 和 groupby 子句 211 7.16.2.2 显式范围变量类型 211 7.16.2.3 退化查询表达式 212 7.16.2.4 from、let、where、join 和 orderby 子句 212 7.16.2.5 select 子句 216 7.16.2.6 Groupby 子句 216 7.16.2.7 透明标识符 216 7.16.3 查询表达式模式 218 7.17 赋值运算符 219 7.17.1 简单赋值 219 7.17.2 复合赋值 221 7.17.3 事件赋值 222 7.18 表达式 222 7.19 常量表达式 223 7.20 布尔表达式 224 8. 语句 225 8.1 结束点和可到达性 225 8.2 块 227 8.2.1 语句列表 227 8.3 空语句 228 8.4 标记语句 228 8.5 声明语句 229 8.5.1 局部变量声明 229 8.5.2 局部常量声明 230 8.6 表达式语句 231 8.7 选择语句 231 8.7.1 if 语句 231 8.7.2 switch 语句 232 8.8 迭代语句 236 8.8.1 while 语句 236 8.8.2 do 语句 236 8.8.3 for 语句 237 8.8.4 foreach 语句 238 8.9 跳转语句 240 8.9.1 break 语句 241 8.9.2 continue 语句 242 8.9.3 goto 语句 242 8.9.4 return 语句 243 8.9.5 throw 语句 244 8.10 try 语句 245 8.11 checked 语句和 unchecked 语句 247 8.12 lock 语句 248 8.13 using 语句 248 8.14 yield 语句 250 9. 命名空间 253 9.1 编译单元 253 9.2 命名空间声明 253 9.3 Extern 别名 254 9.4 using 指令 255 9.4.1 using 别名指令 256 9.4.2 Using 命名空间指令 258 9.5 命名空间成员 260 9.6 类型声明 260 9.7 命名空间别名限定符 261 9.7.1 别名的唯一性 262 10. 类 263 10.1 类声明 263 10.1.1 类修饰符 263 10.1.1.1 抽象类 264 10.1.1.2 密封类 264 10.1.1.3 静态类 264 10.1.2 分部修饰符 265 10.1.3 类型形参 265 10.1.4 类基本规范 266 10.1.4.1 基类 266 10.1.4.2 接口实现 267 10.1.5 类型形参约束 268 10.1.6 类体 272 10.2 分部类型 272 10.2.1 特性 272 10.2.2 修饰符 273 10.2.3 类型形参和约束 273 10.2.4 基类 273 10.2.5 基接口 274 10.2.6 成员 274 10.2.7 分部方法 275 10.2.8 名称绑定 277 10.3 类成员 277 10.3.1 实例类型 278 10.3.2 构造类型的成员 279 10.3.3 继承 280 10.3.4 new 修饰符 280 10.3.5 访问修饰符 281 10.3.6 构成类型 281 10.3.7 静态成员和实例成员 281 10.3.8 嵌套类型 282 10.3.8.1 完全限定名 282 10.3.8.2 已声明可访问性 282 10.3.8.3 隐藏 283 10.3.8.4 this 访问 283 10.3.8.5 对包含类型的私有和受保护成员的访问 284 10.3.8.6 泛型类的嵌套类型 285 10.3.9 保留成员名称 286 10.3.9.1 为属性保留的成员名称 286 10.3.9.2 为事件保留的成员名称 287 10.3.9.3 为索引器保留的成员名称 287 10.3.9.4 为析构函数保留的成员名称 287 10.4 常量 287 10.5 字段 289 10.5.1 静态字段和实例字段 290 10.5.2 只读字段 291 10.5.2.1 对常量使用静态只读字段 291 10.5.2.2 常量和静态只读字段的版本控制 291 10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 295 10.6 方法 296 10.6.1 方法形参 298 10.6.1.1 值参数 299 10.6.1.2 引用形参 299 10.6.1.3 输出形参 300 10.6.1.4 形参数组 301 10.6.2 静态方法和实例方法 303 10.6.3 虚方法 304 10.6.4 重写方法 305 10.6.5 密封方法 307 10.6.6 抽象方法 308 10.6.7 外部方法 309 10.6.8 分部方法 310 10.6.9 扩展方法 310 10.6.10 方法体 311 10.6.11 方法重载 311 10.7 属性 311 10.7.1 静态属性和实例属性 312 10.7.2 访问器 313 10.7.3 自动实现的属性 317 10.7.4 可访问性 318 10.7.5 虚、密封、重写和抽象访问器 319 10.8 事件 321 10.8.1 类似字段的事件 323 10.8.2 事件访问器 324 10.8.3 静态事件和实例事件 325 10.8.4 虚、密封、重写和抽象访问器 325 10.9 索引器 326 10.9.1 索引器重载 329 10.10 运算符 329 10.10.1 一元运算符 331 10.10.2 二元运算符 331 10.10.3 转换运算符 332 10.11 实例构造函数 334 10.11.1 构造函数初始值设定项 335 10.11.2 实例变量初始值设定项 336 10.11.3 构造函数执行 336 10.11.4 默认构造函数 338 10.11.5 私有构造函数 338 10.11.6 可选的实例构造函数形参 339 10.12 静态构造函数 339 10.13 析构函数 341 10.14 迭代器 343 10.14.1 枚举器接口 343 10.14.2 可枚举接口 343 10.14.3 产生类型 343 10.14.4 枚举器对象 343 10.14.4.1 MoveNext 方法 344 10.14.4.2 Current 属性 345 10.14.4.3 Dispose 方法 345 10.14.5 可枚举对象 345 10.14.5.1 GetEnumerator 方法 346 10.14.6 实现示例 346 11. 结构 353 11.1 结构声明 353 11.1.1 结构修饰符 353 11.1.2 分部修饰符 353 11.1.3 结构接口 354 11.1.4 结构体 354 11.2 结构成员 354 11.3 类和结构的区别 354 11.3.1 值语义 355 11.3.2 继承 355 11.3.3 赋值 356 11.3.4 默认值 356 11.3.5 装箱和拆箱 356 11.3.6 this 的含义 358 11.3.7 字段初始值设定项 358 11.3.8 构造函数 358 11.3.9 析构函数 359 11.3.10 静态构造函数 359 11.4 结构示例 360 11.4.1 数据库整数类型 360 11.4.2 数据库布尔类型 361 12. 数组 365 12.1 数组类型 365 12.1.1 System.Array 类型 366 12.1.2 数组和泛型 IList 接口 366 12.2 数组创建 366 12.3 数组元素访问 367 12.4 数组成员 367 12.5 数组协变 367 12.6 数组初始值设定项 367 13. 接口 369 13.1 接口声明 369 13.1.1 接口修饰符 369 13.1.2 分部修饰符 369 13.1.3 Variant 类型形参列表 370 13.1.3.1 变化安全性 370 13.1.3.2 变化转换 371 13.1.4 基接口 371 13.1.5 接口体 372 13.2 接口成员 372 13.2.1 接口方法 373 13.2.2 接口属性 373 13.2.3 接口事件 374 13.2.4 接口索引器 374 13.2.5 接口成员访问 374 13.3 完全限定接口成员名 376 13.4 接口实现 376 13.4.1 显式接口成员实现 377 13.4.2 所实现接口的唯一性 379 13.4.3 泛型方法实现 380 13.4.4 接口映射 381 13.4.5 接口实现继承 383 13.4.6 接口重新实现 385 13.4.7 抽象类和接口 386 14. 枚举 387 14.1 枚举声明 387 14.2 枚举修饰符 387 14.3 枚举成员 388 14.4 System.Enum 类型 390 14.5 枚举值和运算 390 15. 委托 391 15.1 委托声明 391 15.2 委托兼容性 393 15.3 委托实例化 393 15.4 委托调用 394 16. 异常 397 16.1 导致异常的原因 397 16.2 System.Exception 类 397 16.3 异常的处理方式 397 16.4 公共异常类 398 17. 特性 399 17.1 特性类 399 17.1.1 特性用法 399 17.1.2 定位和命名参数 400 17.1.3 特性参数类型 401 17.2 特性说明 401 17.3 特性实例 406 17.3.1 特性的编译 406 17.3.2 特性实例的运行时检索 406 17.4 保留特性 407 17.4.1 AttributeUsage 特性 407 17.4.2 Conditional 特性 408 17.4.2.1 条件方法 408 17.4.2.2 条件特性类 410 17.4.3 Obsolete 特性 411 17.5 互操作的特性 412 17.5.1 与 COM 和 Win32 组件的互操作 412 17.5.2 与其他 .NET 语言的互操作 412 17.5.2.1 IndexerName 特性 412 18. 不安全代码 413 18.1 不安全上下文 413 18.2 指针类型 415 18.3 固定和可移动变量 418 18.4 指针转换 418 18.4.1 指针数组 419 18.5 表达式指针 420 18.5.1 指针间接寻址 420 18.5.2 指针成员访问 421 18.5.3 指针元素访问 422 18.5.4 address-of 运算符 422 18.5.5 指针递增和递减 423 18.5.6 指针算术运算 423 18.5.7 指针比较 424 18.5.8 sizeof 运算符 425 18.6 fixed 语句 425 18.7 固定大小缓冲区 429 18.7.1 固定大小缓冲区的声明 429 18.7.2 表达式的固定大小缓冲区 430 18.7.3 明确赋值检查 431 18.8 堆栈分配 431 18.9 动态内存分配 432 A. 文档注释 435 A.1 简介 435 A.2 建议的标记 436 A.2.1 437 A.2.2 437 A.2.3 437 A.2.4 438 A.2.5 438 A.2.6 439 A.2.7 440 A.2.8 440 A.2.9 441 A.2.10 441 A.2.11 442 A.2.12 442 A.2.13 442 A.2.14 443 A.2.15 443 A.2.16 444 A.2.17 444 A.2.18 444 A.3 处理文档文件 445 A.3.1 ID 字符串格式 445 A.3.2 ID 字符串示例 446 A.4 示例 449 A.4.1 C# 源代码 449 A.4.2 生成 XML 452 B. 语法 455 B.1 词法文法 455 B.1.1 行结束符 455 B.1.2 注释 455 B.1.3 空白 456 B.1.4 标记 456 B.1.5 Unicode 字符转义序列 456 B.1.6 标识符 456 B.1.7 关键字 458 B.1.8 文本 458 B.1.9 运算符和标点符号 460 B.1.10 预处理指令 460 B.2 句法文法 463 B.2.1 基本概念 463 B.2.2 类型 463 B.2.3 变量 464 B.2.4 表达式 464 B.2.5 语句 471 B.2.6 命名空间 475 B.2.7 类 475 B.2.8 结构 483 B.2.9 数组 483 B.2.10 接口 484 B.2.11 枚举 485 B.2.12 委托 486 B.2.13 特性 486 B.3 不安全代码的语法扩展 487 C. 参考资料 491
Microsoft(微软)C#语言规范4.0版本,非常值得大家学习收藏! 目录 1. 简介 1 1.1 Hello world 1 1.2 程序结构 2 1.3 类型和变量 3 1.4 表达式 6 1.5 语句 8 1.6 类和对象 12 1.6.1 成员 12 1.6.2 可访问性 13 1.6.3 类型参数 13 1.6.4 基类 14 1.6.5 字段 14 1.6.6 方法 15 1.6.6.1 参数 15 1.6.6.2 方法体和局部变量 17 1.6.6.3 静态方法和实例方法 17 1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 1.8 数组 26 1.9 接口 27 1.10 枚举 28 1.11 委托 29 1.12 特性 30 2. 词法结构 33 2.1 程序 33 2.2 文法 33 2.2.1 文法表示法 33 2.2.2 词法文法 34 2.2.3 句法文法 34 2.3 词法分析 34 2.3.1 行结束符 35 2.3.2 注释 35 2.3.3 空白 36 2.4 标记 37 2.4.1 Unicode 字符转义序列 37 2.4.2 标识符 38 2.4.3 关键字 39 2.4.4 文本 41 2.4.4.1 布尔值 41 2.4.4.2 整数 41 2.4.4.3 实数 42 2.4.4.4 字符 43 2.4.4.5 字符串 44 2.4.4.6 null 文本 46 2.4.5 运算符和标点符号 46 2.5 预处理指令 46 2.5.1 条件编译符号 47 2.5.2 预处理表达式 48 2.5.3 声明指令 49 2.5.4 条件编译指令 49 2.5.5 诊断指令 52 2.5.6 区域指令 52 2.5.7 行指令 53 2.5.8 Pragma 指令 53 2.5.8.1 Pragma warning 54 3. 基本概念 55 3.1 应用程序启动 55 3.2 应用程序终止 56 3.3 声明 56 3.4 成员 58 3.4.1 命名空间成员 58 3.4.2 结构成员 59 3.4.3 枚举成员 59 3.4.4 类成员 59 3.4.5 接口成员 59 3.4.6 数组成员 60 3.4.7 委托成员 60 3.5 成员访问 60 3.5.1 已声明可访问性 60 3.5.2 可访问域 61 3.5.3 实例成员的受保护访问 63 3.5.4 可访问性约束 64 3.6 签名和重载 65 3.7 范围 66 3.7.1 名称隐藏 68 3.7.1.1 通过嵌套隐藏 68 3.7.1.2 通过继承隐藏 69 3.8 命名空间和类型名称 70 3.8.1 完全限定名 72 3.9 自动内存管理 73 3.10 执行顺序 75 4. 类型 77 4.1 值类型 77 4.1.1 System.ValueType 类型 78 4.1.2 默认构造函数 78 4.1.3 结构类型 79 4.1.4 简单类型 79 4.1.5 整型 80 4.1.6 浮点型 81 4.1.7 decimal 类型 82 4.1.8 bool 类型 82 4.1.9 枚举类型 82 4.1.10 可以为 null 的类型 83 4.2 引用类型 83 4.2.1 类类型 84 4.2.2 对象类型 84 4.2.3 dynamic 类型 84 4.2.4 string 类型 85 4.2.5 接口类型 85 4.2.6 数组类型 85 4.2.7 委托类型 85 4.3 装箱和拆箱 85 4.3.1 装箱转换 85 4.3.2 拆箱转换 87 4.4 构造类型 87 4.4.1 类型实参 88 4.4.2 开放和封闭类型 88 4.4.3 绑定和未绑定类型 89 4.4.4 满足约束 89 4.5 类型形参 90 4.6 表达式树类型 91 4.7 dynamic 类型 91 5. 变量 93 5.1 变量类别 93 5.1.1 静态变量 93 5.1.2 实例变量 93 5.1.2.1 类的实例变量 93 5.1.2.2 结构的实例变量 94 5.1.3 数组元素 94 5.1.4 值参数 94 5.1.5 引用形参 94 5.1.6 输出形参 94 5.1.7 局部变量 95 5.2 默认值 95 5.3 明确赋值 96 5.3.1 初始已赋值变量 96 5.3.2 初始未赋值变量 97 5.3.3 确定明确赋值的细则 97 5.3.3.1 一般语句规则 98 5.3.3.2 块语句、checked 和 unchecked 语句 98 5.3.3.3 表达式语句 98 5.3.3.4 声明语句 98 5.3.3.5 if 语句 98 5.3.3.6 switch 语句 99 5.3.3.7 while 语句 99 5.3.3.8 do 语句 99 5.3.3.9 for 语句 99 5.3.3.10 break、continue 和 goto 语句 100 5.3.3.11 throw 语句 100 5.3.3.12 return 语句 100 5.3.3.13 try-catch 语句 100 5.3.3.14 try-finally 语句 100 5.3.3.15 try-catch-finally 语句 101 5.3.3.16 foreach 语句 102 5.3.3.17 using 语句 102 5.3.3.18 lock 语句 102 5.3.3.19 yield 语句 102 5.3.3.20 简单表达式的一般规则 102 5.3.3.21 带有嵌入表达式的表达式的一般规则 103 5.3.3.22 调用表达式和对象创建表达式 103 5.3.3.23 简单赋值表达式 103 5.3.3.24 && 表达式 104 5.3.3.25 || 表达式 104 5.3.3.26 ! 表达式 105 5.3.3.27 ?? 表达式 106 5.3.3.28 ?: 表达式 106 5.3.3.29 匿名函数 106 5.4 变量引用 107 5.5 变量引用的原子性 107 6. 转换 109 6.1 隐式转换 109 6.1.1 标识转换 110 6.1.2 隐式数值转换 110 6.1.3 隐式枚举转换 110 6.1.4 可以为 null 的隐式转换 110 6.1.5 null 文本转换 111 6.1.6 隐式引用转换 111 6.1.7 装箱转换 111 6.1.8 隐式动态转换 112 6.1.9 隐式常量表达式转换 112 6.1.10 涉及类型形参的隐式转换 112 6.1.11 用户定义的隐式转换 113 6.1.12 匿名函数转换和方法组转换 113 6.2 显式转换 113 6.2.1 显式数值转换 114 6.2.2 显式枚举转换 115 6.2.3 可以为 null 的显式转换 115 6.2.4 显式引用转换 116 6.2.5 拆箱转换 117 6.2.6 显式动态转换 117 6.2.7 涉及类型形参的显式转换 118 6.2.8 用户定义的显式转换 118 6.3 标准转换 119 6.3.1 标准隐式转换 119 6.3.2 标准显式转换 119 6.4 用户定义的转换 119 6.4.1 允许的用户定义转换 119 6.4.2 提升转换运算符 119 6.4.3 用户定义转换的计算 120 6.4.4 用户定义的隐式转换 120 6.4.5 用户定义的显式转换 121 6.5 匿名函数转换 122 6.5.1 匿名函数转换为委托类型的计算 123 6.5.2 匿名函数转换为表达式树类型的计算 124 6.5.3 实现示例 124 6.6 方法组转换 126 7. 表达式 129 7.1 表达式的分类 129 7.1.1 表达式的值 130 7.2 静态和动态绑定 130 7.2.1 绑定时间 131 7.2.2 动态绑定 131 7.2.3 构成表达式的类型 131 7.3 运算符 131 7.3.1 运算符的优先级和顺序关联性 132 7.3.2 运算符重载 133 7.3.3 一元运算符重载决策 134 7.3.4 二元运算符重载决策 134 7.3.5 候选用户定义运算符 134 7.3.6 数值提升 135 7.3.6.1 一元数值提升 135 7.3.6.2 二元数值提升 135 7.3.7 提升运算符 136 7.4 成员查找 137 7.4.1 基类型 138 7.5 函数成员 138 7.5.1 实参列表 140 7.5.1.1 对应形参 141 7.5.1.2 实参列表的运行时计算 142 7.5.2 类型推断 143 7.5.2.1 第一阶段 144 7.5.2.2 第二阶段 144 7.5.2.3 输入类型 144 7.5.2.4 输出类型 145 7.5.2.5 依赖 145 7.5.2.6 输出类型推断 145 7.5.2.7 参数类型显式推断 145 7.5.2.8 精确推断 145 7.5.2.9 下限推断 145 7.5.2.10 上限推断 146 7.5.2.11 固定 147 7.5.2.12 推断返回类型 147 7.5.2.13 方法组转换的类型推断 148 7.5.2.14 查找一组表达式的最通用类型 148 7.5.3 重载决策 149 7.5.3.1 适用函数成员 149 7.5.3.2 更好的函数成员 150 7.5.3.3 表达式的更佳转换 151 7.5.3.4 类型的更佳转换 151 7.5.3.5 更佳转换目标 151 7.5.3.6 泛型类的重载 151 7.5.4 动态重载决策的编译时检查 152 7.5.5 函数成员调用 152 7.5.5.1 已装箱实例上的调用 153 7.6 基本表达式 154 7.6.1 文本 154 7.6.2 简单名称 154 7.6.2.1 块的固定含义 155 7.6.3 带括号的表达式 156 7.6.4 成员访问 157 7.6.4.1 相同的简单名称和类型名称 158 7.6.4.2 语法多义性 159 7.6.5 调用表达式 159 7.6.5.1 方法调用 160 7.6.5.2 扩展方法调用 161 7.6.5.3 委托调用 163 7.6.6 元素访问 164 7.6.6.1 数组访问 164 7.6.6.2 索引器访问 165 7.6.7 this 访问 165 7.6.8 基访问 166 7.6.9 后缀增量和后缀减量运算符 166 7.6.10 new 运算符 167 7.6.10.1 对象创建表达式 168 7.6.10.2 对象初始值设定项 169 7.6.10.3 集合初始值设定项 171 7.6.10.4 数组创建表达式 172 7.6.10.5 委托创建表达式 174 7.6.10.6 匿名对象创建表达式 175 7.6.11 typeof 运算符 177 7.6.12 checked 和 unchecked 运算符 178 7.6.13 默认值表达式 180 7.6.14 匿名方法表达式 181 7.7 一元运算符 181 7.7.1 一元加运算符 181 7.7.2 一元减运算符 181 7.7.3 逻辑否定运算符 182 7.7.4 按位求补运算符 182 7.7.5 前缀增量和减量运算符 182 7.7.6 强制转换表达式 183 7.8 算术运算符 184 7.8.1 乘法运算符 184 7.8.2 除法运算符 185 7.8.3 余数运算符 186 7.8.4 加法运算符 187 7.8.5 减法运算符 189 7.9 移位运算符 190 7.10 关系和类型测试运算符 192 7.10.1 整数比较运算符 192 7.10.2 浮点比较运算符 193 7.10.3 小数比较运算符 194 7.10.4 布尔相等运算符 194 7.10.5 枚举比较运算符 194 7.10.6 引用类型相等运算符 194 7.10.7 字符串相等运算符 196 7.10.8 委托相等运算符 196 7.10.9 相等运算符和 null 197 7.10.10 is 运算符 197 7.10.11 as 运算符 197 7.11 逻辑运算符 198 7.11.1 整数逻辑运算符 199 7.11.2 枚举逻辑运算符 199 7.11.3 布尔逻辑运算符 199 7.11.4 可以为 null 的布尔逻辑运算符 199 7.12 条件逻辑运算符 200 7.12.1 布尔条件逻辑运算符 200 7.12.2 用户定义的条件逻辑运算符 201 7.13 空合并运算符 201 7.14 条件运算符 202 7.15 匿名函数表达式 203 7.15.1 匿名函数签名 204 7.15.2 匿名函数体 205 7.15.3 重载决策 205 7.15.4 匿名函数与动态绑定 206 7.15.5 外层变量 206 7.15.5.1 捕获的外层变量 206 7.15.5.2 局部变量实例化 207 7.15.6 匿名函数表达式计算 209 7.16 查询表达式 209 7.16.1 查询表达式的多义性 210 7.16.2 查询表达式转换 210 7.16.2.1 带继续符的 select 和 groupby 子句 211 7.16.2.2 显式范围变量类型 211 7.16.2.3 退化查询表达式 212 7.16.2.4 from、let、where、join 和 orderby 子句 212 7.16.2.5 select 子句 216 7.16.2.6 Groupby 子句 216 7.16.2.7 透明标识符 216 7.16.3 查询表达式模式 218 7.17 赋值运算符 219 7.17.1 简单赋值 219 7.17.2 复合赋值 221 7.17.3 事件赋值 222 7.18 表达式 222 7.19 常量表达式 223 7.20 布尔表达式 224 8. 语句 225 8.1 结束点和可到达性 225 8.2 块 227 8.2.1 语句列表 227 8.3 空语句 228 8.4 标记语句 228 8.5 声明语句 229 8.5.1 局部变量声明 229 8.5.2 局部常量声明 230 8.6 表达式语句 231 8.7 选择语句 231 8.7.1 if 语句 231 8.7.2 switch 语句 232 8.8 迭代语句 236 8.8.1 while 语句 236 8.8.2 do 语句 236 8.8.3 for 语句 237 8.8.4 foreach 语句 238 8.9 跳转语句 240 8.9.1 break 语句 241 8.9.2 continue 语句 242 8.9.3 goto 语句 242 8.9.4 return 语句 243 8.9.5 throw 语句 244 8.10 try 语句 245 8.11 checked 语句和 unchecked 语句 247 8.12 lock 语句 248 8.13 using 语句 248 8.14 yield 语句 250 9. 命名空间 253 9.1 编译单元 253 9.2 命名空间声明 253 9.3 Extern 别名 254 9.4 using 指令 255 9.4.1 using 别名指令 256 9.4.2 Using 命名空间指令 258 9.5 命名空间成员 260 9.6 类型声明 260 9.7 命名空间别名限定符 261 9.7.1 别名的唯一性 262 10. 类 263 10.1 类声明 263 10.1.1 类修饰符 263 10.1.1.1 抽象类 264 10.1.1.2 密封类 264 10.1.1.3 静态类 264 10.1.2 分部修饰符 265 10.1.3 类型形参 265 10.1.4 类基本规范 266 10.1.4.1 基类 266 10.1.4.2 接口实现 267 10.1.5 类型形参约束 268 10.1.6 类体 272 10.2 分部类型 272 10.2.1 特性 272 10.2.2 修饰符 273 10.2.3 类型形参和约束 273 10.2.4 基类 273 10.2.5 基接口 274 10.2.6 成员 274 10.2.7 分部方法 275 10.2.8 名称绑定 277 10.3 类成员 277 10.3.1 实例类型 278 10.3.2 构造类型的成员 279 10.3.3 继承 280 10.3.4 new 修饰符 280 10.3.5 访问修饰符 281 10.3.6 构成类型 281 10.3.7 静态成员和实例成员 281 10.3.8 嵌套类型 282 10.3.8.1 完全限定名 282 10.3.8.2 已声明可访问性 282 10.3.8.3 隐藏 283 10.3.8.4 this 访问 283 10.3.8.5 对包含类型的私有和受保护成员的访问 284 10.3.8.6 泛型类的嵌套类型 285 10.3.9 保留成员名称 286 10.3.9.1 为属性保留的成员名称 286 10.3.9.2 为事件保留的成员名称 287 10.3.9.3 为索引器保留的成员名称 287 10.3.9.4 为析构函数保留的成员名称 287 10.4 常量 287 10.5 字段 289 10.5.1 静态字段和实例字段 290 10.5.2 只读字段 291 10.5.2.1 对常量使用静态只读字段 291 10.5.2.2 常量和静态只读字段的版本控制 291 10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 295 10.6 方法 296 10.6.1 方法形参 298 10.6.1.1 值参数 299 10.6.1.2 引用形参 299 10.6.1.3 输出形参 300 10.6.1.4 形参数组 301 10.6.2 静态方法和实例方法 303 10.6.3 虚方法 304 10.6.4 重写方法 305 10.6.5 密封方法 307 10.6.6 抽象方法 308 10.6.7 外部方法 309 10.6.8 分部方法 310 10.6.9 扩展方法 310 10.6.10 方法体 311 10.6.11 方法重载 311 10.7 属性 311 10.7.1 静态属性和实例属性 312 10.7.2 访问器 313 10.7.3 自动实现的属性 317 10.7.4 可访问性 318 10.7.5 虚、密封、重写和抽象访问器 319 10.8 事件 321 10.8.1 类似字段的事件 323 10.8.2 事件访问器 324 10.8.3 静态事件和实例事件 325 10.8.4 虚、密封、重写和抽象访问器 325 10.9 索引器 326 10.9.1 索引器重载 329 10.10 运算符 329 10.10.1 一元运算符 331 10.10.2 二元运算符 331 10.10.3 转换运算符 332 10.11 实例构造函数 334 10.11.1 构造函数初始值设定项 335 10.11.2 实例变量初始值设定项 336 10.11.3 构造函数执行 336 10.11.4 默认构造函数 338 10.11.5 私有构造函数 338 10.11.6 可选的实例构造函数形参 339 10.12 静态构造函数 339 10.13 析构函数 341 10.14 迭代器 343 10.14.1 枚举器接口 343 10.14.2 可枚举接口 343 10.14.3 产生类型 343 10.14.4 枚举器对象 343 10.14.4.1 MoveNext 方法 344 10.14.4.2 Current 属性 345 10.14.4.3 Dispose 方法 345 10.14.5 可枚举对象 345 10.14.5.1 GetEnumerator 方法 346 10.14.6 实现示例 346 11. 结构 353 11.1 结构声明 353 11.1.1 结构修饰符 353 11.1.2 分部修饰符 353 11.1.3 结构接口 354 11.1.4 结构体 354 11.2 结构成员 354 11.3 类和结构的区别 354 11.3.1 值语义 355 11.3.2 继承 355 11.3.3 赋值 356 11.3.4 默认值 356 11.3.5 装箱和拆箱 356 11.3.6 this 的含义 358 11.3.7 字段初始值设定项 358 11.3.8 构造函数 358 11.3.9 析构函数 359 11.3.10 静态构造函数 359 11.4 结构示例 360 11.4.1 数据库整数类型 360 11.4.2 数据库布尔类型 361 12. 数组 365 12.1 数组类型 365 12.1.1 System.Array 类型 366 12.1.2 数组和泛型 IList 接口 366 12.2 数组创建 366 12.3 数组元素访问 367 12.4 数组成员 367 12.5 数组协变 367 12.6 数组初始值设定项 367 13. 接口 369 13.1 接口声明 369 13.1.1 接口修饰符 369 13.1.2 分部修饰符 369 13.1.3 Variant 类型形参列表 370 13.1.3.1 变化安全性 370 13.1.3.2 变化转换 371 13.1.4 基接口 371 13.1.5 接口体 372 13.2 接口成员 372 13.2.1 接口方法 373 13.2.2 接口属性 373 13.2.3 接口事件 374 13.2.4 接口索引器 374 13.2.5 接口成员访问 374 13.3 完全限定接口成员名 376 13.4 接口实现 376 13.4.1 显式接口成员实现 377 13.4.2 所实现接口的唯一性 379 13.4.3 泛型方法实现 380 13.4.4 接口映射 381 13.4.5 接口实现继承 383 13.4.6 接口重新实现 385 13.4.7 抽象类和接口 386 14. 枚举 387 14.1 枚举声明 387 14.2 枚举修饰符 387 14.3 枚举成员 388 14.4 System.Enum 类型 390 14.5 枚举值和运算 390 15. 委托 391 15.1 委托声明 391 15.2 委托兼容性 393 15.3 委托实例化 393 15.4 委托调用 394 16. 异常 397 16.1 导致异常的原因 397 16.2 System.Exception 类 397 16.3 异常的处理方式 397 16.4 公共异常类 398 17. 特性 399 17.1 特性类 399 17.1.1 特性用法 399 17.1.2 定位和命名参数 400 17.1.3 特性参数类型 401 17.2 特性说明 401 17.3 特性实例 406 17.3.1 特性的编译 406 17.3.2 特性实例的运行时检索 406 17.4 保留特性 407 17.4.1 AttributeUsage 特性 407 17.4.2 Conditional 特性 408 17.4.2.1 条件方法 408 17.4.2.2 条件特性类 410 17.4.3 Obsolete 特性 411 17.5 互操作的特性 412 17.5.1 与 COM 和 Win32 组件的互操作 412 17.5.2 与其他 .NET 语言的互操作 412 17.5.2.1 IndexerName 特性 412 18. 不安全代码 413 18.1 不安全上下文 413 18.2 指针类型 415 18.3 固定和可移动变量 418 18.4 指针转换 418 18.4.1 指针数组 419 18.5 表达式指针 420 18.5.1 指针间接寻址 420 18.5.2 指针成员访问 421 18.5.3 指针元素访问 422 18.5.4 address-of 运算符 422 18.5.5 指针递增和递减 423 18.5.6 指针算术运算 423 18.5.7 指针比较 424 18.5.8 sizeof 运算符 425 18.6 fixed 语句 425 18.7 固定大小缓冲区 429 18.7.1 固定大小缓冲区的声明 429 18.7.2 表达式的固定大小缓冲区 430 18.7.3 明确赋值检查 431 18.8 堆栈分配 431 18.9 动态内存分配 432 A. 文档注释 435 A.1 简介 435 A.2 建议的标记 436 A.2.1 437 A.2.2 437 A.2.3 437 A.2.4 438 A.2.5 438 A.2.6 439 A.2.7 440 A.2.8 440 A.2.9 441 A.2.10 441 A.2.11 442 A.2.12 442 A.2.13 442 A.2.14 443 A.2.15 443 A.2.16 444 A.2.17 444 A.2.18 444 A.3 处理文档文件 445 A.3.1 ID 字符串格式 445 A.3.2 ID 字符串示例 446 A.4 示例 449 A.4.1 C# 源代码 449 A.4.2 生成 XML 452 B. 语法 455 B.1 词法文法 455 B.1.1 行结束符 455 B.1.2 注释 455 B.1.3 空白 456 B.1.4 标记 456 B.1.5 Unicode 字符转义序列 456 B.1.6 标识符 456 B.1.7 关键字 458 B.1.8 文本 458 B.1.9 运算符和标点符号 460 B.1.10 预处理指令 460 B.2 句法文法 463 B.2.1 基本概念 463 B.2.2 类型 463 B.2.3 变量 464 B.2.4 表达式 464 B.2.5 语句 471 B.2.6 命名空间 475 B.2.7 类 475 B.2.8 结构 483 B.2.9 数组 483 B.2.10 接口 484 B.2.11 枚举 485 B.2.12 委托 486 B.2.13 特性 486 B.3 不安全代码的语法扩展 487 C. 参考资料 491
目录 1. 简介 1 1.1 Hello world 1 1.2 程序结构 2 1.3 类型和变量 3 1.4 表达式 6 1.5 语句 8 1.6 类和对象 12 1.6.1 成员 12 1.6.2 可访问性 13 1.6.3 类型参数 13 1.6.4 基类 14 1.6.5 字段 14 1.6.6 方法 15 1.6.6.1 参数 15 1.6.6.2 方法体和局部变量 17 1.6.6.3 静态方法和实例方法 17 1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 1.8 数组 26 1.9 接口 27 1.10 枚举 28 1.11 委托 29 1.12 特性 30 2. 词法结构 33 2.1 程序 33 2.2 文法 33 2.2.1 文法表示法 33 2.2.2 词法文法 34 2.2.3 句法文法 34 2.3 词法分析 34 2.3.1 行结束符 35 2.3.2 注释 35 2.3.3 空白 36 2.4 标记 37 2.4.1 Unicode 字符转义序列 37 2.4.2 标识符 38 2.4.3 关键字 39 2.4.4 文本 41 2.4.4.1 布尔值 41 2.4.4.2 整数 41 2.4.4.3 实数 42 2.4.4.4 字符 43 2.4.4.5 字符串 44 2.4.4.6 null 文本 46 2.4.5 运算符和标点符号 46 2.5 预处理指令 46 2.5.1 条件编译符号 47 2.5.2 预处理表达式 48 2.5.3 声明指令 49 2.5.4 条件编译指令 49 2.5.5 诊断指令 52 2.5.6 区域指令 52 2.5.7 行指令 53 2.5.8 Pragma 指令 53 2.5.8.1 Pragma warning 54 3. 基本概念 55 3.1 应用程序启动 55 3.2 应用程序终止 56 3.3 声明 56 3.4 成员 58 3.4.1 命名空间成员 58 3.4.2 结构成员 59 3.4.3 枚举成员 59 3.4.4 类成员 59 3.4.5 接口成员 59 3.4.6 数组成员 60 3.4.7 委托成员 60 3.5 成员访问 60 3.5.1 已声明可访问性 60 3.5.2 可访问域 61 3.5.3 实例成员的受保护访问 63 3.5.4 可访问性约束 64 3.6 签名和重载 65 3.7 范围 66 3.7.1 名称隐藏 68 3.7.1.1 通过嵌套隐藏 68 3.7.1.2 通过继承隐藏 69 3.8 命名空间和类型名称 70 3.8.1 完全限定名 72 3.9 自动内存管理 73 3.10 执行顺序 75 4. 类型 77 4.1 值类型 77 4.1.1 System.ValueType 类型 78 4.1.2 默认构造函数 78 4.1.3 结构类型 79 4.1.4 简单类型 79 4.1.5 整型 80 4.1.6 浮点型 81 4.1.7 decimal 类型 82 4.1.8 bool 类型 82 4.1.9 枚举类型 82 4.1.10 可以为 null 的类型 83 4.2 引用类型 83 4.2.1 类类型 84 4.2.2 对象类型 84 4.2.3 dynamic 类型 84 4.2.4 string 类型 85 4.2.5 接口类型 85 4.2.6 数组类型 85 4.2.7 委托类型 85 4.3 装箱和拆箱 85 4.3.1 装箱转换 85 4.3.2 拆箱转换 87 4.4 构造类型 87 4.4.1 类型实参 88 4.4.2 开放和封闭类型 88 4.4.3 绑定和未绑定类型 89 4.4.4 满足约束 89 4.5 类型形参 90 4.6 表达式树类型 91 4.7 dynamic 类型 91 5. 变量 93 5.1 变量类别 93 5.1.1 静态变量 93 5.1.2 实例变量 93 5.1.2.1 类的实例变量 93 5.1.2.2 结构的实例变量 94 5.1.3 数组元素 94 5.1.4 值参数 94 5.1.5 引用形参 94 5.1.6 输出形参 94 5.1.7 局部变量 95 5.2 默认值 95 5.3 明确赋值 96 5.3.1 初始已赋值变量 96 5.3.2 初始未赋值变量 97 5.3.3 确定明确赋值的细则 97 5.3.3.1 一般语句规则 98 5.3.3.2 块语句、checked 和 unchecked 语句 98 5.3.3.3 表达式语句 98 5.3.3.4 声明语句 98 5.3.3.5 if 语句 98 5.3.3.6 switch 语句 99 5.3.3.7 while 语句 99 5.3.3.8 do 语句 99 5.3.3.9 for 语句 99 5.3.3.10 break、continue 和 goto 语句 100 5.3.3.11 throw 语句 100 5.3.3.12 return 语句 100 5.3.3.13 try-catch 语句 100 5.3.3.14 try-finally 语句 100 5.3.3.15 try-catch-finally 语句 101 5.3.3.16 foreach 语句 102 5.3.3.17 using 语句 102 5.3.3.18 lock 语句 102 5.3.3.19 yield 语句 102 5.3.3.20 简单表达式的一般规则 102 5.3.3.21 带有嵌入表达式的表达式的一般规则 103 5.3.3.22 调用表达式和对象创建表达式 103 5.3.3.23 简单赋值表达式 103 5.3.3.24 && 表达式 104 5.3.3.25 || 表达式 104 5.3.3.26 ! 表达式 105 5.3.3.27 ?? 表达式 106 5.3.3.28 ?: 表达式 106 5.3.3.29 匿名函数 106 5.4 变量引用 107 5.5 变量引用的原子性 107 6. 转换 109 6.1 隐式转换 109 6.1.1 标识转换 110 6.1.2 隐式数值转换 110 6.1.3 隐式枚举转换 110 6.1.4 可以为 null 的隐式转换 110 6.1.5 null 文本转换 111 6.1.6 隐式引用转换 111 6.1.7 装箱转换 111 6.1.8 隐式动态转换 112 6.1.9 隐式常量表达式转换 112 6.1.10 涉及类型形参的隐式转换 112 6.1.11 用户定义的隐式转换 113 6.1.12 匿名函数转换和方法组转换 113 6.2 显式转换 113 6.2.1 显式数值转换 114 6.2.2 显式枚举转换 115 6.2.3 可以为 null 的显式转换 115 6.2.4 显式引用转换 116 6.2.5 拆箱转换 117 6.2.6 显式动态转换 117 6.2.7 涉及类型形参的显式转换 118 6.2.8 用户定义的显式转换 118 6.3 标准转换 119 6.3.1 标准隐式转换 119 6.3.2 标准显式转换 119 6.4 用户定义的转换 119 6.4.1 允许的用户定义转换 119 6.4.2 提升转换运算符 119 6.4.3 用户定义转换的计算 120 6.4.4 用户定义的隐式转换 120 6.4.5 用户定义的显式转换 121 6.5 匿名函数转换 122 6.5.1 匿名函数转换为委托类型的计算 123 6.5.2 匿名函数转换为表达式树类型的计算 124 6.5.3 实现示例 124 6.6 方法组转换 126 7. 表达式 129 7.1 表达式的分类 129 7.1.1 表达式的值 130 7.2 静态和动态绑定 130 7.2.1 绑定时间 131 7.2.2 动态绑定 131 7.2.3 构成表达式的类型 131 7.3 运算符 131 7.3.1 运算符的优先级和顺序关联性 132 7.3.2 运算符重载 133 7.3.3 一元运算符重载决策 134 7.3.4 二元运算符重载决策 134 7.3.5 候选用户定义运算符 134 7.3.6 数值提升 135 7.3.6.1 一元数值提升 135 7.3.6.2 二元数值提升 135 7.3.7 提升运算符 136 7.4 成员查找 137 7.4.1 基类型 138 7.5 函数成员 138 7.5.1 实参列表 140 7.5.1.1 对应形参 141 7.5.1.2 实参列表的运行时计算 142 7.5.2 类型推断 143 7.5.2.1 第一阶段 144 7.5.2.2 第二阶段 144 7.5.2.3 输入类型 144 7.5.2.4 输出类型 145 7.5.2.5 依赖 145 7.5.2.6 输出类型推断 145 7.5.2.7 参数类型显式推断 145 7.5.2.8 精确推断 145 7.5.2.9 下限推断 145 7.5.2.10 上限推断 146 7.5.2.11 固定 147 7.5.2.12 推断返回类型 147 7.5.2.13 方法组转换的类型推断 148 7.5.2.14 查找一组表达式的最通用类型 148 7.5.3 重载决策 149 7.5.3.1 适用函数成员 149 7.5.3.2 更好的函数成员 150 7.5.3.3 表达式的更佳转换 151 7.5.3.4 类型的更佳转换 151 7.5.3.5 更佳转换目标 151 7.5.3.6 泛型类的重载 151 7.5.4 动态重载决策的编译时检查 152 7.5.5 函数成员调用 152 7.5.5.1 已装箱实例上的调用 153 7.6 基本表达式 154 7.6.1 文本 154 7.6.2 简单名称 154 7.6.2.1 块的固定含义 155 7.6.3 带括号的表达式 156 7.6.4 成员访问 157 7.6.4.1 相同的简单名称和类型名称 158 7.6.4.2 语法多义性 159 7.6.5 调用表达式 159 7.6.5.1 方法调用 160 7.6.5.2 扩展方法调用 161 7.6.5.3 委托调用 163 7.6.6 元素访问 164 7.6.6.1 数组访问 164 7.6.6.2 索引器访问 165 7.6.7 this 访问 165 7.6.8 基访问 166 7.6.9 后缀增量和后缀减量运算符 166 7.6.10 new 运算符 167 7.6.10.1 对象创建表达式 168 7.6.10.2 对象初始值设定项 169 7.6.10.3 集合初始值设定项 171 7.6.10.4 数组创建表达式 172 7.6.10.5 委托创建表达式 174 7.6.10.6 匿名对象创建表达式 175 7.6.11 typeof 运算符 177 7.6.12 checked 和 unchecked 运算符 178 7.6.13 默认值表达式 180 7.6.14 匿名方法表达式 181 7.7 一元运算符 181 7.7.1 一元加运算符 181 7.7.2 一元减运算符 181 7.7.3 逻辑否定运算符 182 7.7.4 按位求补运算符 182 7.7.5 前缀增量和减量运算符 182 7.7.6 强制转换表达式 183 7.8 算术运算符 184 7.8.1 乘法运算符 184 7.8.2 除法运算符 185 7.8.3 余数运算符 186 7.8.4 加法运算符 187 7.8.5 减法运算符 189 7.9 移位运算符 190 7.10 关系和类型测试运算符 192 7.10.1 整数比较运算符 192 7.10.2 浮点比较运算符 193 7.10.3 小数比较运算符 194 7.10.4 布尔相等运算符 194 7.10.5 枚举比较运算符 194 7.10.6 引用类型相等运算符 194 7.10.7 字符串相等运算符 196 7.10.8 委托相等运算符 196 7.10.9 相等运算符和 null 197 7.10.10 is 运算符 197 7.10.11 as 运算符 197 7.11 逻辑运算符 198 7.11.1 整数逻辑运算符 199 7.11.2 枚举逻辑运算符 199 7.11.3 布尔逻辑运算符 199 7.11.4 可以为 null 的布尔逻辑运算符 199 7.12 条件逻辑运算符 200 7.12.1 布尔条件逻辑运算符 200 7.12.2 用户定义的条件逻辑运算符 201 7.13 空合并运算符 201 7.14 条件运算符 202 7.15 匿名函数表达式 203 7.15.1 匿名函数签名 204 7.15.2 匿名函数体 205 7.15.3 重载决策 205 7.15.4 匿名函数与动态绑定 206 7.15.5 外层变量 206 7.15.5.1 捕获的外层变量 206 7.15.5.2 局部变量实例化 207 7.15.6 匿名函数表达式计算 209 7.16 查询表达式 209 7.16.1 查询表达式的多义性 210 7.16.2 查询表达式转换 210 7.16.2.1 带继续符的 select 和 groupby 子句 211 7.16.2.2 显式范围变量类型 211 7.16.2.3 退化查询表达式 212 7.16.2.4 from、let、where、join 和 orderby 子句 212 7.16.2.5 select 子句 216 7.16.2.6 Groupby 子句 216 7.16.2.7 透明标识符 216 7.16.3 查询表达式模式 218 7.17 赋值运算符 219 7.17.1 简单赋值 219 7.17.2 复合赋值 221 7.17.3 事件赋值 222 7.18 表达式 222 7.19 常量表达式 223 7.20 布尔表达式 224 8. 语句 225 8.1 结束点和可到达性 225 8.2 块 227 8.2.1 语句列表 227 8.3 空语句 228 8.4 标记语句 228 8.5 声明语句 229 8.5.1 局部变量声明 229 8.5.2 局部常量声明 230 8.6 表达式语句 231 8.7 选择语句 231 8.7.1 if 语句 231 8.7.2 switch 语句 232 8.8 迭代语句 236 8.8.1 while 语句 236 8.8.2 do 语句 236 8.8.3 for 语句 237 8.8.4 foreach 语句 238 8.9 跳转语句 240 8.9.1 break 语句 241 8.9.2 continue 语句 242 8.9.3 goto 语句 242 8.9.4 return 语句 243 8.9.5 throw 语句 244 8.10 try 语句 245 8.11 checked 语句和 unchecked 语句 247 8.12 lock 语句 248 8.13 using 语句 248 8.14 yield 语句 250 9. 命名空间 253 9.1 编译单元 253 9.2 命名空间声明 253 9.3 Extern 别名 254 9.4 using 指令 255 9.4.1 using 别名指令 256 9.4.2 Using 命名空间指令 258 9.5 命名空间成员 260 9.6 类型声明 260 9.7 命名空间别名限定符 261 9.7.1 别名的唯一性 262 10. 类 263 10.1 类声明 263 10.1.1 类修饰符 263 10.1.1.1 抽象类 264 10.1.1.2 密封类 264 10.1.1.3 静态类 264 10.1.2 分部修饰符 265 10.1.3 类型形参 265 10.1.4 类基本规范 266 10.1.4.1 基类 266 10.1.4.2 接口实现 267 10.1.5 类型形参约束 268 10.1.6 类体 272 10.2 分部类型 272 10.2.1 特性 272 10.2.2 修饰符 273 10.2.3 类型形参和约束 273 10.2.4 基类 273 10.2.5 基接口 274 10.2.6 成员 274 10.2.7 分部方法 275 10.2.8 名称绑定 277 10.3 类成员 277 10.3.1 实例类型 278 10.3.2 构造类型的成员 279 10.3.3 继承 280 10.3.4 new 修饰符 280 10.3.5 访问修饰符 281 10.3.6 构成类型 281 10.3.7 静态成员和实例成员 281 10.3.8 嵌套类型 282 10.3.8.1 完全限定名 282 10.3.8.2 已声明可访问性 282 10.3.8.3 隐藏 283 10.3.8.4 this 访问 283 10.3.8.5 对包含类型的私有和受保护成员的访问 284 10.3.8.6 泛型类的嵌套类型 285 10.3.9 保留成员名称 286 10.3.9.1 为属性保留的成员名称 286 10.3.9.2 为事件保留的成员名称 287 10.3.9.3 为索引器保留的成员名称 287 10.3.9.4 为析构函数保留的成员名称 287 10.4 常量 287 10.5 字段 289 10.5.1 静态字段和实例字段 290 10.5.2 只读字段 291 10.5.2.1 对常量使用静态只读字段 291 10.5.2.2 常量和静态只读字段的版本控制 291 10.5.3 可变字段 292 10.5.4 字段初始化 293 10.5.5 变量初始值设定项 293 10.5.5.1 静态字段初始化 294 10.5.5.2 实例字段初始化 295 10.6 方法 296 10.6.1 方法形参 298 10.6.1.1 值参数 299 10.6.1.2 引用形参 299 10.6.1.3 输出形参 300 10.6.1.4 形参数组 301 10.6.2 静态方法和实例方法 303 10.6.3 虚方法 304 10.6.4 重写方法 305 10.6.5 密封方法 307 10.6.6 抽象方法 308 10.6.7 外部方法 309 10.6.8 分部方法 310 10.6.9 扩展方法 310 10.6.10 方法体 311 10.6.11 方法重载 311 10.7 属性 311 10.7.1 静态属性和实例属性 312 10.7.2 访问器 313 10.7.3 自动实现的属性 317 10.7.4 可访问性 318 10.7.5 虚、密封、重写和抽象访问器 319 10.8 事件 321 10.8.1 类似字段的事件 323 10.8.2 事件访问器 324 10.8.3 静态事件和实例事件 325 10.8.4 虚、密封、重写和抽象访问器 325 10.9 索引器 326 10.9.1 索引器重载 329 10.10 运算符 329 10.10.1 一元运算符 331 10.10.2 二元运算符 331 10.10.3 转换运算符 332 10.11 实例构造函数 334 10.11.1 构造函数初始值设定项 335 10.11.2 实例变量初始值设定项 336 10.11.3 构造函数执行 336 10.11.4 默认构造函数 338 10.11.5 私有构造函数 338 10.11.6 可选的实例构造函数形参 339 10.12 静态构造函数 339 10.13 析构函数 341 10.14 迭代器 343 10.14.1 枚举器接口 343 10.14.2 可枚举接口 343 10.14.3 产生类型 343 10.14.4 枚举器对象 343 10.14.4.1 MoveNext 方法 344 10.14.4.2 Current 属性 345 10.14.4.3 Dispose 方法 345 10.14.5 可枚举对象 345 10.14.5.1 GetEnumerator 方法 346 10.14.6 实现示例 346 11. 结构 353 11.1 结构声明 353 11.1.1 结构修饰符 353 11.1.2 分部修饰符 353 11.1.3 结构接口 354 11.1.4 结构体 354 11.2 结构成员 354 11.3 类和结构的区别 354 11.3.1 值语义 355 11.3.2 继承 355 11.3.3 赋值 356 11.3.4 默认值 356 11.3.5 装箱和拆箱 356 11.3.6 this 的含义 358 11.3.7 字段初始值设定项 358 11.3.8 构造函数 358 11.3.9 析构函数 359 11.3.10 静态构造函数 359 11.4 结构示例 360 11.4.1 数据库整数类型 360 11.4.2 数据库布尔类型 361 12. 数组 365 12.1 数组类型 365 12.1.1 System.Array 类型 366 12.1.2 数组和泛型 IList 接口 366 12.2 数组创建 366 12.3 数组元素访问 367 12.4 数组成员 367 12.5 数组协变 367 12.6 数组初始值设定项 367 13. 接口 369 13.1 接口声明 369 13.1.1 接口修饰符 369 13.1.2 分部修饰符 369 13.1.3 Variant 类型形参列表 370 13.1.3.1 变化安全性 370 13.1.3.2 变化转换 371 13.1.4 基接口 371 13.1.5 接口体 372 13.2 接口成员 372 13.2.1 接口方法 373 13.2.2 接口属性 373 13.2.3 接口事件 374 13.2.4 接口索引器 374 13.2.5 接口成员访问 374 13.3 完全限定接口成员名 376 13.4 接口实现 376 13.4.1 显式接口成员实现 377 13.4.2 所实现接口的唯一性 379 13.4.3 泛型方法实现 380 13.4.4 接口映射 381 13.4.5 接口实现继承 383 13.4.6 接口重新实现 385 13.4.7 抽象类和接口 386 14. 枚举 387 14.1 枚举声明 387 14.2 枚举修饰符 387 14.3 枚举成员 388 14.4 System.Enum 类型 390 14.5 枚举值和运算 390 15. 委托 391 15.1 委托声明 391 15.2 委托兼容性 393 15.3 委托实例化 393 15.4 委托调用 394 16. 异常 397 16.1 导致异常的原因 397 16.2 System.Exception 类 397 16.3 异常的处理方式 397 16.4 公共异常类 398 17. 特性 399 17.1 特性类 399 17.1.1 特性用法 399 17.1.2 定位和命名参数 400 17.1.3 特性参数类型 401 17.2 特性说明 401 17.3 特性实例 406 17.3.1 特性的编译 406 17.3.2 特性实例的运行时检索 406 17.4 保留特性 407 17.4.1 AttributeUsage 特性 407 17.4.2 Conditional 特性 408 17.4.2.1 条件方法 408 17.4.2.2 条件特性类 410 17.4.3 Obsolete 特性 411 17.5 互操作的特性 412 17.5.1 与 COM 和 Win32 组件的互操作 412 17.5.2 与其他 .NET 语言的互操作 412 17.5.2.1 IndexerName 特性 412 18. 不安全代码 413 18.1 不安全上下文 413 18.2 指针类型 415 18.3 固定和可移动变量 418 18.4 指针转换 418 18.4.1 指针数组 419 18.5 表达式指针 420 18.5.1 指针间接寻址 420 18.5.2 指针成员访问 421 18.5.3 指针元素访问 422 18.5.4 address-of 运算符 422 18.5.5 指针递增和递减 423 18.5.6 指针算术运算 423 18.5.7 指针比较 424 18.5.8 sizeof 运算符 425 18.6 fixed 语句 425 18.7 固定大小缓冲区 429 18.7.1 固定大小缓冲区的声明 429 18.7.2 表达式的固定大小缓冲区 430 18.7.3 明确赋值检查 431 18.8 堆栈分配 431 18.9 动态内存分配 432 A. 文档注释 435 A.1 简介 435 A.2 建议的标记 436 A.2.1 437 A.2.2 437 A.2.3 437 A.2.4 438 A.2.5 438 A.2.6 439 A.2.7 440 A.2.8 440 A.2.9 441 A.2.10 441 A.2.11 442 A.2.12 442 A.2.13 442 A.2.14 443 A.2.15 443 A.2.16 444 A.2.17 444 A.2.18 444 A.3 处理文档文件 445 A.3.1 ID 字符串格式 445 A.3.2 ID 字符串示例 446 A.4 示例 449 A.4.1 C# 源代码 449 A.4.2 生成 XML 452 B. 语法 455 B.1 词法文法 455 B.1.1 行结束符 455 B.1.2 注释 455 B.1.3 空白 456 B.1.4 标记 456 B.1.5 Unicode 字符转义序列 456 B.1.6 标识符 456 B.1.7 关键字 458 B.1.8 文本 458 B.1.9 运算符和标点符号 460 B.1.10 预处理指令 460 B.2 句法文法 463 B.2.1 基本概念 463 B.2.2 类型 463 B.2.3 变量 464 B.2.4 表达式 464 B.2.5 语句 471 B.2.6 命名空间 475 B.2.7 类 475 B.2.8 结构 483 B.2.9 数组 483 B.2.10 接口 484 B.2.11 枚举 485 B.2.12 委托 486 B.2.13 特性 486 B.3 不安全代码的语法扩展 487 C. 参考资料 491 。。。。。。。

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧