当前位置:早雪网网络学院编程文档.NET → C#进阶教程(1/3)

C#进阶教程(1/3)

减小字体 增大字体 作者:佚名  来源:本站原创  发布时间:2005-6-24 2:49:04
C#进阶教程(1/3)

写在前面的话
在写这些文章之前,我对C#一无所知.只从前辈那里听说了一些,说他很像JAVA.因为我这段时间一直在看JAVA,结果什么明堂没看出来(只能怪我太笨:),其实我想还是没有实践的机会),所以就很想换换口味.其实很早就听说了C#,想看一看这个东东,只是上M$的网站一看,.NET的东东要一百多兆呢!看了就怕,何况全部下载下来,要费我一整张电话卡呢?幸好我一个朋友先把.NET下载下来了,我拿了硬盘就跑过去拷过来了.一个SETUP.EXE,足足有106M之巨.所以,我在此要特别感谢这位朋友阿KEN,没有他的帮助,就没有下面的文章.
写这篇文章的时候,我就有些害怕,怕自己水平不够,错误太多,挨别人骂.在写的过程中,发现还是比较顺利的,因为这些跟原先的JAVA有很多相象的地方.而JAVA,很多前辈都有很深的研究.不过,由于本人水平有限,错误之处在所难免,如果大家发现有什么错误之处,还望指正,在下感激不尽!我的MAIL:mrfat@china.com.小弟先在此谢过了!
以下的文章适用于有一些JAVA/C++编程经验的人,如果有JAVA的编程经验,那就更好了,因为我在里面很多地方把C#与JAVA对比.如果你没有任何的编程序经验,可以到OICQ的主页的社区去找另一系列的C#教程,那个可能更适合你.
还有就是由于以下文章是在闲的时间写的,废话比较多,大家看了不要吐血哟@#$%^&*!好了,下面开始吧!
大家好,我是武汉华师的SUNWEN,我又回来了。五一大家都走了,SUNWEN还要在寝室里奋战,呜呜。今天,我要向大家讲的是大家听说了好久的,又充满神密的语言:C#。
今天刚从朋友那搞来了M$的.NET开发包,从M$的网站上下的,有106M,所以SUNWEN自然就没有钱去下他了.话说今天早上六点.....(台下:快进入正题,笨蛋!又一双皮鞋飞了上来,这已是第三双了!)是,我马上开始!
刚拿到C#的参考时,我一看,这简直就是JAVA嘛!的确,跟外界说的一样,在表面上,C#和JAVA非常地像,以致一个懂JAVA的人能够很快的掌握C#的结构.致于其内部的实现机理,那我也不太清楚,只能与大家在学习中共同进步了,还希望大家多多捧场呀!
好,为了给大家一个更清晰的感觉,我首先给大家一个例子,自然是HelloWorld(老土!).
000: // HelloWorld\Hello1.cs
001: public class Hello1
002: {
003: public static void Main()
004: {
005: System.Console.WriteLine("Hello, World!");
006: }
007: }
它的输出结果是:
Hello, World!
有的朋友已经发现了,就是JAVA!只不过把System.out.prinln()改成了System.Console.WriteLine()罢了!
下面我们来分析一下这个程序,整个程序由一个public类(class)组成,里面必然有一个public static void Main()这个方法,执行代码就在里面.System.Console.WriteLine("Hello, World!")这个语句的作用就是向控制台(Console)打印一行Hello,World!.很简单吧!
下面再来一个:
000: // HelloWorld\Hello2.cs
001: using System;
002:
003: public class Hello2
004: {
005: public static void Main()
006: {
007: Console.WriteLine("Hello, World!");
008: }
009: }
这个程序用了一个using,其实它就等于JAVA里的import,就是引用一个包的意思.当引用了这个包之后,在这个包中的Console类就不要指出全称了,只要Console.WriteLine()就可以了,不必用System.Console.WriteLine()这么长了,省略了System了.
例三,如下显示了如何显示命令行的参数
000: // HelloWorld\Hello3.cs
001: using System;
002:
003: public class Hello3
004: {
005: public static void Main(string[] args)
006: {
007: Console.WriteLine("Hello, World!");
008: Console.WriteLine("You entered the following {0} command line arguments:", args.Length );
009: for (int i=0; i < args.Length; i++)
010: {
011: Console.WriteLine("{0}", args[i]);
012: }
013: }
014: }
可以看到,字符串数组args指的就是输入的参数.因为它是String类,所以都有Length方法,所以可以有args.length来访问它的长度.然后用一个for循环来把它们显示出来.至于循环这些东西,大都沿用了C的语法.
例四,如果要一个返回值,那么可以像下面这样写,用return:
000: // HelloWorld\Hello4.cs
001: using System;
002:
003: public class Hello4
004: {
005: public static int Main(string[] args)
006: {
007: Console.WriteLine("Hello, World!");
008: return 0;
009: }
010: }
很简单吧!呵呵!对懂C或JAVA的人来说,比较好看懂,如果是VB或VBS的使用者,就有一些困难了.呆呵!
好了,看完了简单的例子,让我们来进入下一课吧!
好了,I COME BACK,下面的代码显示了我们如何打印多个参数:
000: // CommandLine\cmdline1.cs
001: using System;
002:
003: public class CommandLine
004: {
005: public static void Main(string[] args)
006: {
007: Console.WriteLine("Number of command line parameters = {0}", args.Length);
008: for(int i = 0; i < args.Length; i++)
009: {
010: Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]);
011: }
012: }
013: }
如果你的输入为:
cmdline1 A B C
那么它的输出为:
Number of command line parameters = 3
Arg[0] = [A]
Arg[1] = [B]
Arg[2] = [C]
哈哈,看出了其中的秘密了吧!是的{0}是一个标记,它告诉系统,这里留下了给第0个参数用,在程序中,这第0个参数就是i.因此,打印出来的就是Arg[0],面不是Arg[{0}]了,哈哈!
例二向大家展示了foreach这个语句的用法,其实在ASP中,这个经常用到:
000: // CommandLine\cmdline2.cs
001: using System;
002:
003: public class CommandLine2
004: {
005: public static void Main(string[] args)
006: {
007: Console.WriteLine("Number of command line parameters = {0}", args.Length);
008: foreach(string s in args)
009: {
010: Console.WriteLine(s);
011: }
012: }
013: }
很显然,args是一个数组,而且是字符型的.foreach的意思就是把其中的所有元素都循环完.运行得出:
>cmdline2 John Paul Mary
Number of command line parameters = 3
John
Paul
Mary
好了,同志们,休息一下,我要睡觉了!88,下次再见!


--------------------------------------------------------------------------------

终于又到一个白天了,起床,伸个懒腰,又坐到了电脑前面.今天我要向大家讲的是C#的数组(Arrays).C#中的数组和其它一些优秀的语言一样,也是从0开始计的,这从我们以前的例子里可以看出来,也就是说,一个数组的第一个元素是a[0],而不是像VB的a(1).虽然是这样,但是你还是要注意一些区别.
在声明一个数组的时候,方括号必须跟在类型后面,而不能跟在变量名后面,如:
int[] table; //不能写成int table[]
这一点显然与JAVA是不同的,在JAVA中这样是可以的.
还有就是在C#中你可以不指定数组的大小,这与C语言是不一样的.这使得你可以指定任意长度的数组,如下:
int[] numbers; // 它的长度是任意的
当然,你也可以指定它的大小:
int[10] numbers;//指定了一个长度为10的数组.
在C#中,支持的数组包括:单维数组,多维数组和多重数组.它们的声明方法如下:
单维数组:
int[] numbers;
多维数组:
string[,] names;
多重数组:
byte[][] scores;
声明一个数组并不代表已经建立了它.在C#中,所有的数组元素都是对象(倒!怎么跟JAVA说得一样&*%$#@),所以在建立它之前,首先要将它实例化:
单维数组:
int[] numbers = new int[5];
多维数组:
string[,] names = new string[5,4];
多重数组:
byte[][] scores = new byte[5][];
for (int x = 0; x < scores.Length; x++)
{
scores[x] = new byte[4];
}
呵呵,这有点奇怪吧,先不用理它,以后再说.
我们同样可以建立更大的数组,比如一个三维数组:
int[,,] buttons = new int[4,5,3];
我们甚至可以混合多维数组和多重数组,下面的例子说明了这些:
int[][,,][,] numbers;
下面的例子展示了以上所有构建数组的方法:
000: // Arrays\arrays.cs
001: using System;
002: class DeclareArraysSample
003: {
004: public static void Main()
005: {
006: // Single-dimensional array
007: int[] numbers = new int[5];
008:
009: // Multidimensional array
010: string[,] names = new string[5,4];
011:
012: // Array-of-arrays (jagged array)
013: byte[][] scores = new byte[5][];
014:
015: // Create the jagged array
016: for (int i = 0; i < scores.Length; i++)
017: {
018: scores[i] = new byte[i+3];
019: }
020:
021: // Print length of each row
022: for (int i = 0; i < scores.Length; i++)
023: {
024: Console.WriteLine("Length of row {0} is {1}", i, scores[i].Length);
025: }
026: }
027: }
它的输出是:
Length of row 0 is 3
Length of row 1 is 4
Length of row 2 is 5
Length of row 3 is 6
Length of row 4 is 7
在C#中数组的初始化可以在建立时就初始化,和JAVA和C一样,用的是{}.当然,很明显,你的初始化值必须与你声明的数组类型一样,比如你定义了一个int类型的,你就不能给它一个String,唉,JAVA看多了,在C#中,String应写为string,要不然,又要出错了.SUNWEN可能在后面的课程中出现这样的错误,还望大家指正.呵呵!
下面的例子说明了数组的初始化:
int[] numbers = new int[5] {1, 2, 3, 4, 5};
string[] names = new string[3] {"Matt", "Joanne", "Robert"};
你也可以省略数组的大小,如:
int[] numbers = new int[] {1, 2, 3, 4, 5};
string[] names = new string[] {"Matt", "Joanne", "Robert"};
你甚至可以省略new语名,如果你给了值:
int[] numbers = {1, 2, 3, 4, 5};
string[] names = {"Matt", "Joanne", "Robert"};
在C#中,数组的访问和C/C++/JAVA是一样的,下面的语句建立了一个数组,并将它的第五个元素赋值为5:
int[] numbers = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
numbers[4] = 5;
如果你没有C/JAVA/C++的编程经验,那么SUNWEN在此提醒,numbers[4]表示的是这个数组的第五个元素,因为我在前面已经说过了,数组是从0开始计的,所以0,1,2,3,4正好是第五个,所以....(台下:笨蛋,你以为我们不知道呀,快继续说!)
下面的例子是关于多维数组的:
int[,] numbers = { {1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10} };
numbers[1, 1] = 5;
再次注意,C#中的所有数组都是对象(faint,D版),所以,你可以用访问对象的方法,来访问数组.而System.Array就是数组的抽象.你可以参看文档来看Array类支持的方法.举个例子来说吧,你可以用length属性来访问数组的长度.如下例:
int[] numbers = {1, 2, 3, 4, 5};
int LengthOfNumbers = numbers.Length;
噢,好了,又完了一课,现在是北京时间上午9点16分,我要休息一下了!哈哈!待会见!


--------------------------------------------------------------------------------

C#中的属性
大家好,我是武汉华师的SUNWEN.呵呵,下午好不容易有了时间出去玩了,到了归元寺.门票十元,不算贵,SUNWEN照了好多像,用不了多久,就可以让大家看一看了.
闲话少说,让我们进入正题.这次我要向大家讲的是C#中的属性.属性是什么呢,比如说我是男的,男就是我的一人属性.我是一个大一的学生,大一也是我的一个属性.属性就是一个对象的性质.很简单吧,呵呵!下面,我给出两个例子,第一个例子出明了如何声明一个可以修改的属性,另一个例了建立了一个抽象的属性(Abstract),并且说明了如何在子类中丢弃它.好,下面让我们开始吧.
例子一:
000: // Properties\person.cs
001: using System;
002: class Person
003: {
004: private string myName ="N/A";
005: private int myAge = 0;
006:
007: // 声明一个字符型的属性Name
008: public string Name
009: {
010: get
011: {
012: return myName;
013: }
014: set
015: {
016: myName = value;
017: }
018: }
019:
020: // 声明一个int型的Age属性
021: public int Age
022: {
023: get
024: {
025: return myAge;
026: }
027: set
028: {
029: myAge = value;
030: }
031: }
032:
033: public override string ToString()
034: {
035: return "Name = " + Name + ", Age = " + Age;
036: }
037:
038: public static void Main()
039: {
040: Console.WriteLine("Simple Properties");
041:
042: // 建立一个Person的实例
043: Person person = new Person();
044:
045: //打印出它的属性
046: Console.WriteLine("Person details - {0}", person);
047:
048: // 对属性进行一些设置
049: person.Name = "Joe";
050: person.Age = 99;
051: Console.WriteLine("Person details - {0}", person);
052:
053: // 增加年龄
054: person.Age += 1;
055: Console.WriteLine("Person details - {0}", person);
056: }
057: }
这个例子的输出是:
Simple Properties
Person details - Name = N/A, Age = 0
Person details - Name = Joe, Age = 99
Person details - Name = Joe, Age = 100
好了,又起床了,昨天写到这,就跑到床上睡了,呵呵.现在是五一的第二天,看看我今天能写几篇,昨天写了二篇.
从上面的程序我们可以看出,一个类的属性的设置,借用了VB的概念,和JAVA中不尽相同了.(这就是M$,TMD!)有的朋友可能很奇怪,为什么我们可以用Console.WriteLine()来打印一个对象person呢.其实道理很简单,和在JAVA中的一样,当调节器用一个打印方法时,这个对象自动调用它的ToString()(在JAVA中是toString,TMD,又差点犯错!)方法.在33行,我们可以看到有这个方法的影子,override这个关键字大概就是覆盖父类的方法吧,这是不是有点多余?我们可以看到,一个对象的属性的设置是通过一个get()和set()组合来完成的,当然,还有一个value这个东东.补充一下,你还可以控制一个属性的读/写权限,只是把get()和set()简单地去掉就可以了,比如你不要写的属性,就不要set()就可以了,如果你不要读,就不要get()吧.总得感觉,C#在这点上没有JAVA来的灵活(完了,又要被盖痴打了!).
第二个例子:
这个例子说明了如何建立抽象的属性(Abstract),什么是抽象的属性呢,所谓的抽象的属性呢,就是....(唉,每次废话都这么多!FT) 一个抽象类并不提供执行属性存取程序,并且,他可以在子类中被忽略.下面的例子有三个文件,你要分别编译它们才能得到结果,它们是:
abstractshape.cs: Shape类,包含一个Area抽象属性
shapes.cs: Shape的子类
shapetest.cs: 显示程序.
要编译这些程序,运行:csc abstractshape.cs shapes.cs shapetest.cs就可以了.运行完之后,它会产生shapetest.exe这个可执行程序.
000: // Properties\abstractshape.cs
001: using System;
002:
003: public abstract class Shape
004: {
005: private string myId;
006:
007: public Shape(string s)
008: {
009: Id = s; // 这句调用了Id属性的set构建器
010: }
011:
012: public string Id
013: {
014: get
015: {
016: return myId;
017: }
018:
019: set
020: {
021: myId = value;
022: }
023: }
024:
025: public abstract double Area
026: {
027: get;
028: }
029:
030: public override string ToString()
031: {
032: return Id + " Area = " + double.Format(Area, "F");
033: }
034: }
看这个程序, 实际上非常地简单,当这个类对的对象被建立时,初始化部分为007-010,它把建立对象的参数s给了Id这个属性.然后进行了上一个例子的操作.实际上,我们可以把抽象属性与JAVA中的接口(Interface)相比,它们只提拱一个方法的名称,而不提供这个方法的内容.就像Area这个抽象属性,有一个get,但是它并没有指定get方法(也许它不能称之为方法)里的内容,即要get做什么事情. 这个事情,由它的子类来做.
第二个文件:在这个文件中,一个类覆盖了(override)了Area属性.
000: // Properties\shapes.cs
001: public class Square : Shape
002: {
003: private int mySide;
004:
005: public Square(int side, string id) : base(id)
006: {
007: mySide = side;
008: }
009:
010: public override double Area
011: {
012: get
013: {
014: return mySide * mySide;
015: }
016: }
017: }
018:
019: public class Circle : Shape
020: {
021: private int myRadius;
022:
023: public Circle(int radius, string id) : base(id)
024: {
025: myRadius = radius;
026: }
027:
028: public override double Area
029: {
030: get
031: {
032: return myRadius * myRadius * System.Math.PI;
033: }
034: }
035: }
036:
037: public class Rectangle : Shape
038: {
039: private int myWidth;
040: private int myHeight;
041:
042: public Rectangle(int width, int height, string id) : base(id)
043: {
044: myWidth = width;
045: myHeight = height;
046: }
047:
048: public override double Area
049: {
050: get
051: {
052: return myWidth * myHeight;
053: }
054: }
055: }
这个例子就有些让我们一头雾水了,:是干什么的,好象是继承,相当于JAVA中的extends吧.我想是的.我们先看一看吧.
下面的第三个文件就是一个测试文件了,很简单,大家看一看.
000: // Properties\shapetest.cs
001: public class TestClass
002: {
003: public static void Main()
004: {
005: Shape[] shapes =
006: {
007: new Square(5, "Square #1"),
008: new Circle(3, "Circle #1"),
009: new Rectangle( 4, 5, "Rectangle #1")
010: };
011:
012: System.Console.WriteLine("Shapes Collection");
013: foreach(Shape s in shapes)
014: {
015: System.Console.WriteLine(s);
016: }
017:
018: }
019: }
从这个例子上看,:这个符号的确是extends的意思,就是继承.继承是什么意思,说白了,就是生孩子的意思.比如下面一句sunwenson extends sunwen,这名就是说sunwenson这个类继承了sunwen,sunwenson这个类有sunwen类的所有东西,同时可以添加和删除sunwen中的一些东西.就这么简单,但是这是现代软件发展的一项重要技术,因为它可以使软件的重用性大大提高.唉,这些就只有大三大四的人说了,我就没资格了.呵呵.
这个程序的输出是:
Shapes Collection
Square #1 Area = 25.00
Circle #1 Area = 28.27
Rectangle #1 Area = 20.00
完了,这一节又完了.要理解这一节,有一定的难度, 特别对那些没有JAVA或C++编程经验的朋友.不过不要害怕,鼓起勇气学下去,一定会有所收获的. 我也要休息一下了,嘿嘿,早饭还没有吃呢!

[数据载入中...] [返回上一页] [打 印]