明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 13728|回复: 35

[基础] [分享] 零起点学习C#--小猫自学笔记

  [复制链接]
发表于 2009-6-24 20:23 | 显示全部楼层 |阅读模式

我的水平:只会vlisp开发,外加一点点VBA的水平.Visual studio 从来没用过.C#一点概念也没有.....

5年前学过一阵子C语言,当时也没学会(数组都不会写),现在已经忘的差不多了.

可能有些想学习C#的朋友和我的水平差不多,我在这里写个人的零起点C#学习笔记,

为了鞭励自己,也和各位分享我的学习方法,(学习么,就是痛并快乐着.....),

文中必然错误连篇,希望各位C#高手不吝指点,小猫我感激不尽.

下文会不定期更新,我用的是VS2005 VS2008 + MSDN(可以到迅雷里面搜索下载)

评分

参与人数 1威望 +1 明经币 +5 金钱 +10 贡献 +5 激情 +5 收起 理由
雪山飞狐_lzh + 1 + 5 + 10 + 5 + 5 【好评】好文章

查看全部评分

发表于 2009-6-24 21:13 | 显示全部楼层

Lisp版的小猫是精彩,C#版的小猫会同样精彩:)

实际上都是这样走过来的,翻翻以前的帖子

有很多是菜鸟lzh和菜鸟ahlzl的帖子:)

期待nonsmall的精彩好文

 楼主| 发表于 2009-6-24 21:16 | 显示全部楼层

咱们先学习C#基础 然后再学AUTOCAD的二次开发.

注:下面的个人理解未必正确,是辅助我学习的一种办法,以后都会慢慢清楚的.

安装好VS+MSDN之后,第一次开启VS会选择开发模板,选择C# 进入.

[文件]-[新建]-[项目]  [Visual C#]的[控制台应用程序].

VS2008下 会出现下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Study
{
    class Program
    {
        static void Main(string[] args)
        {

        }
    }
}

(我感觉C#的语法很像C,里面的概念又有VB的.)

using是什么呢? 我要查帮助,点[帮助],再点[动态帮助],右面就有一个帮助页面,

我点一下using代码,右面就出现了using的帮助.

using的说明如下:

  • 作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。请参见 using 指令。

  • 作为语句,用于定义一个范围,在此范围的末尾将释放对象。请参见 using 语句。

  • 根据里面的说明,这里就是 using 指令 :

    允许在命名空间中使用类型,这样,您就不必在该命名空间中限定某个类型的使用.

    什么是命名空间?

    大多数 C# 应用程序从一个 using 指令节开始。该节列出应用程序将会频繁使用的命名空间,避免程序员在每次使用其中包含的方法时都要指定完全限定的名称。

    我的理解:  暂时认为类似分开的几个.lsp文件用(load ...)函数引入吧.

    system 先不管了,应该是引用系统的类,回头再研究.

    namespace 刚才的帮助里面也说了,是定义一个命名空间,

    Class 是定义类 ,类其实就是 函数的载体,只是使用时需要初始化而已.感觉在lisp-VBA里面我们用的 "方法" 就是类生成的.

    static 是静态定义函数,这个可以看看帮助,里面说的内容不大理解,先放着(既然有静态应该就有动态吧?).

    void 叫无返回值 相当于(princ)的作用

    Main 是定义主函数(程序入口) 就像Lisp里面C:定义函数

    string[] args 应该是函数 至于为什么这么写我没查到,哪位高人给讲讲?

    发表于 2009-6-24 21:36 | 显示全部楼层

    C#里只有类,这一点和VB、C都不太一样

    所谓类,即定义一个抽象的概念,比如人类people

    nonsmall是people的一个实例,lzh同样也是

    我们有不同的习惯,必须调用不同的方法

    必须这样调用

    nonsmall.DoIt();

    但我们有共同的东东,比如都在地球上,使用静态属性或方法描述他

    people.Location = "earth";

    string[] args 声明数组,Main函数的形参

     楼主| 发表于 2009-6-24 22:09 | 显示全部楼层
    本帖最后由 作者 于 2009-6-25 9:41:31 编辑
    1. 以下是引用lzh741206在2009-6-24 21:13:00的发言:
    2. Lisp版的小猫是精彩,C#版的小猫会同样精彩:)
    3. 实际上都是这样走过来的,翻翻以前的帖子
    4. 有很多是菜鸟lzh和菜鸟ahlzl的帖子:)
    5. 期待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了.

    发表于 2009-6-25 08:57 | 显示全部楼层
    C#的书倒是买了两三本。
    关于C#的电子书确实也比其CAD二次开发的多N多。
    有了nonsmall一起加入C#,太好了。
    向你学习。
    昨天找到了一个C#在线教程[url=http://www.ameng.org/]Visual C# 2008 宝典[/URL]   
    我觉得还可以,推荐给大家。
    之前是看“楚广明的C#视频教程”(搜索一下verycd应该有的下载)
    也可以上我的网盘上下载 http://carrot1983.ys168.com/
    1. 4.电子书
    2. CSharp.net
    3. CSharp快速入门教材.rar 1,224KB [C#]
    复制代码
    有人同伴感觉更有动力。。。

     楼主| 发表于 2009-6-25 10:47 | 显示全部楼层
    carrot1983发表于2009-6-25 8:57:00C#的书倒是买了两三本。关于C#的电子书确实也比其CAD二次开发的多N多。有了nonsmall一起加入C#,太好了。向你学习。昨天找到了一个C#在线教程Visual C# 2008 宝典   我觉得还可以

    有人同伴感觉更有动力。。。

    哈哈 carrot 先行一步,我还得从基础的来.

    今天学习变量规则和语法.定义方法如下:
    <类型> <变量名>;
    这里和Lisp不同的是需要每个变量的使用都必须事先声明其类型然后使用.
    对于各种类,必须实例化(实例化我理解就是定义一个对象变量引用(初始化)类,然后才可以引用)
    (setq shell (vlax-create-object "Shell.Application"))
    类似这样的初始化才能使用shell对象.这个后面再详细学习.先从基础的开始.
    简单类型定义包括:
    sbyte byte short ushort int uint long ulong
    恩 相似的变量二进制位数相同 观察一下 后面的都是>= 0的
    还有float double decimal char bool string

    字符串输出方法一是和Lisp一样的加\对应特殊的符号
    二是加个@

    变量赋值直接是一个等号 = 等于用2个等号 ==
    类型定义可以连续定义
    int a, b;
    可以直接初始化
    int a = 1, b = 2;

    运算符:
    + - * / 求余%  加一++ 减一--

    控制台输出变量方法:
    string a = "hh", b = "oo"; //定义和初始化
    Console.WriteLine("out {0} {1} .", a, b); //带参数输出
    Console.ReadKey(); //等待按键退出

    组合简化运算:
    += -= *= /= %=

    另外
    int i = 1;
    int j;
    j = ++i;是先加后传递
    j = i++;是先传递后加

    等于== 不等于!= 大于> 小于< 大于等于>= 小于等于<=
    非! (相当于Lisp的not函数)
    与& && (相当于 and 但是前面的区别?是可以进行二进制位运算)
    或| || (相当于 or)
    异或 ^ (xor)
    >> <<移位运算
    位运算大概二次开发很少用到,先了解,暂时不必细学.
    和等号组合简化: &= |= ^=
    运算符的优先级不用记,知道就行,以后慢慢学,自己写的可以多用括号.

    goto函数 这个东西凡是教材都不推荐用,我感觉以后写小程序时应该会方便吧.

    ....
    goto over;
    (跳过的部分)....
    over:
    ....

    当然也可以向前跳.

    if 语句和Lisp不同的是 简化了嵌套的if

    (if a
     b
     (if c
      d
      e
     )
    )
    可能对应
    if (a)
                {
                    b;
                }
                    else if (c)
                    {
                        d;
                    }
                        else
                        {
                            e;
                        }
    这样?
    switch 函数相当于(cond)
    里面要用Break;退出
    若想一个switch里面执行多行的
    就可用goto跳下去!


    循环包括 while, do while, for
    while 不说了 do while是先执行一次然后判断,for就代替了(repeat).
     for (int i = 1; i < 10; i++)
                {
                    Console.WriteLine("1");
                }
    循环退出: Break直接退出 continue下一次循环开始 goto跳 return退出循环退出函数求值.

    OK 上午先学这点 下午继续.这些东西记得有哪些即可 慢慢就熟悉了 不必死记.

     楼主| 发表于 2009-6-25 12:59 | 显示全部楼层

    类型转换:
    高位数转为低位数的需要写出来
    float a;
    (int) a;

    还有一些就是用
    Convert类里面的ToDouble ToInt32 ToChar之类的进行转换

    学习不要太紧张,轻松一下,Console类的帮助查看了一下,其中有一个成员是Beep,可以让电脑主板发声.
    我就根据前面学的已有知识尝试写个简单的发声的代码:
     while (true)
                {
                    Console.Beep((Convert.ToInt32(Console.ReadLine()) + 40) * 50, 1);
                }
    每当输入一个数字然后敲回车之后,主板就会叫一声.音量不一样的.
    至于这个死循环的退出,和DOS一样,就是Ctrl+C退出(这个帮助里面的Console类的事件也写了)
    怎么才能按一个数字就发出一个声音?这个没研究出来.(那样就可以谈琴了 hoho).

     楼主| 发表于 2009-6-25 16:16 | 显示全部楼层

    枚举:
    (就是特殊的一类数值用变量打成一个包)

    enum haha { a = 1, b, c }; //要写在namespace外面

     for (int i = 1; i <= 3 ; i++)
                {
                    Console.WriteLine("{0}{1}{2}", haha.a, haha.b, haha.c);
                }
    恩?结果不是 123 而是 abc哦.
    看看帮助要求用显式转换才行
     for (int i = 1; i <= 3 ; i++)
                {
                    Console.WriteLine("{0}{1}{2}", (int)haha.a, (int)haha.b, (int)haha.c);
                }
    OK!输出123

    ====================
    结构:
    这个看起来应该是把不同类型的数据打成一个包.(如年龄 身高 体重 性别 婚否....)

    结构具有以下特点:

    结构是值类型,而类是引用类型。

    向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。

    与类不同,结构的实例化可以不使用 new 运算符。

    结构可以声明构造函数?,但它们必须带参数。

    一个结构不能从另一个结构或类继承,而且不能作为一个类的基?。所有结构都直接继承自

    System.ValueType,后者继承自 System.Object。

    结构可以实现接口?。

    在结构中初始化实例字段?是错误的。

    其中有几句不大理解.没关系 先学会模仿着使用基本的^_^
    为了让外面访问,定义结构体需要用Public关键字

    struct hehe//这段还是要写在外面
    {
        public haha ha;
        public int num;
    }

         hehe tmp;//实例化
                tmp.ha = haha.a;//按类型赋值
                tmp.num = 5;
                Console.WriteLine("{0}-{1}", (int)tmp.ha, tmp.num);//输出
    输出结果:1-5
    (恩 学东西的时候,尽量自己改个字母啊 类型啊什么的,最好不要完全照书写,这样印象会深刻.)
    (另外书上的定义尽量让自己找个方式理解,如果实在理解不上去再背好了...加菲猫的名言是:当你无

    法打败你的敌人时,就加入他们!(从内部攻克hoho))

    ====================
    数组:
    这个东西和Lisp里面的表特别像,但是没有表那样自由.
    数组类型从类型 System.Array 继承而来。

    ====================
    又一个system.
    这个system里面都有什么呢?帮助一下...system命名空间
    东西好多.....咦 里面有一个Random类 用于生成随机数的 偷偷研究一下^_^
    帮助写的真麻烦,百度一个
    public static string GetRandomNum()
            {
                Random seed = new Random();
                Random randomNum = new Random(seed.Next());

                return randomNum.Next().ToString();
            }

    这个看起来简单些
    再看看帮助里面关于next的 恩 还有个NextDouble 成员
    尝试改一改看看:
    public static double GetRandomNum()
            {
                Random seed = new Random();
                return seed.NextDouble();
            }
    这回多简单
    每次调用都有不同的随机值了
    for (int i = 1; i < 20; i++)
                {
                    Console.WriteLine("{0}", GetRandomNum());
                }
    返回值都一样?看看帮助里面有个Thread.Sleep( 1 );
    可能和这个有关?
    加进去无效,错误 1 当前上下文中不存在名称“Thread”
    哦 前面还要加个引用using System.Threading;
    试试看看
    OK 即时生成20个不同的随机数,我现在会用C#生成随机数了!(可以写个双色球选号器了^_^)
    (如果MSDN看不清楚,就去百度一下好了....同时不要拿来主义,自己一定要尽量改改)

    =====================
    跑题了,回来接着学习数组.

                int[] MyArray = { 1, 2, 3 };
                for (int i = 1; i <= 3; i++)
                {
                    Console.WriteLine("{0}", MyArray);
                }
    错误 下标是从0开始的...
         for (int j = 0; j < MyArray.Length; j++)
                {
                    Console.WriteLine("{0}", MyArray[j]);
                }
    OK 输出 1 2 3
    int[] MyArray =  new int[2]{1, 2, 3 };;//这段按照书上写的为什么错误呢?

     楼主| 发表于 2009-6-25 17:05 | 显示全部楼层

    int[] MyArray = new int[3]{ 1, 2, 3 };
    汗 这样就行了 原来里面的3是真正的数组个数.
    好 自己尝试写个赋值的代码
     for (int j = 0; j < MyArray.Length; j++)
                {
                     MyArray[j] = j + 10;
                }
    OK
    既然和表类似 那就自己尝试写一个数组元素替换的小函数试试
    (当然这段可以直接写成MyArray[1] = 99;我只是练练手)
            public int[] ChangeArrayItem (int [] MyArray, int NewItem , int ChangeNum)//要改

    变的数组 要替换的内容 要替换的项
            {
                int[] NewArray = new int[MyArray.Length];
                for (int i = 0; i < MyArray.Length; i++)
                {
                    if (i == ChangeNum)//这里第一次调试失败又写成了单个等号.....要注意啊
                    {
                        NewArray = NewItem;
                    }
                    else
                    {
                        NewArray = MyArray;               
                    }
                }
                return NewArray;
            }

    哈哈~~O(∩_∩)O自己写的第一个C#函数使用成功
    MyArray = ChangeArrayItem(MyArray, 99, 1);
     for (int j = 0; j < MyArray.Length; j++)
                {
                    Console.WriteLine("{0}", MyArray[j]);
                }
    结果10 99 12
    这样的话我就可以按照Lisp操作表那样对付数组了(类似这样的数组处理函数不知道有没有 反正在

    Array类的成员里面没看到什么实用的)

    foreach 函数可以循环这个数组 试一下:
     foreach (int j in MyArray)
                {
                    Console.WriteLine("{0}", j);
                }
    但这个不可以赋值.

    ---------------------
    多维数组:
    double[][] pts =new double [3][] { new double [2] { 0, 1 },new double[2] { 2, 3 },new

    double[2] { 4, 5 } };
    写的好麻烦.
     foreach (double[] pt in pts)
                {
                    foreach (double n in pt)
                    {
                        Console.WriteLine("{0}", n);
                    }
                }
    可变数组的定义
     double[][] pts ;
                pts = new double [3][] ;
                pts[0] =  new double [2] { 0, 1 };
                pts[1] =  new double [3] { 10, 11 ,12};
                pts[2] =  new double [4] { 110, 111 ,112 ,113};
    OK 今天下午就先学到这里. 20090625

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
    ©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

    GMT+8, 2024-3-29 07:31 , Processed in 0.253527 second(s), 29 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表