[分享] 零起点学习C#--小猫自学笔记
<p>我的水平:只会vlisp开发,外加一点点VBA的水平.Visual studio 从来没用过.C#一点概念也没有.....</p><p>5年前学过一阵子C语言,当时也没学会(数组都不会写),现在已经忘的差不多了.</p><p>可能有些想学习C#的朋友和我的水平差不多,我在这里写个人的零起点C#学习笔记,</p><p>为了鞭励自己,也和各位分享我的学习方法,(学习么,就是痛并快乐着.....),</p><p>文中必然错误连篇,希望各位C#高手不吝指点,小猫我感激不尽.</p><p>下文会不定期更新,我用的是VS2005 VS2008 + MSDN(可以到迅雷里面搜索下载)</p> <p>Lisp版的小猫是精彩,C#版的小猫会同样精彩:)</p><p>实际上都是这样走过来的,翻翻以前的帖子</p><p>有很多是菜鸟lzh和菜鸟ahlzl的帖子:)</p><p>期待<strong><font face="Verdana" color="#61b713">nonsmall</font></strong>的精彩好文</p> <p>咱们先学习C#基础 然后再学AUTOCAD的二次开发.</p><p>注:下面的个人理解未必正确,是辅助我学习的一种办法,以后都会慢慢清楚的.</p><p>安装好VS+MSDN之后,第一次开启VS会选择开发模板,选择C# 进入.</p><p>[文件]-[新建]-[项目] 的[控制台应用程序].</p><p>VS2008下 会出现下面的代码:</p><p>using System;<br/>using System.Collections.Generic;<br/>using System.Linq;<br/>using System.Text;</p><p>namespace Study<br/>{<br/> class Program<br/> {<br/> static void Main(string[] args)<br/> {</p><p> }<br/> }<br/>}<br/></p><p>(我感觉C#的语法很像C,里面的概念又有VB的.)</p><p>using是什么呢? 我要查帮助,点[帮助],再点[动态帮助],右面就有一个帮助页面,</p><p>我点一下using代码,右面就出现了using的帮助.</p><p>using的说明如下:</p><li><p>作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。请参见 <link tabindex="0" keywords="B42B8E61-5E7E-439C-BB71-370094B44AE8">using 指令</link>。</p></li><li><p>作为语句,用于定义一个范围,在此范围的末尾将释放对象。请参见 <link tabindex="0" keywords="AFC355E6-F0B9-4240-94DD-0D93F17D9FC3">using 语句</link>。</p></li><p>根据里面的说明,这里就是 using 指令 :</p><p>允许在命名空间中使用类型,这样,您就不必在该命名空间中限定某个类型的使用.</p><p></p><p>什么是命名空间?</p>大多数 C# 应用程序从一个 using 指令节开始。该节列出应用程序将会频繁使用的命名空间,避免程序员在每次使用其中包含的方法时都要指定完全限定的名称。<p>我的理解: 暂时认为类似分开的几个.lsp文件用(load ...)函数引入吧.</p><p>system 先不管了,应该是引用系统的类,回头再研究.</p><p>namespace 刚才的帮助里面也说了,是定义一个命名空间,</p><p>Class 是定义类 ,类其实就是 函数的载体,只是使用时需要初始化而已.感觉在lisp-VBA里面我们用的 "方法" 就是类生成的.</p><p>static 是静态定义函数,这个可以看看帮助,里面说的内容不大理解,先放着(既然有静态应该就有动态吧?).</p><p>void 叫无返回值 相当于(princ)的作用</p><p>Main 是定义主函数(程序入口) 就像Lisp里面C:定义函数</p><p><font color="#ff0000">string[] args 应该是函数 至于为什么这么写我没查到,哪位高人给讲讲?</font></p> <p>C#里只有类,这一点和VB、C都不太一样</p><p>所谓类,即定义一个抽象的概念,比如人类people</p><p><font face="Verdana" color="#61b713"><strong>nonsmall</strong></font>是people的一个实例,lzh同样也是</p><p>我们有不同的习惯,必须调用不同的方法</p><p>必须这样调用</p><p>nonsmall.DoIt();</p><p>但我们有共同的东东,比如都在地球上,使用静态属性或方法描述他</p><p>people.Location = "earth";</p><p><font color="#ff0000">string[] args 声明数组,Main函数的形参</font></p> 本帖最后由 作者 于 2009-6-25 9:41:31 编辑以下是引用lzh741206在2009-6-24 21:13:00的发言:
Lisp版的小猫是精彩,C#版的小猫会同样精彩:)
实际上都是这样走过来的,翻翻以前的帖子
有很多是菜鸟lzh和菜鸟ahlzl的帖子:)
期待nonsmall的精彩好文
谢谢lzh741206大版主的支持,我相信只要坚持+方法就能学好!
大家要准备一本 <<C#入门经典(第三版).pdf>> 做为自学入门材料.我现在正在看这个.
其他的除了C# 开发 AutoCAD很少之外,C#方面的书籍是很多的.
--------------------------------------
我们开始在Main 函数里面加代码!
c# 对大小写敏感 一定要注意 而且经常后面要加个分号,从Lisp转过来还得适应.
因为在建立项目的时候我建立的名称是Study 所以命名空间是Study , 默认应该是ConsoleApplication1
这个无所谓
namespace Study
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("加油,你一定能学好C#!");
Console.ReadKey();
}
}
}
console 是控制台, 第一句是输出文字,第二行是等待按键输入.
我们按F5运行看结果 然后按任意键退出
好 第一个C#程序已经写好并且运行了!!
按照书中讲的内容看一下其他的部分,前两章我们就可以Pass了.
C#的书倒是买了两三本。
关于C#的电子书确实也比其CAD二次开发的多N多。
有了nonsmall一起加入C#,太好了。
向你学习。
昨天找到了一个C#在线教程Visual C# 2008 宝典
我觉得还可以,推荐给大家。
之前是看“楚广明的C#视频教程”(搜索一下verycd应该有的下载)
也可以上我的网盘上下载 http://carrot1983.ys168.com/4.电子书
CSharp.net
CSharp快速入门教材.rar 1,224KB 有人同伴感觉更有动力。。。
carrot1983发表于2009-6-25 8:57:00static/image/common/back.gifC#的书倒是买了两三本。关于C#的电子书确实也比其CAD二次开发的多N多。有了nonsmall一起加入C#,太好了。向你学习。昨天找到了一个C#在线教程Visual C# 2008 宝典 我觉得还可以
<p>有人同伴感觉更有动力。。。</p><p></p></div><p>哈哈 carrot 先行一步,我还得从基础的来.</p><p>今天学习变量规则和语法.定义方法如下:<br/><类型> <变量名>;<br/>这里和Lisp不同的是需要每个变量的使用都必须事先声明其类型然后使用.<br/>对于各种类,必须实例化(实例化我理解就是定义一个对象变量引用(初始化)类,然后才可以引用)<br/>(setq shell (vlax-create-object "Shell.Application"))<br/>类似这样的初始化才能使用shell对象.这个后面再详细学习.先从基础的开始.<br/>简单类型定义包括:<br/>sbyte byte short ushort int uint long ulong<br/>恩 相似的变量二进制位数相同 观察一下 后面的都是>= 0的<br/>还有float double decimal char bool string</p><p>字符串输出方法一是和Lisp一样的加\对应特殊的符号<br/>二是加个@</p><p>变量赋值直接是一个等号 = 等于用2个等号 ==<br/>类型定义可以连续定义<br/>int a, b;<br/>可以直接初始化<br/>int a = 1, b = 2;</p><p>运算符:<br/>+ - * / 求余% 加一++ 减一--</p><p>控制台输出变量方法:<br/>string a = "hh", b = "oo"; //定义和初始化<br/>Console.WriteLine("out {0} {1} .", a, b); //带参数输出<br/>Console.ReadKey(); //等待按键退出</p><p>组合简化运算:<br/>+= -= *= /= %=</p><p>另外<br/>int i = 1;<br/>int j;<br/>j = ++i;是先加后传递<br/>j = i++;是先传递后加</p><p>等于== 不等于!= 大于> 小于< 大于等于>= 小于等于<=<br/>非! (相当于Lisp的not函数)<br/>与& && (相当于 and 但是前面的区别?是可以进行二进制位运算)<br/>或| || (相当于 or)<br/>异或 ^ (xor)<br/>>> <<移位运算<br/>位运算大概二次开发很少用到,先了解,暂时不必细学.<br/>和等号组合简化: &= |= ^=<br/>运算符的优先级不用记,知道就行,以后慢慢学,自己写的可以多用括号.</p><p>goto函数 这个东西凡是教材都不推荐用,我感觉以后写小程序时应该会方便吧.</p><p>....<br/>goto over;<br/>(跳过的部分)....<br/>over:<br/>....</p><p>当然也可以向前跳.</p><p>if 语句和Lisp不同的是 简化了嵌套的if</p><p>(if a<br/> b<br/> (if c<br/> d<br/> e<br/> )<br/>)<br/>可能对应<br/>if (a)<br/> {<br/> b;<br/> }<br/> else if (c)<br/> {<br/> d;<br/> }<br/> else <br/> { <br/> e; <br/> }<br/>这样?<br/>switch 函数相当于(cond)<br/>里面要用Break;退出<br/>若想一个switch里面执行多行的<br/>就可用goto跳下去!</p><p><br/>循环包括 while, do while, for<br/>while 不说了 do while是先执行一次然后判断,for就代替了(repeat).<br/> for (int i = 1; i < 10; i++)<br/> {<br/> Console.WriteLine("1");<br/> }<br/>循环退出: Break直接退出 continue下一次循环开始 goto跳 return退出循环退出函数求值.</p><p>OK 上午先学这点 下午继续.这些东西记得有哪些即可 慢慢就熟悉了 不必死记.<br/></p> <p>类型转换:<br/>高位数转为低位数的需要写出来<br/>float a;<br/>(int) a;</p><p>还有一些就是用<br/>Convert类里面的ToDouble ToInt32 ToChar之类的进行转换</p><p>学习不要太紧张,轻松一下,Console类的帮助查看了一下,其中有一个成员是Beep,可以让电脑主板发声.<br/>我就根据前面学的已有知识尝试写个简单的发声的代码:<br/> while (true)<br/> {<br/> Console.Beep((Convert.ToInt32(Console.ReadLine()) + 40) * 50, 1);<br/> }<br/>每当输入一个数字然后敲回车之后,主板就会叫一声.音量不一样的.<br/>至于这个死循环的退出,和DOS一样,就是Ctrl+C退出(这个帮助里面的Console类的事件也写了)<br/>怎么才能按一个数字就发出一个声音?这个没研究出来.(那样就可以谈琴了 hoho).</p> <p>枚举:<br/>(就是特殊的一类数值用变量打成一个包)</p><p>enum haha { a = 1, b, c }; //要写在namespace外面</p><p> for (int i = 1; i <= 3 ; i++)<br/> {<br/> Console.WriteLine("{0}{1}{2}", haha.a, haha.b, haha.c);<br/> }<br/>恩?结果不是 123 而是 abc哦.<br/>看看帮助要求用显式转换才行<br/> for (int i = 1; i <= 3 ; i++)<br/> {<br/> Console.WriteLine("{0}{1}{2}", (int)haha.a, (int)haha.b, (int)haha.c);<br/> }<br/>OK!输出123</p><p>====================<br/>结构:<br/>这个看起来应该是把不同类型的数据打成一个包.(如年龄 身高 体重 性别 婚否....)</p><p>结构具有以下特点:</p><p>结构是值类型,而类是引用类型。</p><p>向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。</p><p>与类不同,结构的实例化可以不使用 new 运算符。</p><p>结构可以声明构造函数?,但它们必须带参数。</p><p>一个结构不能从另一个结构或类继承,而且不能作为一个类的基?。所有结构都直接继承自 </p><p>System.ValueType,后者继承自 System.Object。</p><p>结构可以实现接口?。</p><p>在结构中初始化实例字段?是错误的。</p><p>其中有几句不大理解.没关系 先学会模仿着使用基本的^_^<br/>为了让外面访问,定义结构体需要用Public关键字</p><p>struct hehe//这段还是要写在外面<br/>{<br/> public haha ha;<br/> public int num;<br/>}</p><p> hehe tmp;//实例化<br/> tmp.ha = haha.a;//按类型赋值<br/> tmp.num = 5;<br/> Console.WriteLine("{0}-{1}", (int)tmp.ha, tmp.num);//输出<br/>输出结果:1-5<br/>(恩 学东西的时候,尽量自己改个字母啊 类型啊什么的,最好不要完全照书写,这样印象会深刻.)<br/>(另外书上的定义尽量让自己找个方式理解,如果实在理解不上去再背好了...加菲猫的名言是:当你无</p><p>法打败你的敌人时,就加入他们!(从内部攻克hoho))</p><p>====================<br/>数组:<br/>这个东西和Lisp里面的表特别像,但是没有表那样自由.<br/>数组类型从类型 System.Array 继承而来。</p><p>====================<br/>又一个system.<br/>这个system里面都有什么呢?帮助一下...system命名空间<br/>东西好多.....咦 里面有一个Random类 用于生成随机数的 偷偷研究一下^_^<br/>帮助写的真麻烦,百度一个<br/>public static string GetRandomNum()<br/> {<br/> Random seed = new Random();<br/> Random randomNum = new Random(seed.Next());</p><p> return randomNum.Next().ToString();<br/> }</p><p>这个看起来简单些<br/>再看看帮助里面关于next的 恩 还有个NextDouble 成员<br/>尝试改一改看看:<br/>public static double GetRandomNum()<br/> {<br/> Random seed = new Random();<br/> return seed.NextDouble();<br/> }<br/>这回多简单<br/>每次调用都有不同的随机值了<br/>for (int i = 1; i < 20; i++)<br/> {<br/> Console.WriteLine("{0}", GetRandomNum());<br/> }<br/>返回值都一样?看看帮助里面有个Thread.Sleep( 1 );<br/>可能和这个有关?<br/>加进去无效,错误 1 当前上下文中不存在名称“Thread”<br/>哦 前面还要加个引用using System.Threading;<br/>试试看看<br/>OK 即时生成20个不同的随机数,我现在会用C#生成随机数了!(可以写个双色球选号器了^_^)<br/>(如果MSDN看不清楚,就去百度一下好了....同时不要拿来主义,自己一定要尽量改改)</p><p>=====================<br/>跑题了,回来接着学习数组.</p><p> int[] MyArray = { 1, 2, 3 };<br/> for (int i = 1; i <= 3; i++) <br/> {<br/> Console.WriteLine("{0}", MyArray);<br/> }<br/>错误 下标是从0开始的...<br/> for (int j = 0; j < MyArray.Length; j++) <br/> {<br/> Console.WriteLine("{0}", MyArray);<br/> }<br/>OK 输出 1 2 3<br/><font color="#ff0000">int[] MyArray = new int{1, 2, 3 };;//这段按照书上写的为什么错误呢?<br/></font></p> <p>int[] MyArray = new int{ 1, 2, 3 };<br/>汗 这样就行了 原来里面的3是真正的数组个数.<br/>好 自己尝试写个赋值的代码<br/> for (int j = 0; j < MyArray.Length; j++)<br/> {<br/> MyArray = j + 10;<br/> }<br/>OK<br/>既然和表类似 那就自己尝试写一个数组元素替换的小函数试试<br/>(当然这段可以直接写成MyArray = 99;我只是练练手)<br/> public int[] ChangeArrayItem (int [] MyArray, int NewItem , int ChangeNum)//要改</p><p>变的数组 要替换的内容 要替换的项<br/> {<br/> int[] NewArray = new int;<br/> for (int i = 0; i < MyArray.Length; i++)<br/> {<br/> if (i == ChangeNum)//这里第一次调试失败又写成了单个等号.....要注意啊<br/> {<br/> NewArray = NewItem;<br/> }<br/> else<br/> {<br/> NewArray = MyArray; <br/> }<br/> }<br/> return NewArray;<br/> }</p><p>哈哈~~O(∩_∩)O自己写的第一个C#函数使用成功<br/>MyArray = ChangeArrayItem(MyArray, 99, 1);<br/> for (int j = 0; j < MyArray.Length; j++)<br/> {<br/> Console.WriteLine("{0}", MyArray);<br/> }<br/>结果10 99 12<br/>这样的话我就可以按照Lisp操作表那样对付数组了(类似这样的数组处理函数不知道有没有 反正在</p><p>Array类的成员里面没看到什么实用的)</p><p>foreach 函数可以循环这个数组 试一下:<br/> foreach (int j in MyArray)<br/> {<br/> Console.WriteLine("{0}", j);<br/> }<br/>但这个不可以赋值.</p><p>---------------------<br/>多维数组:<br/>double[][] pts =new double [] { new double { 0, 1 },new double { 2, 3 },new </p><p>double { 4, 5 } };<br/>写的好麻烦.<br/> foreach (double[] pt in pts)<br/> {<br/> foreach (double n in pt) <br/> {<br/> Console.WriteLine("{0}", n);<br/> }<br/> }<br/>可变数组的定义<br/> double[][] pts ;<br/> pts = new double [] ;<br/> pts = new double { 0, 1 };<br/> pts = new double { 10, 11 ,12};<br/> pts = new double { 110, 111 ,112 ,113};<br/>OK 今天下午就先学到这里. 20090625<br/></p>