C#学习笔记

来源:互联网 发布:微信砍价带支付源码 编辑:程序博客网 时间:2024/05/21 10:06



1 数据类型

数据类型分两种:值类型和引用类型

值类型:简单类型, 结构类型(struct), 枚举类型

引用类型:类, 委托, 数组, 接口、


所谓值类型就是指当一个变量给另一个变量赋值的时候做的操作是内存拷贝,a = b;时, 为a重新分配内存并将b中的内容拷贝至a所在的内存块。

引用类型类似指针,C++中指针和引用是不同的称呼,C++中说指针是地址,引用是别名,而对于他们的不同则没有深究,这里的引用可以认为是指针也可以认为是别名,总之,当a=b时,所做的操作是把a指向b所在的内存单元,当对a或b进行修改时,b或者a中的值也随之修改,因为两者是同一内存单元。


2 string类型

 C#中的string类型都是unicode双字节类型


3 变量类型

  静态:属于类而不属于对象,和C++意义相同。不同点是:C#中用类名引用而不能实例化一个对象引用,而在C++中可以用对象来引用static函数,表明这是该对象所属的类的static函数。

  非静态:属于对象,而不属于类

  数组:引用类型


4 参数类型

  ref参数:引用参数,当参数为引用类型(类, 委托, 数组, 接口)时,不必加这个关键字,自动为引用类型。

  out关键字:输出参数,该参数在函数中必须初始化,即必须被赋值,使用out参数可以当作返回的返回值,这样一个函数可以实现有多个返回值的作用。

  params: 变长参数,实例如下:     


        //定义  

        public string ConString(params string[] strs)

        {

            string strResult = "";

            foreach (string str in strs)

            {

                strResult += str;

            }

            return strResult;

        }


     //调用

        private void button2_Click(object sender, EventArgs e)

        {

            Test t = new Test();

            string str = t.ConString("hello ", "moto ", "hello ", "world!");

            MessageBox.Show(str);

        }


5 foreach

   用来遍历数组, foreach(类型  变量名 in 数组名)

  eg.

   int[] Arr = new int[10];

   foreach(int k in Arr)

   {

            //codes

   }



6 命名空间可以有别名

  using namespace System.Windows.Forms = example;


7 关于VS

  我亲爱的VS,想当年刚开始用的时候还想,丛老师干嘛要用C#来做这个项目呢,哥在504和师弟师妹师姐, 做项目, 用了大半年的时间做完了,亲爱的C#啊,当时太菜了,好方便啊!

  解决方案:可以用多个项目,可以设置启动项目,也可以设置多个启动项目。

C学习笔记 - 大灰狼 - 大灰狼 的博客


VS可以方便的重构:改名, 提取函数等

C学习笔记 - 大灰狼 - 大灰狼 的博客




8 程序集信息

  程序集版本不能随便修改,文件版本号可以修改。


9 编译执行

  #define Debug

  #ifdef Debug

   //codes

  #elif  RELEASE

  //codes

  #endif

 具体请看另一篇转载的关于预编译指令的文章


10 属性

  属性一般是public,暴露给外界用来被使用

 eg.

  public  int Name 

  {

      get{return _Name;}

      set{_Name = value;} 

  }

  其中Name为属性名,_Name为类的变量名,  value为关键字。


11 修饰符

  sealed :可用来修饰类或虚函数或虚属性,修饰类时:该类不能被继承。

修饰虚函数时:该类可以被继承但是该虚函数不可以被子类重写(override),

修饰虚属性时:该虚属性不可以被重写(override)


internal:



readonly:




12 匿名类

  eg.

   var Doctor = new {FirstName = "cui", LastName = "hao"};


13 垃圾回收

  C#自带垃圾回收机制

 using(Form frm = new From())

{

  //codes

}

使用完后立即释放frm


14 结构体 struct

值类型, 不能继承, 构造函数必须带参数


15 扩展方法

  为某个类在外部添加方法,而不在直接在类的源文件中添加

过程:解决方案---右键添加新建项---类库---将生成的类适当改名(根据需要)--将类改为static--在类中添加public static 函数 , 在需要使用的地方添加这个引用


eg.

//Class1.cs  类库

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ClassLibAddMethod

{

    public static class EString

    {

        public static int ToInt(this string str)

        {

            int value = 0;

            int.TryParse(str, out value);

            return value;

        }


    }

}


//使用

右键添加引用----using ClassLibAddMethod---使用

using ClassLibAddMethod


    private void button4_Click(object sender, EventArgs e)

     {

        int value = 0;

        string str = "123";

        value = str.ToInt();

    }



16 关于接口

public interface  InfaceName

{

    //属性

    //方法

}


需要:属性和方法都不加修饰符(public  private protected),其访问属性和接口的修饰相同。


实现接口:显式实现 和 隐式实现

public interface IRoom

    int AddRoom(); 

}


public class Room : IRoom 

{

    public int AddRoom() 

    { 

        throw new Exception("The method or operation is not implemented."); 

    }

    int IRoom.AddRoom()

    { 

        throw new Exception("The method or operation is not implemented."); 

    }

}

正常情况下,如果你这样调用

Room:Room room = new Room(); 

room.AddRoom();那么执行的是AddRoom方法,这成为隐式实现。 


如果这样调用

Room:Room room = new Room(); 

((IRoom)room).AddRoom(); 

那么执行的是IRoom.AddRoom()方法。这称之为显示实现。



17 virtual方法

eg.


class Parent

{

    public Parent()  // 基类构造函数

    {

    }

    virtual void TestVirtual()

    {

    }

}


class Sub : Parent

{

    public Sub : base([参数s])  //base()调用基类构造函数

    {

        //codes

    }

    override virtual void TestVirtual()

    {

         base.TestVirtual();  //调用基类的该函数

    }

}





/// 未完待续