第二节  真假唐伯虎!

 

回家以后,看着镜子中的自己,回想起刚走的她,那一颦一笑都吸引着我。不知怎的,一想到她有男朋友,就浑身不自在,可能这就是喜欢吧。虽然之前有过女朋友,可是那份不真实的爱情在心里还是烙下了很深的伤疤。难道我想转移我的感情?不是,绝对不是,因为看到小力的时候,心中总是有一份紧张害怕做错事的感觉,甚至一个笑话没有讲好,都觉得是自己不对。啊~~这就是追女生的感觉吧!想着想着,手不由自主的慢慢移到了脸上,“噗嗞”声不绝于耳,当反应过来的时候,发现自己已经进入走火入魔的境界了,两手手指已在放松、挤压的癫狂状态中,通过人类微弱的思想和意识根本无法控制。心想,去他妈的,让他们(手指)挤去吧,我是如此宽容的一个人。哎,要是她能跟男朋友分手,就算全身长满痘痘我也情愿……

一周后,她跟她男友分手了……我也如愿的起了一身水痘……不过因此我们俩成了知己,我明白分手的痛,她懂起水痘的苦。她哭我也哭,但是我痒,她不痒……虽然后来我的病好了,她的伤也好了,但是我的小窝成了我们俩的聚集地。我也从此学到了一件事情:愿,不是这么许的。

1、今天我也让梨了

地点:革命根据地——我家

(远处传来歌声:“大的人人要,我偏偏要小,小有小的好,太大吃不了……”改自阿牛《小强的车》)

小色:都不用猜,一听就是小力来了,心情怎么能这么好呢?(开门中~

小力:呦,痘哥,是不是小妹我那甜美的声音吸引了你,想开门看看是哪位美女呢?

小色:起外号你怎么张口就能来呢。我是闻到了妖精味,想三打女妖精呢。

小力:呵呵,拿着擀面杖干吗呢?包饺子呢啊?我也来帮忙好了,省的你吃不完剩下。

小色:别,我宁愿少包点,也不用你帮这个忙。你怎么心情这么好?难道是今天你没被狗咬?

小力:滚,你知道恐龙让梨的故事不?今天我也让梨了,我拿了俩梨,一大一小,给我爸爸一个大个的,他夸我半天呢。

小色:你个笨蛋,那是孔融让梨,不过你让梨说成是恐龙让梨倒是很恰当。这事也能让你高兴成这样?

小力:你别逼我使用武力啊!当然高兴啊,他不知道其实我是吃不了才留了个小的呢。

小色:呦,那还得夸你节俭呢。不过,你这么说的话,我倒是想起来前几天你去面试,为什么人家说没通过了。

小力:别提那个伤心事了,那个技术考官肯定是因为我比她长得漂亮。我代码写的那么完美,怎么可能不通过呢。

小色:我记得你说过,你把所有的东西都写到了很多单独的类里了。其实这么做并不是很完美,有一种东西跟类其实很像,我记得之前提起过,叫做结构

小力:好啊好啊,正好趁擀皮的时候,给我讲讲吧。

小色:恩,正好你来包。这类和结构实际上都是创建对象的模板!每个结构都派生于System.ValueTypeSystem.ValueType派生于System.Object。内存中存储方式上的区别是类存储在堆(heap)上,而结构存储在堆栈(stack)上!语法上只是关键字structclass的区别!和类一样,结构也可以包含其他类型。由于结构在内部是值类型的,而类是引用类型,所以结构有时也被称为类的轻型版本。同时,结构不承担引用对象所带来的开销,除非在对其装箱时例外。

小力:也就是说,结构其实是类的一种小型版本,那怎么声明结构呢?还有结构和类到底有什么不同呢?

小色:别着急,我这就告诉你。(从后脑勺猛地抽出笔和纸,小力似乎已经司空见惯,并没有感到惊讶!)

 

//定义结构

    public  struct Student

    {//定义一个结构的名称为Student

        public string name;

        public int age;

        public char sex;

        public void Info()

        {

            Console.WriteLine("姓名:"+name+"年龄:"+age+"性别:"+sex);

        }

        /*结构体*/

    }

2.1.1

小色:跟类一样,在结构中可以定义成员变量(字段,但是不许赋值),可以有构造函数(但是必须带参),可以有常量、方法、特性、索引器、操作符等。由于客户不必对结构进行实例化(通过new关键字),并且结构不允许给字段设置初始值。所以:

Student stu;

Console.WriteLine(stu.name);

2.1.2

这段代码会出错。因为此时还没有赋值的字段name是不允许被读取的。如果想解决这个问题,可以通对结构进行实例化来解决,

Student stu;

stu.name = "Mgod";

stu.age = 18;

stu.sex = 'N';

Console.WriteLine(stu.name);

2.1.3

Student stu=new Student();

Console.WriteLine(stu.name);

2.1.4

上面的代码,由于2.1.4经过了实例化,所以字段就会被赋予其所对应的默认值。而2.1.3未经过实例化,则所有字段必须全部赋值后才可以调用,否则编译器会报错:使用了未赋值的局部变量

小力:那结构很奇怪啊,怎么可以实例化,也可以不实例化呢?我怎么以前没见过呢?

小色:其实在我们经常见的,平时使用变量类型的时候,就一直在使用的是结构。你看看我们在打上int的时候,编译器给我们的提示

      小力:哦,看到了,那也就是说,我们既可以使用int num;也可以使用int num=new int();了,如果是不经过实例化的前者,则我们就必须将他所声明的字段全部赋值后才能使用。如果是后者,则字段将保存默认值。

小色:对哦,结构的构造也很特殊。结构不允许包含显式的无参数的构造函数,可以利用带参数的构造函数来定义;并且,一旦声明带参数的构造函数,则必须在离开构造函数之前将字段完全赋值。下面我列举一下他跟Class的区别吧:

 

结构

不同点

引用类型

值类型

可以被继承

不可以被继承

可以有默认构造函数

不可以有默认构造函数

可以添加无参构造函数

可以添加构造函数,但必须有参

创建对象必须使用NEW

创建对象可以不用NEW

可以给字段赋值

不可以给字段赋值

可以继承指定类

总是继承System.ValueType

相同点

可以包含字段、方法等

可以实现接口

 

 

 

 

 

 

 

 

 

 

 

 

A.  为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中;结构出了作用域被删除时,速度也非常快。

B.  只要把结构作为参数传递或把结构赋值给另一个结构时,结构是所有内容被复制;而类只复制引用即可。这样就有性能损失!

小力:这么说的话,类占资源这么多,结构速度又快,又差不多能当类用,我就一直使结构不就行了吗?!
小色:当然不行,你要是随意的去使用结构的话,其实也会被嘲笑的。这里我建议你:1、你在设计对象群时,需要面对大量结构简单且状态 信息比较少的对象时,我建议你最好选用结构类型来构造这些小规模数据体。2、由于结构的原型是值类型,所以它整个被定义为一个数据,所以不要试图在结构里构造过多的方法,最好是能不定义方法,就尽量避免下面这段代码是微软给出的结构经典示例:

struct RGB

{ //定义颜色结构

public static readonly RGB RED = new RGB(255,0,0); //定义静态只读对象

public static readonly RGB GREEN = new RGB(0,255,0);

public static readonly RGB BLUE = new RGB(0,0,255);

public static readonly RGB WHITE = new RGB(255,255,255);

public static readonly RGB BLACK = new RGB(0,0,0);

 

public int Red; //定义字段

public int Green;

public int Blue;

public RGB(int red,int green,int blue)

{ //定义构造

Red = red;

Green = green;

Blue = blue;

}

public override string ToString()

{ //重写ToString()方法来显示各个字段所对应的16进制

return (Red.ToString("X2") + Green.ToString("X2") + Blue.ToString("X2"));

}

}

 

public class Struct

{

static void OutPutRGBValue(string color,RGB rgb)

{

Console.WriteLine("The Value for {0} is {1}",color,rgb);

}

 

static void Main(string[] args)

{

OutPutRGBValue("red",RGB.RED);

OutPutRGBValue("green",RGB.GREEN);

OutPutRGBValue("blue",RGB.BLUE);

OutPutRGBValue("white",RGB.WHITE);

OutPutRGBValue("black",RGB.BLACK);

Console.ReadLine();

}

}

2.1.5

这段代码定义了一个结构和静态字段,这样做使存储的效率提高了;使用上又方便了用户,毕竟记住一个

RGB(255,100,255) 要比记住一个“草浅兰” 要困难的多;由于静态成员的加盟,使得每个RGB键值对于整个系统只用定义一次,这样使用起来其高效性和方便性都是显而易见的。

小力:哎呀,你说的太详细了,上面的代码我还是看不太懂,等我一会包完饺子来慢慢研究吧!

小色:恩,没关系,这些都是你在使用过程中慢慢体会的。不过我想你把你之前的那份面试题稍微修改一下,应该就没有问题了吧!

小力:是啊,又学到了个结构,应该没问题了。哎呀,都是你,只顾得听你讲了,都忘了饺子怎么包了。也不知道我的偶像李宇春会不会包饺子呢?

小色:什么?李宇春?!那个男人?

(请看下回:“超级男生”李宇春)

完稿日期:2009121 108