值类型:大多数基本类型,例如int、double和所有的结构
引用类型:string和所有的类
注:值类型必须包含一个值,它可以在声明之后、赋值之前,在未赋值的状态下存在,但不能以任何方式使用。而引用类型可以是null。
可空类型(nullable type):解决值类型的一个小问题 System.Nullable
If(nullableInt == null) {……..} 等价于 f(nullableInt.HasValue) {……..}
注:上述测试方法不适用于引用类型,因为引用类型的变量值为null时就表示不存在对象,即使引用类型有一个HasValue属性。
可空类型的简化缩写:int? nullableInt; 如:int? op1 = 5;
Int? result = op1 * 2;(int result = op1 * 2会出现错误) ??运算符:int? op1 = null; (把5值赋给result)
Int result = op1 * 2 ?? 5; (??自动转换类型)
∷运算符:提供了访问命名空间中类型的另一种方式,即给出的命名空间别名优于一般的类型限定。与global关键字一起使用,它实际上是顶级根命名空间的别名。
多态性:多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为\一个接口,多个功能\。多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。
静态多态性:在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:
(1)函数重载您可以在同一个范围内对相同的函数名有多个定义。函数的定义必须彼此不同,可以是参数列表中的参数类型不同,也可以是参数个数不同。不能重载只有返回类型不同的函数声明。
(2)运算符重载可以重定义或重载 C# 中内置的运算符。因此,程序员也可以使用用户自定义类型的运算符。重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的。与其他函数一样,重载运算符有返回
类型和参数列表 。
动态多态性:C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。 注:下面是有关抽象类的一些规则: 您不能创建一个抽象类的实例。
您不能在一个抽象类外部声明一个抽象方法。
通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。虚方法是使用关键字 virtual 声明的。虚方法可以在不同的继承类中有不同的实现。对虚方法的调用是在运行时发生的。
动态多态性是通过 抽象类 和 虚方法 实现的。
接口(Interface):接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 \是什么\部分,派生类定义了语法合同 \怎么做\部分。
(1)接口定义了属性、方法和事件,这些都是接口的成员。
(2)接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。
(3)抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。 (4)接口使用 interface 关键字声明,它与类的声明类似。接口声明默认是 public 的。
反射(Reflection):反射指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 优缺点之优点:
1、反射提高了程序的灵活性和扩展性。 2、降低耦合性,提高自适应能力。
3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。 优缺点之缺点:
1、性能问题:使用发射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此发射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议
使用。
2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。 反射(Reflection)的用途:
1、它允许在运行时查看属性(attribute)信息。
2、它允许审查集合中的各种类型,以及实例化这些类型。 3、它允许延迟绑定的方法和属性(property)。
4、它允许在运行时创建新类型,然后使用这些类型执行一些任务。
属性(Property): 是类(class)、结构(structure)和接口(interface)的命名(named)成员。类或结构中的成员变量或方法称为 域(Field)。属性(Property)是域(Field)的扩展,且可使用相同的语法来访问。它们使用 访问器(accessors) 让私有域的值可被读写或操作。
注:属性(Property)不会确定存储位置。相反,它们具有可读写或计算它们值的 访问器(accessors)。
例如,有一个名为 Student 的类,带有 age、name 和 code 的私有域。我们不能在类的范围以外直接访问这些域,但是我们可以拥有访问这些私有域的属性。
访问器(Accessors):属性(Property)的访问器(accessor)