《C#初学者入门讲座_20031106.doc》由会员分享,可在线阅读,更多相关《C#初学者入门讲座_20031106.doc(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C#入门讲座记录主讲:FreeJet这次讲座目的主要是针对C#初学者。其重点解决入门时的一些理解上的困难,以帮助初学者能更好的入门,加快时间,减少些许痛苦。我将重点就语言的一些基本概念来给大家做些讲解,有不足之处请大家帮助指正。.NET是MS新一代分布式计算平台,包含五大主题:一、最底层是CLR,(最接近OS的部分)。有人会说CLR不就是JAVA的虚拟机么?你可以这么理解,但CLR和JVM是不同的。最大的不同在于,JVM是个解释器,也就是说他负责运行JAVA程序,而CLR是一个执行环境,但他并不具体执行。NET程序。CLR负责几个主要事务,1 编译已经翻译成MSIL的。NET程序。MSIL是中
2、间语言,CLR将MSIL编译成本地代码,理论上由OS或计算机执行,从这点来看CLR和JVM是不同的。CLR的第二个任务是作为一个执行环境,来完成控制,比如垃圾回收,等等。二、在。NET的第二层,就是框架和系统服务,这就给。NET程序良好的编成环境,比如,大家看到的丰富的类库等等。三、第三层是应用服务框架,比如,IIS,SQLSERVER等等。四、第四层是支持我们程序的具体的宿主,比如IIS中的WEB服务支持等等。五、第五层是我们自己的程序代码,这是立足于我们自己的代码来看的层次。有关CLR和MSIL的问答问:CLR 将程序在本地编译,如果是其它操作系统呢?答:CLR必须驻留在运行。NET程序的
3、目标计算机上。我们在VS。NET里编译好的代码的形式是MSIL,MSIL 是中间语言不是机器语言,所以必须再次编译,才能运行。问:CLR能否驻留在其它操作系统上?答:CLR就是dotnet。你安装。NET的时候就已经安装运行环境了, CLR = Common Language Runtime。理论上,我们只需要CLR就能开发.NET程序。问:CLR就是个运行环境可以这么说吗?答:这样说不是很全面,不过也可以。问:就向以前的vb运行库一样是吗?答:不一样。VB6 or lower 的运行环境是解释环境,大家如果记得的话,应该知道,VB代码在5.0以前都是解释的。而不是编译,所以他比C+慢N倍,其
4、次他不具备CLR的基本功能,比如垃圾回收,等等。以上就.NET简单介绍一下。关于CLR,MSIL如果有兴趣我们可以另外单独讲解。那么,回到我们的主题上来:C#语言。就我看来C#语言中最根本的部分是关于类和对象。其余的大家都应该没有困难。C#中主要的部分是类,和对象,其他都不是很难。大家知道,在程序中,有几个地方可以存放数据的:寄存器 - 高速cache - 内存器- 硬盘。当程序运行的时候,可以存放程序的数据的有几个地方:寄存器 - 内存器(stack, heap, .) - 硬盘(stack: 栈 ,heap :堆)。关于寄存器,你是无法控制的,所以没必要提。硬盘是存放没有读入的或根据某些调
5、价交换出去的内容的,也没有必要提。我们就来看看内存中的情况。假设我有一个程序:public class test int afx = 0; const int abc = 0; public static void dtd() public void FTF() 然后有对这个类的实例化test tt = new test();那么这个tt实际上就存放在堆内存中。堆是这样一个东西:他的大小是整个可用的区域,(除栈和其他外),这个分配就自动在堆内产生一个地址,来容纳这个对象。|- | -| | -| -|我们现在讲栈,栈在数据结构中就有这个内容,是一种先近后出的结构,大家应该都知道,就不多说了。好
6、了,我们的准备知识都有了,现在就来讲C#中这个类和对象。首先,类 - 是一个概念 对象 - 是一个实际存在的东西。所谓概念,他是看不见,摸不着的东西。而对象是实际存在的东西,所以,类就好比一个模板,而只有按照这个模版实际生成一个实际的例子的时候,对象才能存在。这就是类和对象的关系。A. 现在就讲第一个要点。test tt = new text();在这里,tt 是什么呢?这是一个十分关键的问题。test tt 这一步申明一个test类型的引用,就是告诉CLR,请给我一块空间。new test();实际在堆内存中开辟一块区域存放新的test对象,并把地址放到tt里。test tt 这一步申明一个
7、test类型的引用就是告诉CLR,请给我一块空间 new test(); 实际在堆内存中开辟一块区域存放新的test对象,并把地址放到tt里。所以,tt是指向一个test类型对象区的一个。我再换个方式讲,test tt = new test();这个动作是实例化了一个test类型的对象,这个大家都没问题吧。那么 int t = 0; 这个动作申明了一个int 类型的变量并给一个0对吧。那么,我们都知道,其实 必须有个指针才能访问某个地址,所以 int t = 0; 中,t指向的空间里放了个0对不对?既然t指向的地址放了个0,那么tt指向的地址应该就放一个test类型的对象了?如果不是放的tes
8、t的对象那是什么呢?test tt 这一步申明一个test类型的引用就是告诉CLR,请给我一块空间 new test(); 实际在堆内存中开辟一块区域存放新的test对象,并把地址放到tt里。注:我刚才说 new test(); 实际在堆内存中开辟一块区域存放新的test对象,并把地址放到tt里 其实这个讲法不正确。应该是 new test(); 实际在堆内存中开辟一块区域存放新的test对象,并把对test对象的引用放如那个地址。这就说明了两个问题:1.纯正的C#没有pointer;2.C#中靠引用来代替指针引用是什么,就是一个序列好,我大胆的推测,在CLR内部会保留一分关于实际产生的某个对
9、象和这个引用号码之间的对照表。所以,大家就能理解了,为什么程序走出控制范围后CLR能自动清楚内存,因为他记录了一切。第一个要点总结:test tt 这一步申明一个test类型的引用就是告诉CLR,请给我一块空间 new test(); 实际在堆内存中开辟一块区域存放新的test对象,并把对test对象的引用放到tt里。引用可以这样理解:引用和被引用的对象的关系就等于电视机和遥控器的关系。引用的同意词就是 tt,大家现在在写程序的时候就应该有这样的感觉了,其实你在操作对象的时候,并不是直接操作对象,而是靠一个遥控器。所以 test t1 = new test(); test t2 = new t
10、est(); t1 = t2; 的后果就清楚了。B. 接下来,我们要讲 statck 和 静态存储空间,这是第二个要点。记得 new test(); 实际在堆内存中开辟一块区域存放新的test对象,并把对test对象的引用放到tt里。有了个new 就等于告诉CLR说要在堆上分配空间。那么C#里还可以有不用new的 int t = 0; 这个东西放在哪里呢?其实是放在stack中。所以,所有基本类型,都不用new,他们都能放在stack中。刚才说了第一个问题,就是关于我们实际上是如何操控对象的。请大家要记住那个例子,要理解代码的含义,这样就行了。还剩一点,就是类中的方法。请大家注意,对象中的方法
11、并不存放在为对象开设的堆内寸内,而是存放在叫做静态区域的地方,因为方法可以被所有本类的对象共享,常数是如此,类中的静态方法也是如此。道理是一样的,因为如果对每个对象分别要存放这样的方法,那是十分浪费空间的。举个例子:public class cls01 public void aa() public class cls02 : cls01 public override void aa() 如果在cls02中调用base.aa();只需要在静态存储区域寻找cls01的方法aa() 即可。而不是在实例化cls02的对象时候把cls02和其基类cls01的方法都放到堆内存中。此外,基本类型存放在s
12、tack中,请注意,基本类型在申明时候会自动给个初试值,而类不会。还记得test tt;的含义么?但如果是int t; 系统会给个初试值,这和java是一样的。最后还有一个问题,那就是,我们说对象存放在堆中,而基本类型则放在stack,而C#语言里只存在对象,这不是很矛盾么,其实你只要稍微想一下就能明白,C#语言里只存在对象是不正确的,比如静态方法中的变量等等,这就不会进heap而是去了stack。好了,第一个话题就此结束,重要的是要理解类和对象在内存中是如何表现的,也就是说系统是如何对待他们的,这关系到我们能如何来操作他们,也是妨碍初学者学习的第一个理解上的问题.这个问题,在普遍被认为是非常
13、好的C#学习书籍的 C# primer 里似乎也没有详细的讲解,倒是 thinking in java 做了比较详细的描述,大家理解我上述讲的东西,入门也就可以了。 关于以上内容的问答: 问:例子中的override是什么意思?答:override 是重载的意思。就是,他是在cls01 里面定义了的 ,我们要重新定义这个 aa的行为。public class cls02 : cls01 这说明cls02是继承 cls01的。你看 cls01有一个方法 aa,cls02重新定义 aa()。所以是 override。问:类似的还有其他命令吗?是应该称做命令吗?答:不是命令问:那它们的关系是怎样的呢
14、答:这是开发语言的规则。就是说,是 c# 语言的规则。他用 override来表示重载。比如说,class 是表示一个类,public protected private 分别表示这个方法或者属性是公开的,受保护的,私有的。namespace 则表示这是名称。 using 是引入你需要的名称空间 namespace,在 则是 import问:比如我在函数1里定义了a ,在函数2里调用函数1,并定义一个a,我们知道是可以的,为何在类的定义里不行了呢?答: 函数是 function。它是可以一层套一层的;而 class 则是面向对象的重要概念,比如一个人,不能人套人,只能是一个人。但是人都有一个方
15、法,比如喜欢,那么每个种类的人的喜欢都是不同,那么喜欢这个方法就有不同的定义。人,具体到每个人就是对象,每个对象可能会有不同的喜欢的方法。扯远了,只是让你们了解函数-类-对象方法。这些概念,是 OO的重要思想。oo就是面向对象,面向对象的基本思想是,假设世界所有的都是对象。我们这个世界每个东西都是 “ 对象“,都能归 “ 类”,每个对象都有属性:比如人有手、口、年龄,这些就是属性了。那么那些 读书,跑步,等就是方法了。方法是行为。属性是表示一个人的特征的。问:函数比喻为什么?答:函数,就是一段你规定好的规则。你投进去一个东西,会返回给你某种东西,按照你规定的游戏规则,它通常有传入值,和结果。
16、问:函数包含在方法里可以这么说否?答:不对,是两个概念。没有包含关系。你在讲方法的时候,通常都涉及 是某个对象的方法,类中包含函数、方法、属性、数据库 就是类的方法。对象是类的实例,比如中国人,是一个类,而 freejet则是中国人的一个对象,一个具体的对象。比如firework里有个元件的概念,一个元件可以在多个地方用。类是个概念, 而对象是根据这个类产生的实际的东西。问:这些对象是封装在类里面吗?答:不能用封装来说明类和对象的关系,对象就是类的实例好,我们讲下一个主要难点我想讲这个话题最好的方式就是我们大家一起来构造一个类。现在我们有个任务,需要做个小程序:功能很简单,就是一个客户向ATM
17、提交帐户情况,然后可以查询帐户,仅此而已,我们要完成的是帐户部分,用户部分已经完成。我们按照概念来,我们知道类,有两大部分,一个是公共部分,一个是私有部分。这个意义很明显。我们先来定义公共部分。公共部分又有公共属性和公共方法,公共属性+公共方法就构成了一个类的公共接口,也就是其他类或对象可以调用的部分。1、公共属性 = 就是类所需要的数据;2、公共方法 = 你能要求类或类的对象来完成的工作。我们先从属性开始:大家都有用银行卡的经验,一个帐户,基本上应该记载这个帐户什么数据呢?用户名和密码、帐号、余额。好了,我们总结一下我们的假设中,帐户包含:string accountNo; / 帐号doub
18、le balance; / 余额我们的帐户还必须实现一个查询的方法public void QueryAccount() 大家现在可以写出这个类了:public class Account public string AccountNo; public double Balance; public void QueryAccount() 然后我们按照C#的规矩,再写一次:public class Acc这是个类,这个类与任何人的帐户相关么?好象没关系。他就表示一个帐户,而不是表示具体某个帐户。现在 A 先生来了,他实例化了他的帐户, 然后 B 先生也这样干了,于是系统中共有两个实际的帐户对象在运
19、行。Account SirAAccount = new Account();Account SirBAccount = new Account();SriAAccount 和 SirBAccount 与 Account的关系清楚了么?是类的实例。好了,我们来继续完成它:public class Account private string accountNo; public string AccountNo get set private double balance; public double Balance get; set public void QueryAccount() Cons
20、ole.WriteLine(帐户号: + this.accountNo); Console.WriteLine(余 额: + this.balance.ToString(); 现在,A 先生可以查询他的帐户了SirAAccount.QueryAccount();就会输出他帐户的情况。大家可能会觉得不够,因为我们的假设中没有给出帐户的数据是如何来的,那我们现在就来实现它。public class Account private string accountNo; public string AccountNo get set private double balance; public doub
21、le Balance get; set public void QueryAccount() Console.WriteLine(帐户号: + this.accountNo); Console.WriteLine(余 额: + this.balance.ToString(); private void GetAccountData() 接着,进一步修改后,类就成了这样子:public class Account private string accountNo; public string AccountNo get set private double balance; public dou
22、ble Balance get; set public void QueryAccount() Console.WriteLine(帐户号: + this.accountNo); Console.WriteLine(余 额: + this.balance.ToString(); public Account(string uiprivate void GetAccountData(string userId, string password) public Account(string uid, string psd) this.GetAccountData(uid, psd); 我添加了一个
23、私有方法用于从数据库获取该帐户的数据,并在构造方法中调用,也就是用户如果实例化这个类时,会要求输入用户名和密码,然后就取出他的帐户情况。同时,我希望告诉大家一个观点,我为什么不一次性写出所有代码,难道只是为了演示么?无论你现在写代码水平如何,我希望大家要记住,任何程序设计都是一个演化的过程,是逐步求精的过程。总结一下,类和对象这个话题1. 类和对象的关系2. 如何一步一步构造简单的类3. 类的两大部分 私有+公有(属性+方法)4. 类的共有部分构成了类的接口(也就是类的职责)5. 实例化后的对象于类实际上大家可以看出,在定义好公有部分后,私有部分其实是很自然的事情。以上为本次讲座的技术内容。附
24、录:贵宾MVP, 站长,.net技术方面的专家 wyhw讲话:我们正在努力为提高 的服务。 = = 中国.net论坛,中国Dotnet俱乐部,中国asp联盟,这是我们最早为大家知道的名号。我们推出的dotnet学习网,是中国最早的。你如果在 搜索 dotnet ,你将可以看到我们在前列。而且最令人兴奋的,我们完全是一个义务,志愿的网站。不用做广告,我们没有赢利目的。我和我们的朋友坚持了3年,现在的会员积累到58000将近了。现在,我们有了远大的目标:就是未来 的 CPC 项目。你们看到 CPC_ 这个是我们未来的项目的简称。请听完对CPC项目的介绍,这是个令人兴奋的项目。我们在明年将推出 。我
25、们将会有多个网站 整合到 cpc:1、 for CPC 这是负责 BLOG的2、 for CPC 这是负责 download3、www.opensources for CPC 这是负责 Open Source4、 for CPC 这是负责 Web Service这是一个很大系统,我们正在努力工作,以便 能未来能作为中国程序开发的催化剂。如果大家能有时间,并有浓厚的兴趣,欢迎你们来支持。我们团队目前已经有14人,我们当然需要更多的热心的人加入。但是我们也要考虑很多团队组织问题。大家都是初学者,要知道,在程序界,永远没有高手,只有初学者。也许你懂得了很多,但是你还是必须不断学习,所以你还是初学者。我们非常欢迎大家的加入,我们将关注那些在论坛活跃的朋友。这样,我们会有人和论坛活跃的朋友联系,以便能够了解你和我们的想法是否一致。我们将组织人力来做这个事情,但是,显然,我们会很忙,因为我们还有固定的工作(为生计)。支持cpc 支持 等于为自己创造一个良好的学习环境和交流空间,每个人都可以帮助和被帮助,请大家空余时间,也帮助论坛活跃版面,文章,问题,思想,经验都可以。所以,如果有不到的地方,请包涵。谢谢大家的支持。我们将首先在 论坛成为朋友,然后我们将在 CPC 成为朋友。CPC是一个延续的主题,CPC建成后还需要更多的demo小组来开发demo项目, 所以,大家都可以来参加
限制150内