3.2 类和结构
类与结构的区别是它们在内存中的存储方式、访问方式(类似存储在堆上的引用类型,而结构是存储在栈上的值类型)和它们的一些特征。
语法上,类与结构非常相似,主要区别是结构使用关键字 struct 代替 class 来声明。
3.3 类成员
3.3.1 数据成员
3.3.2 函数成员
函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和析构函数(终结器)、运算符以及索引器。
-
方法
ref 和 out 的区别:
ref 在传递之前必须已经被初始化,out 则不要求。
ref 的实质是将值类型进行引用传递,而 out 是为了增加返回值。
命名参数:在传递参数的过程中可以指定其名字,格式为 MethodName (ParameterName : Value )
Params 关键字 : 必须在方法参数的最后面。
方法的重载:不能仅在返回类型上有区别,不能仅根据声明 ref 、 out 或 params 之间区分。
-
属性
概念:属性是一个或一对方法,在客户端代码看来,它(们)是一个字段。
get访问器不带任何参数,且返回属性声明的类型。
set访问器带一个value参数,其类型与声明的类型相同。
属性的访问修饰符:在get和set访问器中,必须有一个具备属性的访问级别。
-
构造函数
声明构造方式就是声明一个与包含的类同名的方法,但该方法没有返回值。
如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数。
(1)静态构造函数
编写静态构造函数的原因:类中有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些字段和属性。
.NET运行库没有确保什么时候去执行静态构造函数,所以不应该要求在某个特定时刻执行静态构造函数中的代码。但可以确保的是,它在所有引用前只会调用一次。
无参构造函数可以与静态构造函数在同一个类中定义。
(2)从构造函数中调用其它构造函数
base 与 this 关键字
3.3.3 只读字段
readonly 与 const 的区别:
readonly 可以在构造函数中赋值,而 const 哪里都不能赋值,只能初始化。
3.4 匿名类型
var 和 new 关键字一起使用可以创建匿名类型,例如。
static void Main(string[] args)
2
3
4 {
5
6
7 var test = new { Name = "Earl Jones", Age = 17 };
8
9
10 Console.WriteLine(test.ToString());
11
12
13 Console.WriteLine(test.Name.GetType().ToString());
14
15
16 Console.WriteLine(test.Age.GetType().ToString());
17
18
19 Console.ReadKey();
20
21
22 }
复制代码输出结果如下:

我们并不知道这个对象的类型,编译器为其“伪造”了一个名称,但是只有编译器才能使用它,我们不能也不应该使用新对象上的任何类型反射,因为这不会得到一致的结果。
3.5 结构
结构一般用于表达简单的组合数据。
PHP高级程序设计 模式 框架与测试(中文高清PDF版)下载享有盛誉的PHP高级教程,Zend Framework核心开发人员力作,深入设计模式、PHP标准库和JSON 。 今天,PHP已经是无可争议的Web开发主流语言。PHP 5以后,它的面向对象特性也足以与Java和C#相抗衡。然而,讲述PHP高级特性的资料一直缺乏,大大影响了PHP语言的深入应用。 本书填补了这一空白。它专门针对有一定经验的PHP程序员,详细讲解了对他们最为重要的主题
结构不支持继承,但所有结构都继承于System.ValueType,而System.ValueType又继承于System.Object。
使用结构,可以指定字段如何在内存中布局。
对于结构,编译器总是提供默认无参构造函数,它不允许被替换,也不能在结构中为字段提供初始值,必须在构造函数中提供。
结构中的公有字段为可接受的编程方式。
在定义结构时使用new关键字只不过是用于调用其构造函数,变量的声明实际上才是为结构分配空间,所以以下代码不被报错。
1 MyStruct myStruct /*= new MyStruct()*/; 2 myStruct.Name = "Earl Jones"; 3 myStruct.Age = 17;
覆盖结构默认的构造函数会报错:

3.6 弱引用
在代码中实例化一个类或结构时,只要有代码引用它,就会形成强引用。
强引用和弱引用的区别是,强引用只要有引用就不会被GC回收,而弱引用随时都可能被GC回收,所以使用它的时候必须确定其是否存活。如:
1 MyClass myClass;
2 WeakReference weakMyClass = new WeakReference(new MyClass());
3 if (weakMyClass.IsAlive)
4 {
5 myClass = weakMyClass.Target as MyClass;
6 Console.WriteLine(myClass.value);
7 } 3.7 部分类
Partial关键字可以允许把类、结构、方法或结构放在多个文件中。
如果声明类似使用了下面的关键字,这些关键字就必须应用于同一个类的所有部分:
访问修饰符
abstract
sealed
new
一般约束
3.9 Object类
所有类都继承自System.Object类。
方法:
ToString();
GetHashCode();
Equals();这里有三个比较三个用于比较对象相等性的方法。
Finalize();
GetType();
GMemberwiseClone();
3.10 扩展方法
扩展方法用于在某些不能直接修改源代码中的类中添加方法。
1 using System;
2
3 namespace 扩展方法
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 MyClass myClass1 = new MyClass();
10 myClass1.SayHiToSomeone();
11 myClass1.SayHi();
12 Console.ReadKey();
13 }
14 }
15
16 class MyClass
17 {
18 public void SayHi()
19 {
20 Console.WriteLine("我是最原始的方法");
21 }
22 }
23
24 static class AddMyClass
25 {
26 static public void SayHiToSomeone(this MyClass myClass)27 {
28 Console.WriteLine("我是一个扩展方法");
29 }
30
31 static public void SayHi(this MyClass myClass)
32 {
33 Console.WriteLine("我是扩展方法SayHi");
34 }
35 }
36 }输出的结果:

由上得出:
扩展方法必须定义在一个静态类中。
扩展方法的第一个参数为放在 this 后的类,这个方法就是这个类的一部分。
即是扩展方法是一个静态方法,也要使用调用实例方法的语法经行调用。
如果扩展方法与类中某个方法同名,就从来不会调用扩展方法。









