1.Member Definitions
public-成员可以由任何代码访问
private-成员只能由类内的代码访问 - Default
internal-成员只能由定义它的工程内部访问
protected-成员只能有类内,或者继承他的类访问
protected internal-成员只能有工程内部的类本身以及继承它的类访问
1) Defining Fileds
公有类型的字段变量 使用 PascalCasing 规则命名
readonly关键字-表明该字段只能由构造函数来赋值,或者由初始化赋值语句赋值
2) Defining Methods
***如果使用static来修饰该方法,那么此方法只能通过类名来访问,不能通过类的实例来访问***
virtual-该方法可被重写
abstract-该方法必须在一个非抽象子类中被重写,只能用于抽象类中
override-方法重写了一个基类方法,如果该方法被重写必须使用该关键字
extern-方法的定义被放在其他地方
3) Defining Properties
属性为特殊的字段,有get 和 set 其中set可以用来做一些赋值控制。
eg.
1 namespace Ch10Ex02 2 { 3 public class Myclass 4 { 5 public readonly String Name; 6 private int intVal; 7 public int Val 8 { 9 get10 {11 return intVal;12 }13 set14 {15 if (value >= 0 && value <= 10)16 intVal = value;17 else18 throw (new ArgumentOutOfRangeException("Val", value, "Val must assigned a value between 0 and 10."));19 }20 }21 public override string ToString()22 {23 return "Name:" + Name + "\nVal:" + Val;24 }25 private Myclass()26 : this("Default Name")27 {28 }29 public Myclass(string newName)30 {31 Name = newName;32 intVal = 0;33 }34 }35 class Program36 {37 static void Main(string[] args)38 {39 Console.WriteLine("Creating Object myObj...");40 Myclass myObj = new Myclass("My Object");41 Console.WriteLine("myObj Created");42 for (int i = -1; i <= 0; i++)43 {44 try45 {46 Console.WriteLine("\nAttempting to assign {0} to myObj.Val...", i);47 myObj.Val = i;48 Console.WriteLine("Value {0} assigned to myObj.Val.", myObj.Val);49 }50 catch (Exception e)51 {52 Console.WriteLine("Exception {0} thrown.", e.GetType().FullName);53 Console.WriteLine("Message:\n\"{0}\"", e.Message);54 }55 }56 Console.WriteLine("\nOutputting myObj.ToString()...");57 Console.WriteLine(myObj.ToString());58 Console.WriteLine("myObj.ToStrinig() Output.");59 Console.ReadKey();60 }61 }62 }
可以控制赋值只能在0到10之间,其他赋值情况就会抛出异常。
主要用于一些类内的成员变量,为了安全性,设为了私有,不允许外界访问,所以一般通过属性来访问。
2.Additional Class Member Topics
1)Hidding Base Class Methods
隐藏基类方法可以直接在子类中 重新定义方法。
例如:
public Class MyBaseClass
{
public void DoSomething()
{}
}
pulbic Class MyDerivedClass:MyBaseClass
{
public void DoSomething()
{}
}
此方法就隐藏了基类中的方法。另外可以使用关键字new
new public void DoSomething(){} 可以达到同样的效果。不过不会出现警告!
***隐藏基类和重写的区别***
隐藏基类不会对基类产生影响,重写会产生影响。重写之后,当把子类复制给基类的时候就会基类中的方法被重写。
2)Calling Overriden or Hidden Base Class Methods
使用base关键字,在子类中使用 例如: base.DoSomething(); 那么子类中仍然保留了基类中的方法。
3)Nested Type Definition
嵌套类型的定义,即可以在类中再定义一个类,一般都把这个嵌套类定义为private类型。如果为public类型则可以实例化
eg. MyClass.MyNestedClass myObj = new Myclass.MyNestedClass();
3.Interface Implementation
分为显示引用和隐式引用两种,一般情况下用显式引用
3.Boxing and Unboxing
***System.Object equals to object***
装箱的含义:
int i = 42;
object o = i;
此 程序中 将值类型42赋予了对象引用类型的o.值类型的值都存在栈中 而引用类型必须要引用堆中的值,所以此时就把42复制一个到堆中,从而object类型的引用也引用堆中的值,这样就不会造成错误。
而复制到堆中的值与原来在栈中的值没有关系,任意一个修改都不影响另外一个。
拆箱的含义:
将堆中的值拆箱 再存到栈中,需要用到强制类型转换,如果不符合会抛出InvalidCastException
例如
int i = 42;
object o = i;
i = (int)o;
***拆箱和装箱的开销较大,不能够滥用,后面会继续学到另外一种异曲同工的技术----泛型。
4.强制类型转换
is操作符
例如:
WrappedInt wi = new WrappedInt();
object o = wi;
if(o is WrappedInt)
{
WrappedInt temp = (WrappedInt)o;
}
as操作符
WrappedInt wi = new WrappedInt();
object o = wi;
WrappedInt temp = o as WrappedInt;
if(temp != null) //只有成功转换,转型是安全的,if下面的值才会执行。