finalize方法:终结器。

实现了终接器会大大的降低程序的性能。

释放模式:【非托管资源释放】

手动释放{dispose()方法或者close()方法。True非托管资源释放或者是托管资源释放【我们的类包含了其他 类,这个时候我么就可以在这里对其进行释放,而一般情况下,托管资源是被垃圾回收站回收的。】}---阻止finalize的调用。

自动释放(finalize()方法。false非托管资源释放)


public class myresource:IDisposable

{

private bool disposed=false;  

public void dispose()

{


}

  public void close()

{


}

~myresource()

{


}

private void dispose(bool disposing)

{

判断句//

}

}


类的修饰符:

访问控制修饰符;[包括了:default;public;private;internal;protected;protected internal.]

Class mod

    void defaultMethod();

{

    console.writeline("");

}



//对于方法的调用是先实例化,然后再进行调用:

Mod mod=new Mod();//实例化。

mod.defaultMethod();//调用过程。


两个类要能够相互可见的话可以将这两个 类放在同一个命名空间下面。



类专用修饰符:

sealed:不能被继承的类;

partial:能声明在不同的文件中的类。



类型的转换:

隐式转换:

显式转换:

代码:、

class conversions

{

    static void main()

{

   int a=4;//system.int32

   long b;//system.int64

    b=a;//隐式转换

    console.writeline(a);

}

}


可以先对于上面设置的两个变量进行初始化,然后再进行输出操作。

显式转换就是这样子的:a=(int)b;


checked和unchecked操作符和语句:

在显式转换前面加入checked操作服。


在程序中有一句话:

messagebox.show("fashengyichu")能够弹出一个对相框。


这里还有一种感觉就是:

b=b+100;

b+=100;

这个时候最开始的初始化b为byte类型,所以这两句话是有区别的,上面第一句话在操作的时候是很容易出错的,修改的方式是:在右边的表达式上加入:

b=(byte)(b+100);

这个时候跟下面那句话就保持一致了。

而下面这句话,因为在右边的是byte类型的常量,所以就十分直接的隐式转换成了byte类型了。


引用类型的转换:

CLR允许强制的转化。


Fruit f=new Apple();//直接说明了子类可以被强制转换成为自己的父类。

而要强调的是父类不能转换成任何一个子类。


要想确切的知道一个对象的类型可以调用gettype()方法。


type t=f.gettype();//*********


Apple a=(Apple)f;//类型转换的方式。

也可以在输出的语句中对于参数中的对象进行转换。


用is操作符:

console.writeline(f is fruit);

console.writeline(f is apple);

console.writeline(a is fruit);

console.writeline(a is apple);

运行的结果是:

True;

false;

true;

true;

这里我们知道了在使用is操作符的时候只会打印输出bool值,也就是true和false。


as的意义:比方说:apple a=f as apple;//这里说明的是如果f兼容与apple,那么a的返回值就是true,反之就是false。这样下面的判断语句就会用判断表达式:a!=NULL。


foreach循环 ??????



controls属性表示的是返回值是一个集合 。

foreach(control c in this.controls)

{

   listbox1.items.add(c.name);

   control c1=c as button;

    if(c1!=null)

{

    c1.text="kkkkkkkkkkk";

}

}//强制类型转换的一个简单的例子。



属性:

class user

{

    private string m_name;

    private string m_sex;

//

public void setname(string values)

{name=values;}

public string getname()

{

return name;

}

public void setsex(string values)

{

    if (values==""||values=="")

{

    sex=values;

}

else{

    console.writeline("性别只能为“男”或“女”");

}

}

public string getsex()

{

    return sex;

}

   public name

{

get{

     return name;

}

set{

    name=values;

 }

public sex

{

   get{return sex}

   set{

    [if判断语句]

}

}

}

//

}

class property

{

   static void main()

{

    user zs=new user();

    zs.name=("张三");

    zs.sex=("男");

    console.writeline("姓名:"+zs.getname+"性别:"+zs.getsex)

 zs.name="张三";

    zs.sex="男";

    console.writeline("姓名:"+zs.name+"性别:"+zs.sex)

}


属性的调用跟类的字段的调用是一模一样的。

static属性:只能访问静态的。


弹出对话框的上面就是Using system.windows.forms;


年龄属性应该根据生日生成一个动态的字段 。


private static int m_logincount;

public user()

{m_logincount++;}

public static int logincount

{get

{

return m_logincount;

}

}//只读属性。


索引器:

类似于属性。索引器被称为 有参属性。


class arrclass

{

   private readonly string name;

   public arrclass(string name)

{

   this.name=name;

}

public string name

{

   get(return name;)

}

}

class test

{

   static void main()

{

   arrclass[] a=new arrclass[10];

a[0]=new arrclass("");

a[1]=new arrclass("");

a[2]=new arrclass("");

console.writeline("a[0]="+a[0].name);

console.writeline("a[1]="+a[1].name);

console.writeline("a[2]="+a[2].name);

}

}


要定义一个索引器就必须要this,还要加上中括号。


索引器只需要申明一个实例,而类需要声明多个实例。


哈希表:【容器】

key通常可用来快速查找。

给hashtable里面加值是通过add来进行操作的。


代码:

Class indexclass//带索引器的类。

{

   private hashtable name=new hashtable();

   public string this[int index]

{

   get{return name[index].tostring();}

   set{name.add(index,value);}

}

}

  class test

 {

   static void  main()

{

//索引器的使用。

   indexclass b=new indexclass();

   b[100]="zghan";

   b[200]="kkkkk";

   b[300]="ksldjflksdj";

console.writeline("jjjj"+b[100]);

*******//此处略去三个字!

}

}


索引器和数组的比较:

类数组的 存放 :

索引器有get访问器和set访问器。没有存放变量的地方。

索引器允许重载,


Int[] a=new int[3]

a[0]=1;

a[1]=2;

a[2]=3;//数组的存放。


class arrclass

{}

......

arrclass[]a=new arrclass[3];

a[0]=new arrclass();

a[1]=new arrclass();

a[2]=new arrclass();

//类数组的 存放。


this的关键作用:索引器只能使用this。


public int this[string aname]

{

  get{

       

}

  set{


}

}



索引器不能被声明为静态的。


代码实例:

  Using system;

  using systemcollections;

//姓名。课程id。成绩。

  class coursescore

{

    private string name;

    private int courseid;

    private int score;

    public coursescore(string name,int courseid,int score)

{

this.name=name;

this.couseid=couseid;

this.score=score;

}

  public string name

{

  get{}

  set{}

}

}

class coursescoreindexer

{

private arraylist arrcoursescore;

public couresescoreindexer()

{

    arrcoursescore=new arraylist();

}

  public int this[string name,int courseid]

{

  get

{

   foreach(coursescore cs in arrcoursescore)

{

   if (cs.name==name$$cs.courseid==courseid)

{

  return cs.score;

}

}

return -1;

}

set

{

arrcoursescore.add(new coursescore(name,courseid,value))

}

}


public arraylist this[string name]

{

  get{}

}

}

class Test

{

static void main()

{

  coursescoreindexer csi=new coursescoreindexer();

  csi["",1]=90;

  console.writeline(csi["",1]);

  console.wroteline("chengjiwei:")

}

}


现在将的是C#程序语言的规范:


bitarray类;

可以存放任何长度的。


左移相当于乘以2;右移相当于除以2.


索引器的返回值是bool值,所以在实现的时候最开始的一句话是:

public bool this[int index]

{......}


>>符号表示的是往右移动位数;

<<符号表示的是往左移动位数;


&运算符:都是1的情况下才会最终的结果是1.


~运算符在C#中是按位求补的操作。【0:1;1:0.】



如何使用bitarrary类: