知道美河 | 上传资料 | VIP申请 | 精品课程 | 资料搜索 | 问题反馈 | 会员手册 | 积分消费 | 积分充值 | 帐号保护
美河学习学习在线赞助VIP

美河学习在线(主站) eimhe.com

 找回密码
 建立账号
查看: 7617|回复: 0

[转帖] 见证我学习.net长篇连载

[复制链接]
发表于 2007-6-5 15:09:07 | 显示全部楼层 |阅读模式
见证我学习.net长篇连载  作者:joe790
来自pconline软件论坛
http://softbbs.pconline.com.cn/
由本人整理

希望能吸引.net学习者的目光
美河人气越来越旺



作者:joe790   内容详细,有心人看吧
[原创]第一天,为啥要学.net

[原创]第二天,认识.net的一系列优点

[原创]第三天,开始接触C#的第一个程序

[原创]第四天,开始接触C#的语句语法

[原创]第五天,C#的两种特殊函数

[原创]第六天,C#数据类型的分类

[原创]第七天,C#的数据类型处理

[原创]第八天,C#的方法重载


第一天,为啥要学.net
说要学.net说了好长时间了,今天终于下定决心了,虽然以后也不靠这东西吃饭,但是发现自己的技术已经跟不上时代了,该学点新东西了......
    从今天开始跟我一起学.net吧,保证一天一篇,绝不偷懒,.net 大拿们多指导,同我一样想学.net的朋友跟我来吧哈哈.

    俺的编程技术说实话还停在C,VB,ASP的那个时代, 学.net不为啥只为了学点新的东西,希望大家多多指导,更多的鼓励.
    今天看了俺用的这本书的第一章,介绍了.net平的台东西,把俺觉得重要的东西写下来同大家共同探讨,就当是一个网上学习笔记吧;0)
    一、.net 是2000年7月发布的,微软的一个重拳程序设计产品。
    二、.net似乎是因为internet的转变需要把计算和通讯隔合在一起、计算方案的转变成分布式计算、应用程序的开发从本地组件转变为WEB组件开发,共享所有组件而产生的一种软件开发产品。
    三、一段以.net语言编写的源代码在运行时将被编译两次,第一次编译比第二次慢,I车机器代码非常接近,所以转换成机器码时速度极快。一次编译,就可运行在支持运行库的任何CPU上运行。
    四、visual studio.net 的开发界面非常友好,不管以前用啥语言开发的程序员看到.net 的IDE会很快上手,更多更全的组件。
    五、msdn帮助资料超强,可提供实时的编程语言的帮助,目前还没有一个编程语言能达到微软以帮助资料齐全贴心的功能。

俺为啥要学.net 就是因为能快速上手哈、msdn的帮助手法尤为喜欢.

不足之处请各位大拿们多指导.我不是一般的菜哈.


第二天,认识.net的一系列优点
都说C#才是真正意义上的面向对象,他的诸多优点真的让俺们编程越来越简单方便了,也可能正是因为现在的开发工具功能极强的原因,软件编程已经不单单是计算机专业人员才能介入的活了,现在很多IT培训机构不正打着编程零基础也可以成为软件工程师的旗号吗?看来也不是没有道理的.下面我们一起来看看.net的优点:

一.统一的API
   .net框架让克服了C语言的要写在.h里面写无数个消息处理函数、克服了C++在进行com编程的一大堆错误处理程序,而且com不支持核心的面向对像概念,而.net将这些东西自动处理,编程人员不用再从底层出发,把编程精力放在运算和业务逻辑上,便于快速的开发软件产品.
     .net框架重写了新的简单易用的API,通过把API封装在命名空间中,形成框架库,让程序员在不需要完全懂得所有API的情况下写出简单的程序,克服了win32 API的众多API的繁杂查找与使用。

二、自动管理内存
    .net框架环境自动地执行垃圾收集与内存管理,克服了COM循环引用导致的内存无法回收问题。

三、安全意外处理
    .net可以克服了传windows API、C、C++中处理错误的随意性,让我们清楚的了解程序的问题并且直接有序的关闭程序不会导致系统的混乱。

四、安全类系统
    .NET中不会有不安全的类型表,不会混乱类型的指向问题,由于每个变量都是已类的形式出现,所以不可能有无效变量也不会出去超出数组边界的事情发生。

五、零安装
    除了要安装.net框架外,.net程序无需注册安装任何组件注册,可以随意变换地方运行而不留下痕迹,绝对环保!

六、更好的版本控制
    各种.net框架版本是独立的,.net从1.0 发展到2.0,不管是在哪种框架上开发的软件自动适应框架版本,达到各种版本兼容。

七、多语言支持
    .net提供了5种语言:vb、C++、C#、J#与javascript 或jscript,程序员可以用自己熟悉的语言写出一个类,然后在另外一个类中继承即,或在第三种开发语言中实例化就可以直接使用。

八、与COM 的互操作性
    以前有很多代码程序是非.net 框架,这些代码是否可能在.net框架中使用呢?答案是可以,.net 提供了与COM的互操作性来完成COM到.NET和.NET到COM的互相重用。

九、XML WEB Service
   通过支持XML这个标准达到跨平台的应用,无需顾虑WEB的操作系统是什么即可完成分布式计算及WEB的扩展性。


PS:.NET平台基于XML和internet协议套件。

.NET主要由三个组件构成:.net产品和服务、.NET平台本身以及第一方.NET服务

今天又是一大堆的理论,不知道上面的一些理解是否正确,有不对的地方请大拿们指正,谢谢。
本文于2006-06-30 15:36:29.734被 joe790 修改过。这是本帖的第1次修改。

第三天,开始接触C#的第一个程序
为了好好的学习.net,俺今天花了一个上午把自己的机器重装,连俺最喜欢的mac风格都格掉了哇,记住俺的XP的mac风格不是单纯的找个风格软件换皮肤哇,是属于内核型的哇.编程软件只安装了vs .net 2005,俺的决心大吧哈.现在俺的机器算是超干净的那种系统了哈.
    今在终于可以开始学习.net中效率最高的C#编译器了(因为.NET的绝大部分基类都是由C#编写), 咱们先来看看C#是啥:
  1.C#是由C/C++演变而来,所以保留了C名称并在后面加一个"#"号,发音为"C Sharp",C#是.net平台的首选语言.
  2.C#是一门真正意义上的面向对象的编程语言,虽然这一点并不能让多数程序员激动,但是C#通过强制执行严格类型检查实现了高度的安全性,不会向C/C++中的一个小错误而导致整个程序的崩溃.

很奇怪的时几乎所有编程语言的第一个例子都是在屏幕上输出:"Hello World!",那俺们就一起来看看C#要将"Hello World!"输出到屏幕上要怎么做吧,顺便来解释一下一些基本的东西哈哈:

/*用C#在屏幕上输出"Hello World!"*/              /*<-----这是C#中注释的方法*/

using System;                                  /*<------这条语句代表导入System类文件,System类文件在这里称为命名空间,同C/C++中的include同等作用.System命名空间包含了大多数应用程序与操作系统交互时所需的类.*/
class HelloWorld                              /*<------定义HelloWorld类*/
{
   public static void Main()                 /*<-------static void Main()是C#程序的入口,必须有一个Main(),同C/C++*/
      {
         Console.WriteLine("Hello World!");  /*<------调用Console类的Writeline在屏幕上输出"Hello World!"*/
      }
}

完成,就列简单.下面我们来看看在cmd下编译和运行: (由于DOS无法COPY出来,只能传个图上了哇.)

(由于现在无法上传图,等以后能上传的时候再编辑传上来)


不错不错,虽然以前也有一些c/C++的基础,第一次写这个程序俺就编译运行无错,自己鼓励一下自己哈,大家别说我菜,我是很菜
再说几点:1、C#中区分大小写;语句用";"(分号)分隔

下一节学习预告: C#编程结构,包括声明变量、基本输入输出、语句语法等,相信随着语法和代码的出现我会越学越有劲哈。必竟俺的学习方式还是喜欢实例化哈。
谢谢大家捧场。

第四天,开始接触C#的语句语法
到了第四天了,希望我能坚持下去,希望大家能多给点鼓励,谢谢了.

C#的变量声明格式:AccessModifier DataType VariableName;

AccessModifier是访问修饰符,C#中访问修饰符有以下几种

public 俺的理解就是这个是个公共的,程序中的任何成员都可以访问
protected 成员可以从声明它的类及派生类的内部访问
private   成员只能从声明它的类内部访问
internal  成员只能从声明这它的程序信内部访问

DataType是数据类型,C#中的一些有效内部类型为:
int 整型
string 字符患
float 实数

PS:C#的数据类型也可以是数组,自定义数据类型或用于创建对象的类名.

VariableName是变量名
大家注意C#的变量命名规则呀:
1、区分大小写
2、必须以字母开头(不可用数字或符号)
3、不能包含句点/停顿或空格
4、不能与C#保留字(关键字)相同,如果仍想使用,C#提供了一个功能就是在C#的保留字前面加上一个“@”号即可
   例如在程序中想使用string这个变量名可以写成@string
5、虽然C#的变量都会自动给一个初始值,但是建议大家还是在定义以后初始一下值哇。

一起来看个例子吧:
using System;

class MyCs1
{
    static void Main()
      {
        string @string;                         ///定义变量
        @string="哈哈,我用C#的保留字定义变量名"; ///用C#的保留字定义变量名
        ConSole.WriteLine(@string);             ///输出
       }
}
现在终于明白以前看咱们老师的代码的时候为啥代码里面会有@了。大家有兴趣可以运行看看哈,俺是运行过了,绝对没错的哈,当然这么简单的东西如果出错。。。那俺也太太菜了哈。

C#的输入输出

输入:Console.ReadLine(),读取回车符前面的所有字符,不知道有没有限制,有没有朋友试过能接受多少个字符?记得告诉我哈。
输出:Console.WriteLine(),它有很多输出格式化参数,大家如果要使用到其他格式可以查查vs .net msdn参考哈,我这里就不多说哈。
下面还是来看个例子:

using System;

class MyCs2
{
    static void Main()
      {
         string inputstring;                    ///定义字符变量
         inputstring=Console.ReadLine();        ///让用户输入字符赋给inputstring
         Console.WriteLine("",inputstring) ;  ///输出inputstring;
       }
}

yeah!又一次第一次就运行无错,哈哈,看来以前的C的基础还是有些用的哇。


C#的选择语句

所有语言都会有的哈,相信稍稍有接触编程的朋友看到这里就知道是if和switch了。
if的语法结构如下:
if (expression)
{
   表达式的结果为true时执行的语句
}
else
{
    表达式的结果为false时执行的语句
}

还是来看个例子哈:

using System;

class MyCsif
{
  static void Main()
   {
   string str="joe790";
   if (str=="joe790")
      {
         Console.WriteLine("我的blog地址是http://joe790.blogcn.com");
       }
    else
       {
         Console.WriteLine("这个程序不可能显示这条语句哈!");
       }
    }
}

这个程序输出结果肯定就是“我的blog地址是http://joe790.blogcn.com”了哈。

switch的语法:
   switch(variable)
   {
       case value:           ///一定要用冒号
           语句
        break;
       case value:
           语句
        break;               ///一定要有break
  
       default:            
           语句
        break;
     }

例子例子我最喜欢了:
using System;
class MyCsSwitch
{
   static void Main()
   {
     string mystring;
     mystring=Console.ReadLine();
     switch(mystring)
     {
       case "6":
        Console.WriteLine("你想约我星期六见面?");
        break;
       case "7":
        Console.WriteLine("你要约我星期日见面?");
        break;
       default:
        Console.WriteLine("其它的日子俺没时间哇!");
        break;
      }
   }
}
哈哈,要约我的MM一定要输入6或7哈。

今天的最后个内容:编程语言有了选择怎么能少了循环列:
C#的循环结构包括以下几个:
   while
   do
   for
   foreach循环
上面三个我就不多说了,跟C的用法是一样了,一定不懂C的朋友就自己翻翻书吧哈,我们重点来看一下foreach,
学过VB的朋友一定对foreach比较熟悉,这个结构常用于通过集合或数组来循环
foreach 的语法:
   foreach( Type Identifier in expression)
    {
      语句
    }

例子再次出现帮助我理解foreach
using System;
class MyCsForeach
{
  static void Main(String[] args)
  {
    int index;
    String[ ] array1=new String[3]; ///定义数组array1,实例化分配空间
    for (index=0;index<3;index++)   ///条件跟for一样哇。
    {
       array1[index]=args[index];   ///foreach给数组的各个空间按数据下标赋值
    }
    foreach(String strName in array1)   
    {
      Console.WriteLine(strName);        ///输出大家已经看到过好多了
    }
   }
}

oh,不知不觉已经是凌晨1点多了,该眠去了。。。。下节预告就不说了....zzzZZZ......


第五天,C#的两种特殊函数
昨天因为忙活到今天凌晨两点才回到家,所以没来得及学习,今天就来补一下昨天的内容吧

C#的中的构造函数,构造函数是特殊的方法,与包函它的类同名.类里面可以有多个构造函数.
在创建类的实例的时候,同时会执行这些构造对成员变量进行初始化.

还是来看看构造函数的语法吧:

class MyConstructor
{
     public myconstructor()
       {
           myconstructor构造函数
        }
}

老办法,拿个简单例子出来(俺暂时还只能看简单的例子哈):
using System;
class StudyCsDate
{
private string studydate;
public StudyCsDate()                                     ///定义构造函数,名和类名相同.
  {
      studydate="2006年6月27日";
   }
public void ShowDate()                                   
  {
    Console.WriteLine("俺学习C#的日期是:"+studydate);
  }
public static void Main()
  {
     StudyCsDate begindate=new StudyCsDate();                    ///实例化时就会执行构造函数中的语句
     begindate.ShowDate();                                       ///调用ShowDate方法输出结果.
  }
}

这个是不带参数的构造函数,再来一个带参数的构造函数例子
   
using System;
class StudyCsDate
{
private string studydate;
public StudyCsDate()                                     ///不带参数的构造函数
  {
      studydate="2006年6月27日";
   }
public StudyCsDate(string mydate)                        ///带有参数的构造函数和前面的构造函数同名
  {
       studydate=mydate;
  }

public void ShowDate()
  {
    Console.WriteLine("俺开始学习C#的日期:"+studydate);
  }
public static void Main()
  {
     StudyCsDate begindate=new StudyCsDate();                            ///实例化
     begindate.ShowDate();
     StudyCsDate begindatestr=new StudyCsDate("肯定是2006年6月27日!");  //实例化时传参数。
     begindatestr.ShowDate();
  }
}

上面的例子存在没有参数和带有参数的构造函数,如果在实例化时没有使用参数则调用默认的,反之则调用有参数的.

下面再来看看析构函数:
   析构函数定义方法同构造函数,名称与类名相同,前面以" ~ "为前缀.当类的实例被删除或超出程序作用域时执行,它们主要是由垃圾回收器调用的.不带任何参数且不显示任何执行情况.由于析构函数的对象占用资源较多、驻离内存较长时间
、销毁过程作为独立的线程执行占用CPU资源被大量占用,所以建议只在真正需要的时候才使用析构函数。

好了,虽然今天的内容不多,但是让俺理解这两个东西花了点时间,看来困难还是挺多的。读过这篇学习日志的朋友帮顶帮鼓励,谢谢!

下一次的内容预告:C#数据类型的分类。今天没睡好,眠去了....zzzZZZ


第六天,C#数据类型的分类C#的数据类型分为:值类型和引用类型.先来看看他们俩的概念:
值类型:变量保存为实际值,内存分配在堆栈上,默认值为零,例如:int char等都是值类型
引用类型:变量保存对象的地址,内存分配在堆上,默认值为null,例如:类、接口、数组等。

晕呼呼,看看两种不同的代码看能不能帮助我理解:
值类型:
using System;
class DataType1
{
  static void Main()
   {
     int myvar=999;
     goX(myvar);
     Console.WriteLine(myvar);
   }
static void goX (int myvar)
   {
      int tempvar=999;
      myvar=tempvar*10;
    }
}

这个程序输出的结果是啥列?真想整个回复可见答案来提提人气哇,可惜这里好像没有这个功能:em215:
输入的结果是999,为啥是999而不是9990?这就跟myvar 的数据类型有关了,因为虽然执行了goX函数后myvar变成了9990,但是由于myvar是值类型,所以得出的结果关没有传回给Main(),所以输出的结果仍然是Main()中给的初始值999

咱们再来看看引用类型:
using System;
class DataType2
{
  public int myvar;
}
class DataType3
{
static void Main()
{
  DataType2 myvar1=new DataType2();
  myvar1.myvar=999;
  goX(myvar1);
  Console.WriteLine(myvar1.myvar);
}

static void goX(DataType2 myvar1)
{
   int tempvar=999;
   myvar1.myvar=tempvar*10;
}
}
哈,这里的输出的结果就是9990了,为啥列?因为传递给函数的是一个对像,对像属于引用类型,所以传送给函数的是地址,那么当myvar1在goX中改变时同时会传回给Main(),所以这里的值是9990了哈。

以为学完这一节了,差点就点发布了,看后面还有一节:装箱和取消装箱,看内容还挺重要的,继续学吧,虽然很想跟线上的一个MM聊几句呵。
酷:原来装箱是从值类型转到引用类型,而取消装箱是从引用类型转换到值类型。原来就是列两种数据类型互相转换哇。继续看看是怎么整的:(参考一下msdn的例子,书本上好像说的例子俺没办法理解)


装箱:
using System;
class TestBoxing  
{
    static void Main()
    {
        int i = 123;
        object o = i;  // implicit boxing
        
        i = 456;  // change the contents of i

        System.Console.WriteLine("The value-type value = ", i);
        System.Console.WriteLine("The object-type value = ", o);
    }
}

输出
The value-type value = 456

The object-type value = 123
此示例通过装箱将整数变量 i 转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。该示例表明原始值类型和装箱的对象使用不同的内存位置,因此能够存储不同的值。


取消装箱:

using System;
class TestUnboxing
{
    static void Main()
    {
        int i = 123;
        object o = i;  // implicit boxing

        try
        {
            int j = (int) o;  // attempt to unbox
            
            System.Console.WriteLine("Unboxing OK.");
        }
        catch (System.InvalidCastException e)
        {
            System.Console.WriteLine(" Error: Incorrect unboxing.", e.Message);
        }
    }
}

输出:

Unboxing OK.

oh,还好赶在MM下线前整完了哈。下节预告:数据类型处理。


第七天,C#的数据类型处理C#中所有数据库型都是一个类源生而来,C#中的一切都是对像,下面这个例子来帮助我理解它:

using System;
class ObjectAll
{
   static void Main()
   {
     string objectval;
     objectval=888.ToString();                       ///ToString()是对象的方法之一,将对旬转换成字符
     Console.WriteLine("objectval="+objectval);
   }
}

这个例子将数字888转换成字符型输出,为什么一个数字能拥有方法!!!这就是上面所说的C#中一切都是对像,可以用统一类库中的方法对它进行处理。另外C#中所有类型都是由一个共同的类派生出来,它们具有一些相同的特征。

C#中定义静态成员
    静态成员:不于任何其他特定对象相关联的成员,用static定义

C#中的数组的几种用法:
   一、声明指定个数的数组: int[888] array888;   ///声明数组有888个元素
   二、声明不用指定个数,可以在实例化时定义:
       int [ ] array888;          ///可以先不确定有多少个元素
       array888=new string [999]; ///在实例化时再定义999个元素
   三、给数组初始化:
       string [ ] array7={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};///声明数组有7个元素并赋初始值

C#中数组属于引用类型,是一组具有类似数据类型的值。由于这些值存在相邻的位置空间,所以访问和操作都是方便快捷的.
索引值从零开始。

C#中的结构
    为加快分配,避免过多重载和引用开销我们常用结构来替换类来实现对象,结构在C#中是值类型。

枚举类型:是声明一组命名常数的独特类型。当程序中某此数值可以具有一组特定值时,可以使用枚举类型。

晕。。。结构和枚举有点不明白,看在以后做到相关练习或需要用到的时候再加深理解吧,或者哪位大拿可以指点一下。谢谢啦。

七天的学习终于还是坚持下来,下一次就是对七天学到的东西做一些练习,来加深一下学习的效果了。

眠去了,最近受了点内伤,最晕的是它超级的影响到我的手的活动……快点好起来吧- -


第八课,C#的方法重载
已经不是纯学习的年代,还必须把大部分时间放到相关自己的工作上,这几天工作任务较多,所以好几天没学习了,今天再开始吧,所以以后标题改成第X课,而不是第几天了哈.

C#中,可以用两种方式重载方法:
  指定不同个数的参数
  指定不同的参数类型

看理论有点摸不着头~~~~,还是找两个例子来理解......

//指定不同个数的参数例子:
using System;
public class MethodOverload
{
    int net_sal;
    int basic_sal;
    int allow;
    int deduct;
   

  public void calculate(int intBasic)             //一个参数
   {
      basic_sal=intBasic;
      Console.WriteLine("基本工资:"+basic_sal);
    }

  public void calculate(int intDeduct,int intAllow)    //两个参数
   {
     allow=intAllow;
     deduct=intDeduct;
     Console.WriteLine("津贴:"+allow);
     Console.WriteLine("扣除额:"+deduct);
   }

  public void calculate()
   {
     net_sal=(basic_sal+allow)-deduct;
     Console.WriteLine("实际工资:"+net_sal);
   }
  static void Main()
   {
     MethodOverload objMO=new MethodOverload();
     objMO.calculate(8500);          //参数个数为1个则运行只有一个参数的calculate(int int Basic)
     objMO.calculate(1000,800);      //参数个数为2个则运行有两个参数的calculate(int intDeduct,int intAllow)
     objMO.calculate();              
   }
}

//不同的参数类型的例子:
using System;
public class MethodOverload
{
   int money;
   string myname;
   public void show (string strName)                //字符型
   {
       myname=strName;
       Console.WriteLine("我的名字:"+myname);
   }
   public void show(int intmoney)                        //整型
   {
       money=intmoney;
       Console.WriteLine(myname+"要"+money+"万!哈哈哈!!!");
   }
  static void Main()
  {
    MethodOverload metOver=new MethodOverload();
    metOver.show("joe790");                       //当是字符型参数时执行show(string strName)
    metOver.show(500);                            //当是数值型参数时执行show(int intmoney)
  }
}

看了例子就明白了:
C#中会按不同的参数类型或个数调用相应的方法.


PS:成功的男人背后都有一个女人.....虽然我还不算成功,还是要感谢鱼的后勤工作.哈哈.

[ 本帖最后由 jackieluo2008 于 2007-6-5 15:13 编辑 ]
您需要登录后才可以回帖 登录 | 建立账号

本版积分规则

 
QQ在线咨询

QQ|小黑屋|手机版|Archiver|美河学习在线 ( 浙网备33020302000026号 )

GMT+8, 2025-5-23 11:24

Powered by Discuz!

© 2001-2025 eimhe.com.

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