M_ary  
本人热爱编程...更期待和谐的团队.. 有意者,请发送邮件与我.. wangkang198802@126.com

1)JS中的正则表达式  

  1  Var regex=new RegExp("\\d{5}") ; var regex=/\d{5}/;  

  2  是否匹配:regex.text(str) ;返回bool;  

  3  提取分组:var s="aaa@126.com"  ;   var  regex=//;  s.match(regex) ;  RegExp.$1+RegExp.$2;

2)关于C #内存管理机制  

  1  只管尽情的new,因为c#有GC(Garbage Collection)进行垃圾的收集。所以内存的分配、回收不需要程序员操心。  

  2  但缺点是,不用的内存不能立即进行回收,因为GC不会实时去回收不用的内存,而是找时机 才回收。  

  3  .net中也有内存泄露(不用的对象,不能回收)。  

  4  何时可以GC:当对象一定不再使用(没有任何变量指向该对象时)的时候GC就可以将对象回收。两种情况:一种是出了作用域,一种是变量又指向了null。那么原来的对象就不再存在。  

  5  static变量一直会有东西指着它,不会在局部被回收。  

  6  以上是对象可以被回收的情况,但不会立即进行回收,因为频繁的GC会赞成程序,造成系统性能下降。它会找到一个合适的时机去回收。GC.Collect();//立即回收;  

  7  如何检测一个对象是否被回收:因为只要一个变量指向该对象,该对象就不会被回收;所以C#中有weakReference;来实现可以指向一个对象,仅是指向,并不影响GC。

    Person p1=new Person();   

    WeakReference  wr=new  WeakReference(p1);   

    p1=null;   //对象为null,此时wr指向,但是为若引用,仅是用于检测是否被回收

    GC.Collect();  //不一定会立即回收,所以 wr.IsAlive; //判断是否还活着; 

3)关于托管资源的GC和非托管资源的类IDisposable  

  1  GC只能回收托管资源,但对于非托管资源(DB连接,文件句柄,socket连接)必须由程序员自己进行资源控制。  

  2   对于非内存资源的类,.Net推荐该类实现了IDisposable接口,因为实现了该接口的对象都可以使用using进行资源管理。  

  3  using本质:出了该using作用域后,会调用其Dispose方法。try{}catch(){}finally{fs.Dispose();}==using(fs)  

  4  Dispose()和Close();区别:

    首先Dispose()是接口IDispose的方法;而SqlConnection和Filetream这些类才有CLose();在其实现了Dispose()中,会帮助调用Close()。

    当然,close(),不是必须的。因为Close()仅是关闭,因为关闭后还可以打开,但是Dispose(),表示资源被回收销毁了,再也不能使用了。

4)关于string和StringBuilder  

  1  因为string具有不可变性,因此每次运算都会重新创建一个对象。所以,在进行大量字符串拼接时,就会产生大量的字符串对象,占用大量的内存。

   所以,在要进行动态拼接字符串操作时,可以使用StringBuilder来代替string。

5)关于CLR内存管理  

  1  CLR的出现,避免了application直接对OS进行内存的操作(索取和释放),这样application直接向CLR要对象,当对象不再使用时,不用告诉CLR说,'我不使用了',CLR会根据'该对象是否有变量指向',来判断是否回收该对象,这样避免了因程序员忘记回收,而导致的内存泄露(不再使用的对象,任然占据内存的现象)。

  2  即让CLR进行对OS的操作,将内存交给CLR进行管理,这样避免了程序员进行资源的管理。此为托管。这样,在application和OS之间办事的东东叫做CLR,也称作虚拟机。  

  3  所以CLR就是中间层,就是虚拟机。

6) 字符串拘留池  

  1  值相同的字符串共享一个实例。.Net代码中将声明的字符串放到字符串拘留池中。      

   因为字符串具有不可变性,所以CLR可能会将相同值的字符串用同一个实例。存储值相同的字符串的一个地方,称为字符串拘留池。  

  2  object.ReferenceEquals(s1,s2)  //判断两个变量是否指向同一个对象。  

  3   string s1="abc";string s2="abc";  因为有字符串拘留池的存在,所以程序只有一个string对象。  

  4   string s1="abc";string s2=new String("abc".ToCharArray()); //因为new就一定会创建一个对象,所以为两个string对象。  

  5   关于值相同的字符串是否用同一个对象,这种方法只有在写入的代码中有效,在控制台中输入的则无效,不会进入拘留池。

7)关于结构体  

  1  是值类型,是拷贝,成员与类一样。结构体没有引用,两者可以用Object.ReferenceEquals();来区别。  

  2  Int32和struct类和Boolean的父类都是ValueType;
8)关于引用就是指向,不是拷贝  

  1  DataGridView dgv1=new DataGridView();      

    DataGridView dgv2=dgv1;  //指向      

    dgv1.clear();  //清除      

    dgv1=dgv2;   //错误,因为dgv1和dgv2指向同一个对象,上面已经清除,所以对象已经不再存在;

9)关于深层拷贝和浅层拷贝  

  1 浅层拷贝:两个对象指向同一个对象;即拷贝类第一层成员,且若成员是引用类型,则引用同一份。      

  public object Clone()      

  {          

    Person p2 = new Person();          

    p2.age = this.age;          

    p2.name = this.name;          

    p2.Dog = this.Dog;    

    //Person p2=p1.Clone(); 那么此时p2.Dog所指向的对象为P1所指向的对象。          

    return p2;       }  

  2  对象只要一new;就会创建出来,且成员为相应类型的默认值。  

  3  深层拷贝:两个对象指向不同的对象,即除了值类型,对象引用的对象和对象的对象引用的对象...都拷贝一份。       public object Clone()       {           Person p2 = new Person();           p2.age = this.age;           p2.name = this.name;           p2.Dog = this.Dog.Clone;    //Person p2=p1.Clone(); 那么此时p2.Dog所指向的对象为new的一个新的对象           return p2;       }  

  4  浅层拷贝的简写。       public object Clone()       {           Person p=(Person)MemberwiseClone();  //是protected方法           return p;       }

posted on 2011-06-30 11:57  M_ary  阅读(233)  评论(0)    收藏  举报