• C# .net asp学习笔记


    KeyLife富翁笔记
    作者: HongYuan
    标题: C# .net asp学习笔记
    关键字: 由DELPHI下的WIN32程序员转向.Net程序员
    分类: C# 初级学习
    密级: 保护
    (评分: , 回复: 0, 阅读: 203) »»

    2005-9-21
    1 了解我的开发平台。
    1.1 什么是 .NET 框架?
        Microsoft .NET 框架是生成、部署和运行 Web 服务及应用程序的多语言环境平台。.NET 框架由三个主要部分组成:公共语言运行库、统一类库的分层集合和称为 ASP.NET 的 Active Server Pages 组件化版本。
    1.2 什么是公共语言运行库 (CLR)?
    公共语言运行库,[Common Language Runtime (CLR)]。
    1.3 什么是通用类型系统 (CTS)?
    通用类型系统,[Common Type System(CTS)]是一个内置在公共语言运行库中的丰富的类型系统;比如C#的int对应CTS中的System.Int32;
    1.4 什么是 Microsoft 中间语言 (MSIL)?
    MSIL 是与 CPU 无关的指令集,其中编译进了 .NET 框架程序。它包含在对象上加载、存储、初始化和调用方法的指令。  


    2005-9-21 16:52:21   
     2005-9-22 13:45:13    类变量,私有变量;静态变量(static)

    在类中定义的变量,暂时称为字段吧,其作用域为类实例的生命周期;函数内的声名的变量为私有变量,作用域仅函数内有效。C#充许类变量与私有变量同名,同名时函数缺省引用私有变量,而使用类变量时,请在变量前加上类实例或类名(静态变量)
    如:class abc
    {
      static int j=20
      int i=20//未静态变量,要实例化类才能引用
      public static void Main()
     {
        int j=30;
        console.writeline(j);//私有变量,30
        console.writeline(abc.j);//类的静态变量,不用实例化类,即可引用,20
        return;
     }
    }
    C#的变量定义不需要关键字var,不过常量需要const;所有带有static关键字的方法与变量都可以在类实例化前使用。  

     
     2005-9-22 14:06:36    using与uses的区别?

    uses,首先在项目单元中直接引用单元具体文件(指定单元文件路径);单元文件中,uses引用单元名称,并充许单元内使用引用单元的资源(方法,变量等)。
    using 只需要指定命名空间名称,然而它是如何找到具体的代码文件的呢?
    难道说每个文件都自动托管,托管时CLR自动注册名称与具体的托管文件关联?使用者只需要引用命名空间,使用时由CLR定位调用就行了吗? 那文件是在什么时候被交给CLR托管的呢?
    一个程序集(DLL)可以定义引用多个命名空间,一个命名空间可以分布在多少程序集内。

    using只是用来引用命名空间,同单元中的USES一样,因为命名空间是逻辑组合,至于逻辑名称与实体文件之间的关联则不由using处理.这还是CLR在装入DLL程序集时注册的吧。
    using可以指定别名,如using hongyuandata=system.data

     
     2005-9-22 14:52:58    值引用和引用类型

    值类型,直接存储值;引用类型,仅保存对引用类型引用。值类型存储在堆栈中,引用类型则在托管堆上。
    注意:这里的引用类型和pascal不一样,在pascal中,值类型存在栈中,引用类型的引用存在栈中,被引用的值存在堆中;另一个区别就是C#引用类型,它和pascal不一样,因为pascal引用是指针,而C#仅仅是引用。引用类型可以赋值为null,即不引用任何对象。相当于pascal中的Nil

    枚举是值引用,字符串,类,数组是引用类型,注意,C#没有可变类型。

     
     2005-9-22 15:01:20    bool与char

    bool:pascal里是boolean,并且c#中只能存true或false,不可以存0,1是不可以与数值互换的;
    char,不在是8位,而是16位,即Unicode字符,可以保存一个中文汉字;值可以是'a',16进制unicode码\u0041,(char)65,16进制数'\x0041',转义字符\'

     
     2005-9-22 15:04:22    string

    string a ='c:\\abc\\a.cs'--->c:\abc\a.cs即注意转义字符,如果不使用转义字符,可以在如下操作
    string a=@'c:\abc\a.cs'

     
     2005-9-22 15:08:57    语法

    if {} else {} 注意{}代替了pascal中的begin...end;而且还省去了;
    switch(变量)
    {
    case 1:
    ...
    break;//每个case结束必需加break否则直接执行下面case,直到遇到break或到尾部
    case 2:
    ...
    break;
    default:
    ...
    break;
    else
    ...
    break;
    }

     
     2005-9-22 15:13:08    foreach

    foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。此语句的形式如下:

    foreach (type identifier in expression) statement
    其中:

    type
    identifier 的类型。
    identifier 表示集合元素的迭代变量。如果迭代变量为值类型,则无法修改的只读变量也是有效的。
    expression 对象集合或数组表达式。集合元素的类型必须可以转换为 identifier 类型。请不要使用计算为 null 的表达式。
    而应计算为实现 IEnumerable 的类型或声明 GetEnumerator 方法的类型。在后一种情况中,GetEnumerator 应该要么返回实现 IEnumerator 的类型,要么声明 IEnumerator 中定义的所有方法。

    statement
    要执行的嵌入语句。

     
     2005-9-22 15:16:22    break,continue,return

    break退出case,for,foreach,while,do ..while
    continue直接进入下一循环
    return 退出类方法,直接返回调用者,如果方法有返回值,必需指定返回值,相当于pascal的exit+返回值

     
     2005-9-22 15:22:18    枚举

    pascal:
    type aa=(1,2,3,4)

    c# 除了值,还可以指定别名
    public enum aa
    {
    a1=0,
    a2=1,
    a3=3
    }
    aa faa//定义faa为枚举aa类型
    Faa.ToString()取得当前值的别名
    (int) (aa)Enum.Parse(typeof(Faa),'a1',true);找到别名为faa的值,取出值转换成int
    typeof()取出引用变量的类型,parse根据指定的枚举类型查找指定别名,并且指定是否管大小写

     
     2005-9-22 15:42:46    C#函数和过程直接支持动态数组参数

    public static Main(string[] args)//字符串动态数组
    {
    for (int i=0;i<args.length;i++)
    {}
    return;
    }
    但不知道支不支持开放数组中的array of const,即不确定类型动态数组,C#不支持可变类型

     
     2005-9-22 16:07:48    C#预处理器指令,由编译器处理,即在程序编译时处理。

    #define HongYuan ///定义一个符号HongYuan
    #undef HongYuan ///取消一个符号定义HongYuan
    #if HongYuan ///检查符号HongYuan是否定义
    Console.WriteLene("Test");
    #else ///没有找到符号HongYuan时
    #endif ///结束符号检查

    #warning "你出错了" 编译器产生一个警告,显示指定提示,并继续编译
    #error 编译器产生一个错误,并退出编译
    #region,#endregion标记一个代码块,但不影响编译,只对程序编辑器有用
    #line用于改变编译器在警告和错误信息中显示的文件名和行号信息。
    #line 164 "Core.cs"//出错就提示在文件core.cs,164行出错

     
     2005-9-22 16:16:40    C#除了类,还是结构?

    类是存储在堆(heap)上的引用类型,结构是存储在堆栈(stack)上的值类型,结构不支持继承;定义时类用关键字class,结构用struct
    类与结构都使用new实例化并初始化.
    类中可以使用static声名一个静态变量或方法,这样可以在类未实例化前调用。
    类实例的方法调用必需带(),pascal有时过程可以不指定。

     
     2005-9-22 16:30:18    类方法

    方法重载
    1、不需要指定overload关键字
    2、不能仅以返回类型不同做为重载区别
    3、也不能以ref,out来区分重载
    4、但可以通过参数的个数,参数类型不同来重载方法。
    5、类方法的参数,ref相当于pascal的var
    6、#也有out关键字
    7、不支持默认参数.
    8、过程,函数不需要procedure / function关键字

     
     2005-9-22 16:37:42    属性

    public string ServerName
    {
      get
     {
      return fservername //返回一个字段,变更
     }
     set
    {
     Fservername=value//设置一个变量值
    }
    }
    和pascal不同的地方就是在定义属性同时定义get,set方法的实现,即不像pascal将定义和实现分开。同是没有set就是只读,没有get就是只写。如果属性需要内存或派生类中充许操作,就另写一个方法对属性对应的字段变量进行操作即可。因为属性的访问修饰符决定了get,set访问权限。

     
     2005-9-22 16:46:34    构造函数

    类没有创建构造函数时,编译器会在后台自动创建一个默认的构造函数,并会为所有成员字段初始化,并提供默认值,如数值为0,bool为false,引用类型为null。这和pascal不同,在pascal中所有类都是tobjects子类,如果没有create就调用父类的create。同样也是初始化类成员,只是引用类型初始值为nil;
    但要注意,只有在没有提供任何构造函数时,编译器才提供默认构造函数。
    C#的类的构造函数必需使用与类同名的构造函数,而不是pascal必需的create
    this=self,引用当前实例的成员

     
     2005-9-22 16:58:26    静态构造函数

    在构造函数前,使用static;用于初始化类的静态字段或属性,这些值不可以在普通构造函数或其它方法修改,同时它也不能访问实例成员。静态构造函数不由用户调用,由.net运行库加载类时调用它。一个类只有一个静态构造函数。

     
     2005-9-22 17:04:37    同一个类的构造函数相互调用

    class test
    {
      public test(i:int)
      {}
      public test(i:int;s:string):this(i)//通过this调用同名函数,并将输入参数i传给被调用函数
      {
      }
    }
    这样可以将相同的初始化工作入在一个构造函数内,其它构造函数调用它之后再完成本职工作。

     
     2005-9-22 17:33:33    类继承与接口实现

    和pascal没什么区别,只是把=换成了:,如
    delphi
    type
       tabc=class(tobjects,inf1,inf2)
        public
       end;
    c#
    class TAbc:object,inf1,inf2;
    缺省类为system.object
    虚方法或属性,使用virtual
    隐藏或覆盖,使用override,同时可能通过base.方法名,继承基类的方法。
    sealed类,即密封类,不可以继承

    public interface inf1
    {
    }

     
     2005-9-23 9:30:41    根类与根接口

    // from module 'c:\winnt\microsoft.net\framework\v1.1.4322\mscorlib.dll'
    public class object
    {

        // Constructors
        public Object();

        // Methods
        public virtual bool Equals(object obj);
        public static bool Equals(object objA, object objB);
        public virtual int GetHashCode();
        public Type GetType();
        public static bool ReferenceEquals(object objA, object objB);
        public virtual string ToString();
    } // end of

    // from module 'c:\winnt\microsoft.net\framework\v1.1.4322\mscorlib.dll'
    public interface IDisposable
    {

        // Methods
        void Dispose();
    } // end of System

     
     2005-9-23 9:40:07    运算符

    %求余,求模
    new 实例化对象
    ?: 条件运算符

    checked unchecked 溢出异常控制运算符
    byte b=255
    checked //进行溢出检查,如果此处为unchecked下面语名不出错,但b=0
    {
     b++//byte最大值255,B+1会溢出,所以运行代码出错
    }

    sizeof 取出变量占用内存的字节数
    取出<b>堆栈中值类型</b>需要的长度,单位是字节

    is 类型检查,用于检索是否属于某个类或子类
    as 类型转换,失败返回null
    typeof 根据指定类型返回实例对象

     
     2005-9-23 14:05:23    类型显示转换

    int i=(int)(0.5)前面是要转换的类型,后面是转换的值;
    int i=int.Parse("100")将100转换成整数

    C# 的数据类型都对应CTS中一种类型,应该是继承自CTS,比如bool对应system.boolean,而boolean是一个类型,即拥有字段,属性,方法,过程等
    bool b=system.boolean b
    bool b=bool.Parse("TRUE")这里就是调用类方法将TRUE转换成bool型
    即除了可以使用 目标值=(目标类型)源值 转换外,还可以通过目录类型的方法进行转换,前题是所属类提示这个方法,一般是Parse;可通过wincv查看。

     
     2005-9-23 14:08:29    要对象提供了对象的比较,引用比较,值比较?

    // from module 'c:\winnt\microsoft.net\framework\v1.1.4322\mscorlib.dll'
    public class object
    {

        // Constructors
        public Object();

        // Methods
        public virtual bool Equals(object obj);//值比较,比较类实例所有字段值是否一致。
        public static bool Equals(object objA, object objB);
        public virtual int GetHashCode();
        public Type GetType();
        public static bool ReferenceEquals(object objA, object objB);//引用比较,即指向的内存地址是否一致,大多数==同此方法一样的操作,但可以重载实现值比较。
        public virtual string ToString();
    } // end of System.Object

     
     2005-9-23 14:13:17    运算符重载

    public static 类名 operator 运算符(参数)//这三个关键字都是必需的
    public static Vector operator +(Vector lhs,Vector rhs)
    {
    Vector result=new Vector(lhs);
    result.x=rhs.x+result.x;
    ....
    }  

     
     2005-9-23 14:23:59    用户定义的数据类型转换

    P137
    用于结构向其它类型转换
    public static implicit operator 目标类型(参数)
    {
    }
    用于不同类之间转换
    public static explicit operator 目标类型(参数)
    {
    }
    基类与派生类,与接口
    目标=(目标类型)源

    多重数据转换
    long amount=(long)(float)balance;先转换成float,再转换成long
    装箱,即将对象从栈装载到堆,比如结构类型是存在栈上,如果要转换成system.object就是;取消装箱,即将对象转换成string或结构之类的值类型

     
     2005-9-23 14:49:27    装箱与取消装箱

    结构,值类型转换到system.object ->装箱,由栈到堆
    类转换到值类型(如string),结构 ->取消装箱,从堆到栈

     
     2005-9-23 15:29:56    定义一个特殊的类,并且这个类的参数能以方法做为参数传递,这就是委托。

    方法做为参数传递,只是传递方法的指针;但.net不充许的。
    委托,只是一个对象类型,其特别的就是没有包含任务数据,只有方法细节;
    delegate 返回值类型 委托名称(参数);
    //感觉像定义方法一样,只是多个delegate,并且定义的是类

    因为委托是类,所以需要实现,就如同定义了接口一样,委托的类派生于System.MulticastDelegate类;

    接口也可以做为参数传递,即可以用接口代替委托
    被定义成委托类后,就可以做为参数传递,在调用过程中不需要再实例化,看起来像是以前的指针调用。

     
     2005-9-23 15:46:56   

    C# 中的委托类似于 C 或 C++ 中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与 C 或 C++ 中的函数指针不同,委托是面向对象、类型安全的,并且是安全的。

    委托声明定义一种类型,它用一组特定的参数以及返回类型封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果您有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。

    委托的一个有趣且有用的属性是,它不知道或不关心自己引用的对象的类。任何对象都可以;只是方法的参数类型和返回类型必须与委托的参数类型和返回类型相匹配。这使得委托完全适合“匿名”调用。

    注意   委托是在调用方的安全权限下运行而不是声明方的权限下运行。

     
     2005-9-23 16:01:51   

    定义一个委托类型,相当于定义一个类
    delegate string test();

    实例化委托,并把方法i.ToString做为参数传递给委托对象
    int i:=40
    test testobj=new test(i.ToString)
    调用委托
    testobj

    调用委托实例testobj就等于调用i.ToString(),相当于在testobj存有指向方法的指针
    包含多个方法的委托,就是多播委托。

     
     2005-9-23 16:20:58    事件

    EventHandler这是一个事件委托,定义在system.EventHandler;
    btnOne.Click+=new EventHandler(Button_Click);
    btnTwo.Click+=new EventHandler(Button_Click);

    EventHandler委托没有返回值,参数必需是object和EventArgs
    private void Button_Click(object sender,Eventargs e)
    {
    }
    上面定义的是一个接收器

    调用click(this,eventargs)

     
     2005-9-23 16:33:56   

    操作系统对每个输入设备产生的操作,如按下MOUSE或键盘,就会发送一条消息,应用程序就得捕获消息,并根据消息调用委托,通过委托调用相应的过程处理消息,没有处理的消息再发送给操作系统,由操作系统处理。
    发送消息:按下MOUSE左键,首先由操作系统捕获交给当前应用程序,再由当前应用程序交给当前窗口,如果当前窗口处理完就告诉应用程序由应用程序告诉操作系统。如果当前程序没的处理也告诉操作系统,由它处理。如果当前窗口处理就根据当前窗口的情况及状态通知委托,由委托调用用定义的处理过程,或者交回操作系统。  

     
     2005-9-23 17:36:28    手工调用垃圾回收器 System.GC.Collect()

    注意,并不保证每次垃圾收集过程都能将未引用对象从堆中删除

  • 相关阅读:
    【操作系统】用Oracle VM VirtualBox 虚拟机安装XP系统时老是蓝屏
    c#操作Xml(六)
    c#操作Xml(五)
    c#操作Xml(三)
    c#操作Xml(四)
    新年快乐
    c#操作Xml(八)
    从IDataReader中读取数据实体
    c#操作Xml(七)
    c#操作Xml(二)
  • 原文地址:https://www.cnblogs.com/ZhouXiHong/p/568227.html
Copyright © 2020-2023  润新知