1.动态(Dynamic)类型
您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
声明动态类型的语法:
动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
dynamic <variable_name> = value;
动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
2.字符串(String)类型--@形式
C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,比如:
string str = @"C:\Windows";
等价于:
string str = "C:\\Windows";
@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。
string str = @"<script type=""text/javascript"">
<!--
-->
</script>";
简单说,@字符串将原样输出.
3.定义常量
常量是使用 const 关键字来定义的 。定义一个常量的语法如下:
const <data_type> <constant_name> = value;
例如:
1 const double pi = 3.14159;
4.switch 语句
C# 中 switch 语句的语法:
1 switch(expression){ 2 case constant-expression : 3 statement(s); 4 break; 5 case constant-expression : 6 statement(s); 7 break; 8 9 /* 您可以有任意数量的 case 语句 */ 10 default : /* 可选的 */ 11 statement(s); 12 break; 13 }
switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。switch 语句必须遵循下面的规则:
-
在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量。
-
当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
-
当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
-
不是每一个 case 都需要包含 break。如果 case 语句为空,则可以不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
-
C# 不允许从一个开关部分继续执行到下一个开关部分。如果 case 语句中有处理语句,则必须包含 break 或其他跳转语句。
-
一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。
-
C# 不支持从一个 case 标签显式贯穿到另一个 case 标签。如果要使 C# 支持从一个 case 标签显式贯穿到另一个 case 标签,可以使用 goto 一个 switch-case 或 goto default。
5.两个特殊的访问修饰符
Internal 访问修饰符:
可访问域限定于类所在的程序集内,一般就是同一个exe或dll文件.
Protected Internal 访问修饰符:
protected或者internal,即可访问域限定于类所在的程序或那些由它所属的类派生的类内.
6.C#中的参数传递
a.按值传递参数:
略
b.按引用传递参数:
在 C# 中,使用 ref 关键字声明引用参数。当然,是定义方法时用。
c.按输出传递参数:
return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。
在 C# 中,使用 out 关键字声明输出参数。当然,也是定义方法时用。
提供给输出参数的变量不需要赋值。
7.C# 可空类型(Nullable)
可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。
在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用。
声明一个 nullable 类型(可空类型)的语法如下:
< data_type> ? <variable_name> = value;
例如:
1 int? num1 = null; 2 double? num4 = 3.14157; 3 bool? boolval = new bool?();
Null 合并运算符( ?? ):如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。
例如:
1 double? num1 = null; 2 double? num2 = 3.14157; 3 double num3; 4 num3 = num1 ?? 5.34; //num3=5.34 5 num3 = num2 ?? 5.34; //num3=3.14157
8.类 vs 结构
类和结构有以下几个基本的不同点:
-
类是引用类型,结构是值类型。
-
结构不支持继承。
-
结构不能声明默认的构造函数。
9.C# 中的析构函数
类的 析构函数 是类的一个特殊的成员函数,当类的对象超出范围时执行。
析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。
析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。
例如Line类的析构函数:
1 ~Line() //析构函数 2 { 3 Console.WriteLine("对象已删除"); 4 }
10.继承
继承(实现)的基本语法:
class 子类:父类{
...
}
子类继承父类的构造方法用:base()
11.C#多态性
多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。
静态多态性:
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:
-
函数重载
-
运算符重载
动态多态性:
动态多态性是通过 抽象类 和 虚方法 实现的。
通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
虚方法就是抽象方法,虚方法必须被重写。
虚方法是使用关键字 virtual 声明的,而重写时则必须用关键字 override 注明。
12.运算符重载
您可以重定义或重载 C# 中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。
重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回类型和参数列表。
例如,请看下面的函数:
1 public static Box operator+ (Box b, Box c) 2 { 3 Box box = new Box(); 4 box.length = b.length + c.length; 5 box.breadth = b.breadth + c.breadth; 6 box.height = b.height + c.height; 7 return box; 8 }
上面的函数为用户自定义的类 Box 实现了加法运算符(+)。它把两个 Box 对象的属性相加,并返回相加后的 Box 对象
13. using (StreamReader sr = File.OpenText(path)) {...}语句
意思是在执行完using()的花括号中的语句时,将调用括号里实例化的对象的Dispose方法,将对象从托管堆中释放。
不是所有的对象声明都可以这样写,对于对象中没有包含Dispose方法的,不能用这个语句写。