第三章 类属性
使用过RAD开发工具的一定inspector很熟悉程序员通过它可以操作对象的属性DELPHI中引入了PUBLISH关键字来公布对象属性受到程序员的普遍欢迎通过存取标志来访问private成员在c#中有两种途径揭示类的命名属性——通过域成员或者通过属性前者是作为具有公共访问性的成员变量而被实现的后者并不直接回应存储位置只是通过存取标志(accessors)被访问当你想读出或写入属性的值时存取标志限定了被实现的语句用于读出属性的值的存取标志记为关键字get而要修改属性的值的读写符标志记为set
类属性
只能读 get
只能写 set
可读可写 set/get
请看例子
using System;
public class Test
{
private int m_nWrite;
private int readonly m_nRead=;
private int m_nWriteRead;
public int WRITEREAD
{
get {return m_nWriteRead;}
set {m_nWriteRead=value;}
}
public int WRITE
{
set { m_nWrite = value; }
}
public int READ
{
get {return m_nRead;}
}
}
class TestApp
{
public static void Main()
{
Test MyTest = new Test();
int i=MyTestREAD; //get
MyTestWRITE=; //set
MyTestWRITEREAD+= ; //set and get
ConsoleWriteLine(get:{} set:{} set/get:{} iMyTestWRITEMyTestWRITEREAD);
}
}
如果你想要隐藏类内部存储结构的细节时就应该采用存取标志存取标志给值参数中的属性传递新值同时你可以获得实现在set标志中增加有效代码的机会
第四章C# 中的加框与去框
C# 运行时中有两种类型引用类型(reference)(在 C# 中用类声明)和值类型(value)(在 C# 中用结构声明)引用和值类型在几个重要方面有所不同值类型感觉上象一个数据它包括预定义数值类型(如intbool)以及用户定义的类型(circlePoint等)如上文所述值类型的变量是实际的值所以在您使用变量时通常处理的是实际的值
>:首先让我们来看一看值类型(value)(在 C# 中用结构声明)
对于任何类型的非框机构都又如下的形
//
struct T_Point
{
T xy;
T_Point(T xy) {
thisx=x;
thisy=y
}
}
//
sample:
class test{
struct Point
{
public int x y;
public Point(int x int y) {
thisx = x;
thisy = y;
}
}
public static void Main()
{
Point p = new Point( );
object f = p;
px = ;
ConsoleWrite(((Point)f)x);
ConsoleWrite(px);
}
}
让我么来看一看最后的结果是什么?结果是在第二次指定变量后两个独立的变量包含相同的值
修改 p 的值不会改变 f 的值
>:引用类型用于所有不能用作值类型的对象引用类型的变量指向堆中对象的实例这意味着在将一个变量指定给另一个变量时只是指定了引用而不是值
对于任何类型的框类都又如下的形
//
class T_Point
{
T xy;
T_Point(T xy) {
thisx=x;
thisy=y
}
}
//
class test{
class Point
{
public int x y;
public Point(int x int y) {
thisx = x;
thisy = y;
}
}
public static void Main()
{
Point p = new Point( );
object f = p;
px = ;
ConsoleWrite(((Point)f)x);
ConsoleWrite(px);
}
}
让我么来看一看最后的结果是什么?很奇怪吗结果是在第二次指定变量后p 和 f 指向同一对象这意味着修改 p 的名称也将改变 f 的名称因为它们引用同一实例修改类值的成员称为变更者而不具有任何变更者的类称为不可变类不可变类的存在可以使类的行为类似于值类但不能写入为值类
在c#语言中同时使用引用和值两种类型是很重要的值类型轻便高效而引用类型适用于面向对象的开发但是尽管我们有两了种类型但有时我们需要的是更为简单的模型使用单一的能够囊括所有可能值的类型这样一个通用基类能够调用任何值的虚函数写入能够存储任何值的集合类为实现这一目的c#语言运行时采用一种方法让值类型在需要时转化为引用类型即通过称为加框的进程被加框的类型是通用基类可以被各种类型的对象引用
解框
int i = ;
object k = i;// 将 int i 加框到对象 k 中
int j=(int)k; // 解框 k 到 value
当赋值给 k 时作为赋值的一部分C# 编译器将创建足够容纳堆中 int 的引用类型包装将值复制到该加框然后将加框标记为实际类型以便运行时了解加框的类型要从加框中取值必须使用强制类型装换来指定加框的类型(对象能够保留任何类型)在执行过程中运行时将检查对象变量引用的类型是否为强制类型转换中指定的类型如果类型正确值将从加框中复制回值类型变量如果类型不正确将导致异常请注意解除加框过程中不会进行其他转换类型必须完全匹配
请注意以下代码
long i = ;
object k = i;// 将 long i 加框到对象 k 中
ulong j=(ulong)k;
#error
由于加框类型于解框类型的不同将出错如果认为像c++语言一样下面的操作将正确那也是不对的
long i = ;
object k = i;
int j=(int)k;
#error
最后总结一下加框和解框加框和解框使编写和使用具有通用对象参数的函数变得简单而直接