附加说明:写关于class之类的东西是最枯燥的,本文只是保证笔记的完整性,如果你已经很熟悉,就无需浪费时间。
常量字段与静态字段的比较:
常量字段(const)的值是在编译时设置的,只读字段(readonly)是在运行时设置的。
只读字段加上static可以无需对类进行实例化从而直接引用。
const 和static readonly均可直接引用,那么其区别在哪里呢?请看一个理解两者关系的经典的msdn的例子:
using System;
namespace Program1
{
public class Utils
{
public static readonly int X = 1;
}
}
namespace Program2
{
class Test
{
static void Main() {
Console.WriteLine(Program1.Utils.X);
}
}
}
Program1 和 Program2 命名空间表示两个单独编译的程序。由于 Program1.Utils.X 声明为静态只读字段,因此 Console.WriteLine 语句要输出的值在编译时是未知的,直到在运行时才能获取。这样,如果更改 X 的值并重新编译 Program1,则即使 Program2 未被重新编译,Console.WriteLine 语句也将输出新值。但是,假如 X 是常数,X 的值将在编译 Program2 时获取,并且在重新编译 Program2 之前不会受到 Program1 中的更改的影响。
我相信,上面解释得很清楚了。但当我们同时可以用以上两种方法初始化字段时,我们希望知道两种方法的性能问题。刚开始我们曾经说过,常量是编译时设置的,也就是形成硬编码保持在PE(或DLL)文件中,而只读静态字段是在运行时设置的,也就是说,当有大量值需要设置的时候,常量字段更有优势。当然,同上篇讨论装箱和拆箱一样,对性能的影响是比较小的。
方法参数:关于值传递(by value)和引用传递(by reference)的讨论
一、首先我们讨论最简单的情形(by value 不使用ref和out关键字的情形)。
1.值传递值类型的方法参数,是将值的一个副本传递给方法,不影响传递的变量。
2.引用传递的是引用的一个副本(对相同数据的另一个引用,这里我们几乎可以把它看作C++里面的“指针”),因此,此时对参数的修改就是对原始数据进行的。关于2,一个简单的例子增强我们感性认识。
class AnotherClass
{
public int ID;
}
class SomeClass
{
public AnotherClass ChangeObject(AnotherClass ref1)
{
ref1.ID = ref1.ID*2;
return ref1;
}
}
当我们调用以下方法时:ref1.ID和ref2ID均为6。
notherClass ref1 = new AnotherClass();
ref1.ID = 3;
AnotherClass ref2 = sc.ChangeObject(ref1);
二、通过引用(by reference)传递值类型(value type):
ref方法参数:可以改变值,调用方法前必须初始化变量,在方法中无需对参数进行设置(赋值)。
out方法参数:可以改变值,调用方法前不需初始化变量,在方法中必须对传递的参数进行设置(赋值)。
三、通过引用(by reference)传递引用类型(reference type):
out参数同上一样必须在方法中设置(赋值)。
其余和通过值传递引用类型(以上讨论的情形一)一样。