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; }

浙公网安备 33010602011771号