类和结构
类是存储在堆(heap)上的引用类型,而结构是存储在栈(stack)上的值类型。
结构 不支持继承
类
数据成员 是包含类的数据--字段、常量和事件的成员。
函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和终结器(finalizer)、运算符以及索引器
ref参数 迫使值参数通过引用传递给方法
在方法的输入参数前面加上out前缀时,传递给该方法的变量可以不初始化。
命名参数允许按照任意顺序传递
参数也可以是可选的。必须为可选参数提供默认值。
方法重载:
.俩个方法不能仅在返回类型上有区别
.俩个方法不能仅根据参数是声明为ref还是out来区分
属性
在属性定义中省略set访问器,就可以创建只读属性
在属性定义中省略get访问器,就可以创建只写属性
C#允许给属性的set和get访问器设置不同的访问修饰符,属性可以有公有的get访问器和私有或受保护的set访问器
如果属性的set和get访问器中没有任何逻辑,就可以使用自动实现的属性。
构造函数
注意,如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数。
可以把构造函数定义为private 或protected,这样不相关的类也不能访问,
这在下面俩种情况下是有用的:
.类仅用作某些静态成员或属性的容器,因此永远不会实例化它
.希望类仅通过调用某个静态成员函数来实例化(这就是所谓对象实例化的类工厂方法)
静态构造函数,类有一些静态字段或属性,需要在第一次使用之前,从外部源中初始化这些静态字段和属性
C#构造函数初始化器可以包含对同一个类的另一个构造函数的调用,也可以包含对直接基类的构造函数的调用(使用相同的语法,应使用base关键字代替this)
只读字段
readonly
可以在构造函数中给只读字段赋值,但不能在其他地方赋值
public class Document { public readonly DateTime CreationData public Document() { // Read in creation date from file.Assume result is 1 Jan 2002 // but in general this can be different for different instances // of the class CreationDate = new DateTime(2002,1,1); } }
匿名函数
var与new 关键字一起使用,可以创建匿名类型
如下:
var caption = new {FirstName = "James", MiddleName = "T",LastName = "Kirk"};
结构
正面影响:为结构分配内存时,速度非常快,因为它们将内联或者保存在栈中。在结构超出了作用域被删除时,速度也很快。
负面影响:只要把结构作为参数来传递或者把一个结构赋予另一个结构,结构的所有内容就被复制,而对于类则只复制引用。
结构的继承链:每个结构派生自System.ValueType类,System.ValueType类又派生自System.Object。
默认构造函数把数值字段都初始化为0,把引用类型字段初始化为null,且总是隐式地给出。
部分类
partial关键字允许把类、结构或接口放在多个文件中
partial关键字的用法是:把partial放在class、struct或interface关键字前面
扩展方法,它允许改变一个类,但不需要该类的源代码。