第二节 真假唐伯虎!
回家以后,看着镜子中的自己,回想起刚走的她,那一颦一笑都吸引着我。不知怎的,一想到她有男朋友,就浑身不自在,可能这就是喜欢吧。虽然之前有过女朋友,可是那份不真实的爱情在心里还是烙下了很深的伤疤。难道我想转移我的感情?不是,绝对不是,因为看到小力的时候,心中总是有一份紧张害怕做错事的感觉,甚至一个笑话没有讲好,都觉得是自己不对。啊~~这就是追女生的感觉吧!想着想着,手不由自主的慢慢移到了脸上,“噗嗞”声不绝于耳,当反应过来的时候,发现自己已经进入走火入魔的境界了,两手手指已在放松、挤压的癫狂状态中,通过人类微弱的思想和意识根本无法控制。心想,去他妈的,让他们(手指)挤去吧,我是如此宽容的一个人。哎,要是她能跟男朋友分手,就算全身长满痘痘我也情愿……
一周后,她跟她男友分手了……我也如愿的起了一身水痘……不过因此我们俩成了知己,我明白分手的痛,她懂起水痘的苦。她哭我也哭,但是我痒,她不痒……虽然后来我的病好了,她的伤也好了,但是我的小窝成了我们俩的聚集地。我也从此学到了一件事情:愿,不是这么许的。
1、今天我也让梨了
地点:革命根据地——我家
(远处传来歌声:“大的人人要,我偏偏要小,小有小的好,太大吃不了……”改自阿牛《小强的车》)
小色:都不用猜,一听就是小力来了,心情怎么能这么好呢?(开门中~)
小力:呦,痘哥,是不是小妹我那甜美的声音吸引了你,想开门看看是哪位美女呢?
小色:起外号你怎么张口就能来呢。我是闻到了妖精味,想三打女妖精呢。
小力:呵呵,拿着擀面杖干吗呢?包饺子呢啊?我也来帮忙好了,省的你吃不完剩下。
小色:别,我宁愿少包点,也不用你帮这个忙。你怎么心情这么好?难道是今天你没被狗咬?
小力:滚,你知道恐龙让梨的故事不?今天我也让梨了,我拿了俩梨,一大一小,给我爸爸一个大个的,他夸我半天呢。
小色:你个笨蛋,那是孔融让梨,不过你让梨说成是恐龙让梨倒是很恰当。这事也能让你高兴成这样?
小力:你别逼我使用武力啊!当然高兴啊,他不知道其实我是吃不了才留了个小的呢。
小色:呦,那还得夸你节俭呢。不过,你这么说的话,我倒是想起来前几天你去面试,为什么人家说没通过了。
小力:别提那个伤心事了,那个技术考官肯定是因为我比她长得漂亮。我代码写的那么完美,怎么可能不通过呢。
小色:我记得你说过,你把所有的东西都写到了很多单独的类里了。其实这么做并不是很完美,有一种东西跟类其实很像,我记得之前提起过,叫做结构。
小力:好啊好啊,正好趁擀皮的时候,给我讲讲吧。
小色:恩,正好你来包。这类和结构实际上都是创建对象的模板!每个结构都派生于System.ValueType,System.ValueType派生于System.Object。内存中存储方式上的区别是类存储在堆(heap)上,而结构存储在堆栈(stack)上!语法上只是关键字struct和class的区别!和类一样,结构也可以包含其他类型。由于结构在内部是值类型的,而类是引用类型,所以结构有时也被称为类的轻型版本。同时,结构不承担引用对象所带来的开销,除非在对其装箱时例外。
小力:也就是说,结构其实是类的一种小型版本,那怎么声明结构呢?还有结构和类到底有什么不同呢?
小色:别着急,我这就告诉你。(从后脑勺猛地抽出笔和纸,小力似乎已经司空见惯,并没有感到惊讶!)
//定义结构 public struct Student {//定义一个结构的名称为Student public string name; public int age; public char sex; public void Info() { Console.WriteLine("姓名:"+name+"年龄:"+age+"性别:"+sex); } /*结构体*/ } |
小色:跟类一样,在结构中可以定义成员变量(字段,但是不许赋值),可以有构造函数(但是必须带参),可以有常量、方法、特性、索引器、操作符等。由于客户不必对结构进行实例化(通过new关键字),并且结构不允许给字段设置初始值。所以:
Student stu; Console.WriteLine(stu.name); |
这段代码会出错。因为此时还没有赋值的字段name是不允许被读取的。如果想解决这个问题,可以通对结构进行实例化来解决,
Student stu; stu.name = "Mgod"; stu.age = 18; stu.sex = 'N'; Console.WriteLine(stu.name); |
Student stu=new Student(); Console.WriteLine(stu.name); |
上面的代码,由于
小力:那结构很奇怪啊,怎么可以实例化,也可以不实例化呢?我怎么以前没见过呢?
小色:其实在我们经常见的,平时使用变量类型的时候,就一直在使用的是结构。你看看我们在打上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 { OutPutRGBValue("red",RGB.RED); OutPutRGBValue("green",RGB.GREEN); OutPutRGBValue("blue",RGB.BLUE); OutPutRGBValue("white",RGB.WHITE); OutPutRGBValue("black",RGB.BLACK); Console.ReadLine(); } } |
这段代码定义了一个结构和静态字段,这样做使存储的效率提高了;使用上又方便了用户,毕竟记住一个
RGB(255,100,255) 要比记住一个“草浅兰” 要困难的多;由于静态成员的加盟,使得每个RGB键值对于整个系统只用定义一次,这样使用起来其高效性和方便性都是显而易见的。
小力:哎呀,你说的太详细了,上面的代码我还是看不太懂,等我一会包完饺子来慢慢研究吧!
小色:恩,没关系,这些都是你在使用过程中慢慢体会的。不过我想你把你之前的那份面试题稍微修改一下,应该就没有问题了吧!
小力:是啊,又学到了个结构,应该没问题了。哎呀,都是你,只顾得听你讲了,都忘了饺子怎么包了。也不知道我的偶像李宇春会不会包饺子呢?
小色:什么?李宇春?!那个男人?
(请看下回:“超级男生”李宇春)
完稿日期: