C#学习笔记三:类初步相关知识要点(1)

类别:.NET开发 点击:0 评论:0 推荐:

 

附加说明:写关于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参数同上一样必须在方法中设置(赋值)。

其余和通过值传递引用类型(以上讨论的情形一)一样。

本文地址:http://com.8s8s.com/it/it45359.htm