内存调优和多态性

程序的调优GC.collect()只回收托管对象

对于非托管的不能回收

IDispose是实现了对资源的回收的接口解决

资源回收用using

Dispose close 的区别

托管:是属于.net管的对象

•       大排档和学校食堂。一个是别人帮你收拾盘子,一个是自己收拾盘子。

•       垃圾收集GCGarbage Collection)。内存的分配、回收不需要程序员操心,程序员只要需要的时候new就可以,用完了不用管,有人帮你清除不用的内存。这个人就是垃圾收集器.Net程序员一般不用像C++程序员那样处理内存的申请和回收,是因为有GC

•       GC优点:程序员不用关心内存的申请和回收,缺点:不用的内存不能立即得到回收(GC并不会实时去回收不用的内存,而是找时机才回收)。.net有没有内存泄露(Memory Leak)?

•       当对象一定不再有用的时候GC可以将对象回收了(悲观!)。判断一个对象是否一定不再有用的标准就是没有任何的变量指向它。当一个变量设置为null的时候。

Personp1=new Person(“lilei”);//在内存中创建了Person对象

Personp2 = p1;//p2指向p1指向的对象!这一刻p1指向着leileip2就顺着p1找到了lilei

p1=null;//p1不再指向lilei lilei不能回收,因此p2还在指着它

p2= newPerson(hanmeimei);//lilei可以回收,因为没有任何变量指着它。

当没有任何变量指向lilei的时候,就没法再顺着任何的变量把p3指向lilei了。

当一个对象一旦被最后一个指向它的变量抛弃的时候(=null或者变量出了作用域),不可能再有任何变量指向它,它就像断了线的风筝,再也飞不回来了,因此就可以被回收了。当一个对象找不回来的时候就可以被GC了。

•       不会再被使用的内存(对象)就是垃圾。

•       对象可以被回收不一定会立即回收,GC就像清洁工,不是有了垃圾就去清扫,否则GC累,而且清扫垃圾就影响系统的正常工作。服务员收盘子的时候都会影响旁边的人吃饭。频繁的GC(垃圾回收)造成系统性能下降,不是有了垃圾就清理。垃圾收集器会找一个合适的时机去回收。

•       GC.Collect();//服务员,收一下!就会立即进行内存的回收了

•       GC类中提供了对GC进行控制、监测的方法,比如GC.Collect()可以强制立即开始进行GC,但是一般不要去手动干预GC。没有特殊理由,不要去调用GC.Collect(),让.net自己决定什么时候去回收内存。

•       弱引用,WeakReference(见备注)

•       GC只能回收托管Managed内存资源,对于数据库连接、文件句柄、Socket连接等这些资源(非托管资源,UnManaged)就无能为例,必须程序员自己控制资源的回收。SqlConnectionFileStream等。

•       对于使用非内存资源的类,完全可以自己定义一个销毁资源的方法来供程序员回收,.net推荐实现IDisposable接口(为了规范非托管资源的回收),在Dispose方法中进行回收。

•       实现了IDisposable接口的对象都可以使用using进行资源管理。更简单。using就是帮我们做了:
FileStream fs = new F.....

•       try

•       fs.read()....}

•       finally

•       {

•           fs.Dispose();

•       }

•       实现了IDisposable接口的对象都要进行回收,否则很可能有内存泄露

•       非托管内存资源才需要实现IDisposable

classTelphone : IDisposable

...代码见备注

 

 

1、使用using进行资源管理

2Dispose中通常会顺便调用Close,这只是实现类自己的行为,没人强求, IDisposable中的 Dispose方法根本不知道Close方法的存在,甚至可以没有close方法。(CloseDispose关系常考)。没有规定Dispose一定会调用Close方法,但是很多的实现了IDisposable接口的方法中,通常都是代为调用Close之类的方法。一般的close只是关闭,也许关闭后还能打开,但是Dispose一般就表示资源被回收了,再也没法用了。有的类可能没有close方法。

 

•       CloseDispose的区别:

•       1、一个类如果实现IDisposable接口,则肯定有Dispose这个方法。

•       但是一个类可以没有Close方法,也可以不叫Close

•       2、即使像SqlConnectionFileStream这种有Close也有Dispose方法的,IDisposable接口也没有约定Dispose必须帮助Close,只不过一般的Dispose的实现都判断是否Close,如果没有Close则帮助Close,但是这是好心、不是义务。

 

字符串拘留池(Intern)*

 

1、因为字符串是不可变的,所以CLR可能会将相同值的字符串用同一个实例。程序中大量使用字符串,有不少是重复性的,为了降低内存占用,.Net将代码中声明的字符串放到字符串拘留池中,值相同的字符串共享同一个实例。字符串是不变的。不是所有字符串都在拘留池中,.Net会判断哪些该放。

2、object.ReferenceEquals方法判断两个变量是不是一个实例(同一个对象)

 string s1 = "abc";

 string s2 = "abc";

Console.WriteLine(object.ReferenceEquals(s1,s2));

3、动态字符串默认是不在字符串拘留池中的

 

 

 

1、因为字符串是不可变的,所以CLR可能会将相同值的字符串用同一个实例。程序中大量使用字符串,有不少是重复性的,为了降低内存占用,.Net将代码中声明的字符串放到字符串拘留池中,值相同的字符串共享同一个实例。字符串是不变的。不是所有字符串都在拘留池中,.Net会判断哪些该放。

2object.ReferenceEquals方法判断两个变量是不是一个实例(同一个对象)

 string s1 = "abc";

 string s2 = "abc";

Console.WriteLine(object.ReferenceEquals(s1,s2));

3、动态字符串默认是不在字符串拘留池中的

 

 

ReferenceEquals判断是否是同一个字符串

设计模式(重点是多态)

方法override

Socket和多线程

 

Virtual先看看调用子类有没有覆盖父类的方法,如果子类没有

就调用父类的方法

Abstractvirtual的区别

Abstract 是抽象方法不能有实现

Virtual是必须要有实现

 

都是有override重写

New你新建一个方法cts

String string的区别

String.net 下的类型CTS(commontype system)

Int int32也是一样

 

CLR(common language runtime)

 

String s=s1+s2;没有()就算从前往后执行

每一步都会产生一个临时字符串

Int i1=5;

Int i2=7;

String s1=i1+i2+””;

String s1=””+i1+i2;

运行的结果是?

几乎所有的类型和字符类型相+都是先tostring后字符串拼接

String s2=”a”+p1;

Cscc#编译器

命令编译器

.net formwork环境下可以用doc csc

类中不想让子类有override可以加个sealed

Abstract class animal

{

Abstract void speak();

}

Class cat:animal

{

 

}

 

多态的唯一的方法是父类可以调用子类的fangf

多态的重要性

 

        virtual方法和abstract方法的区别:

        virtual方法子类可以override,也可以不override。但是如果子类不是抽象类,那么父类定义的所有abstract成员子类都必须实现

        父类定义virtual方法的时候必须提供实现。父类定义abstract方法不能提供实现。

        一个类如果有至少一个抽象成员,那么类必须是abstract的。

        后面讲ADO.net多态再看这个例子:SqlConnectionDbConnectionDbConnection定义所有连接子类(SqlConnectionOracleConnection等)肯定有Close的动作,但是DbConnection不知道怎么Close,所以声明为Abstract,由子类实现。

接口中成员不需要标记修饰符

接口可以定义一个属性,索引

实现性的可以定义

 

求最大值得另一种算法委托

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 接口编程实现比较强

{

    class Program

    {

       static object GetMax(object[]values, Compare c)

        {

            objectmax = values[0];

            foreach(object obj invalues)

            {

                if(c(obj, max))

                {

                    max = obj;

 

                }

            }

            returnmax;

        }

        static void Main(string[] args)

        {

 

            object[]values = new object[]{

                1,5,3,2,4,9,6,7

            };

            Comparec = new Compare(Compare1);

 

           Console.WriteLine((int) GetMax(values, c));

           Console.Read();

        }

        static bool Compare1(objectobj1, object obj2)

        {

            return(int)obj1 > (int)obj2;

        }

       

       

    }

    delegate bool Compare (object obj1,objectobj2);

 

}

 

接口实现比较器实现的多态

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 接口实现比较器

{

    class Program

    {

        static void Main(string[] args)

        {

            object[]values = new object[]{

                1,5,3,2,4,9,6,7

            };

            Mycomparec = new TaCompare();

 

            Console.WriteLine((int)GetMax(values, c));

            Console.Read();

        }

        static object GetMax(object[]values, Mycompare c)

        {

            objectmax = values[0];

            foreach(object obj invalues)

            {

                if(c.Compare(obj, max))

                {

                    max = obj;

 

                }

            }

            returnmax;

        }

    }

    class TaCompare :Mycompare

    {

 

        public bool Compare(objectobj1, object obj2)

        {

            return(int)obj1 > (int)obj2;

        }

    }

    interface Mycompare

    {

        boolCompare(object obj1, objectobj2);

    }

}

 

SqlCommand cmd = new SqlCommand()

SqlCommand cmd = conn.CreateCommand()

IDbCommand cmd = conn.CreateCommand()

第三种写法最好。SQLServerAccess(文件型数据库,连接字符串用VS“服务器资源管理器生成)的Command分别是SqlCommandOleDbCommand类型,如果把它们写死在程序里切换数据库需要改很多地方。SqlCommand OleDbCommand都实现了IDbCommand接口,不用具体的类型来接收返回值,这样就可以将改动减少的最小

以后写程序尽量用IDbConnection IDbCommandIDataParameter这些类型

创建参数用IDataParameterparameter = cmd.CreateParameter()

能用父类就不要用子类,能用接口就不要用类

写一个可以通过配置文件来分别从AccessMSSQL中读取数据的类

 

程序的调优GC.collect()只回收托管对象

对于非托管的不能回收

IDispose是实现了对资源的回收的接口解决

资源回收用using

Dispose close 的区别

托管:是属于.net管的对象

•       大排档和学校食堂。一个是别人帮你收拾盘子,一个是自己收拾盘子。

•       垃圾收集GCGarbage Collection)。内存的分配、回收不需要程序员操心,程序员只要需要的时候new就可以,用完了不用管,有人帮你清除不用的内存。这个人就是垃圾收集器.Net程序员一般不用像C++程序员那样处理内存的申请和回收,是因为有GC

•       GC优点:程序员不用关心内存的申请和回收,缺点:不用的内存不能立即得到回收(GC并不会实时去回收不用的内存,而是找时机才回收)。.net有没有内存泄露(Memory Leak)?

•       当对象一定不再有用的时候GC可以将对象回收了(悲观!)。判断一个对象是否一定不再有用的标准就是没有任何的变量指向它。当一个变量设置为null的时候。

Personp1=new Person(“lilei”);//在内存中创建了Person对象

Personp2 = p1;//p2指向p1指向的对象!这一刻p1指向着leileip2就顺着p1找到了lilei

p1=null;//p1不再指向lilei lilei不能回收,因此p2还在指着它

p2= newPerson(hanmeimei);//lilei可以回收,因为没有任何变量指着它。

当没有任何变量指向lilei的时候,就没法再顺着任何的变量把p3指向lilei了。

当一个对象一旦被最后一个指向它的变量抛弃的时候(=null或者变量出了作用域),不可能再有任何变量指向它,它就像断了线的风筝,再也飞不回来了,因此就可以被回收了。当一个对象找不回来的时候就可以被GC了。

•       不会再被使用的内存(对象)就是垃圾。

•       对象可以被回收不一定会立即回收,GC就像清洁工,不是有了垃圾就去清扫,否则GC累,而且清扫垃圾就影响系统的正常工作。服务员收盘子的时候都会影响旁边的人吃饭。频繁的GC(垃圾回收)造成系统性能下降,不是有了垃圾就清理。垃圾收集器会找一个合适的时机去回收。

•       GC.Collect();//服务员,收一下!就会立即进行内存的回收了

•       GC类中提供了对GC进行控制、监测的方法,比如GC.Collect()可以强制立即开始进行GC,但是一般不要去手动干预GC。没有特殊理由,不要去调用GC.Collect(),让.net自己决定什么时候去回收内存。

•       弱引用,WeakReference(见备注)

•       GC只能回收托管Managed内存资源,对于数据库连接、文件句柄、Socket连接等这些资源(非托管资源,UnManaged)就无能为例,必须程序员自己控制资源的回收。SqlConnectionFileStream等。

•       对于使用非内存资源的类,完全可以自己定义一个销毁资源的方法来供程序员回收,.net推荐实现IDisposable接口(为了规范非托管资源的回收),在Dispose方法中进行回收。

•       实现了IDisposable接口的对象都可以使用using进行资源管理。更简单。using就是帮我们做了:
FileStream fs = new F.....

•       try

•       fs.read()....}

•       finally

•       {

•           fs.Dispose();

•       }

•       实现了IDisposable接口的对象都要进行回收,否则很可能有内存泄露

•       非托管内存资源才需要实现IDisposable

classTelphone : IDisposable

...代码见备注

 

 

1、使用using进行资源管理

2Dispose中通常会顺便调用Close,这只是实现类自己的行为,没人强求, IDisposable中的 Dispose方法根本不知道Close方法的存在,甚至可以没有close方法。(CloseDispose关系常考)。没有规定Dispose一定会调用Close方法,但是很多的实现了IDisposable接口的方法中,通常都是代为调用Close之类的方法。一般的close只是关闭,也许关闭后还能打开,但是Dispose一般就表示资源被回收了,再也没法用了。有的类可能没有close方法。

 

•       CloseDispose的区别:

•       1、一个类如果实现IDisposable接口,则肯定有Dispose这个方法。

•       但是一个类可以没有Close方法,也可以不叫Close

•       2、即使像SqlConnectionFileStream这种有Close也有Dispose方法的,IDisposable接口也没有约定Dispose必须帮助Close,只不过一般的Dispose的实现都判断是否Close,如果没有Close则帮助Close,但是这是好心、不是义务。

 

字符串拘留池(Intern)*

 

1、因为字符串是不可变的,所以CLR可能会将相同值的字符串用同一个实例。程序中大量使用字符串,有不少是重复性的,为了降低内存占用,.Net将代码中声明的字符串放到字符串拘留池中,值相同的字符串共享同一个实例。字符串是不变的。不是所有字符串都在拘留池中,.Net会判断哪些该放。

2、object.ReferenceEquals方法判断两个变量是不是一个实例(同一个对象)

 string s1 = "abc";

 string s2 = "abc";

Console.WriteLine(object.ReferenceEquals(s1,s2));

3、动态字符串默认是不在字符串拘留池中的

 

 

 

1、因为字符串是不可变的,所以CLR可能会将相同值的字符串用同一个实例。程序中大量使用字符串,有不少是重复性的,为了降低内存占用,.Net将代码中声明的字符串放到字符串拘留池中,值相同的字符串共享同一个实例。字符串是不变的。不是所有字符串都在拘留池中,.Net会判断哪些该放。

2object.ReferenceEquals方法判断两个变量是不是一个实例(同一个对象)

 string s1 = "abc";

 string s2 = "abc";

Console.WriteLine(object.ReferenceEquals(s1,s2));

3、动态字符串默认是不在字符串拘留池中的

 

 

ReferenceEquals判断是否是同一个字符串

设计模式(重点是多态)

方法override

Socket和多线程

 

Virtual先看看调用子类有没有覆盖父类的方法,如果子类没有

就调用父类的方法

Abstractvirtual的区别

Abstract 是抽象方法不能有实现

Virtual是必须要有实现

 

都是有override重写

New你新建一个方法cts

String string的区别

String.net 下的类型CTS(commontype system)

Int int32也是一样

 

CLR(common language runtime)

 

String s=s1+s2;没有()就算从前往后执行

每一步都会产生一个临时字符串

Int i1=5;

Int i2=7;

String s1=i1+i2+””;

String s1=””+i1+i2;

运行的结果是?

几乎所有的类型和字符类型相+都是先tostring后字符串拼接

String s2=”a”+p1;

Cscc#编译器

命令编译器

.net formwork环境下可以用doc csc

类中不想让子类有override可以加个sealed

Abstract class animal

{

Abstract void speak();

}

Class cat:animal

{

 

}

 

多态的唯一的方法是父类可以调用子类的fangf

多态的重要性

 

        virtual方法和abstract方法的区别:

        virtual方法子类可以override,也可以不override。但是如果子类不是抽象类,那么父类定义的所有abstract成员子类都必须实现

        父类定义virtual方法的时候必须提供实现。父类定义abstract方法不能提供实现。

        一个类如果有至少一个抽象成员,那么类必须是abstract的。

        后面讲ADO.net多态再看这个例子:SqlConnectionDbConnectionDbConnection定义所有连接子类(SqlConnectionOracleConnection等)肯定有Close的动作,但是DbConnection不知道怎么Close,所以声明为Abstract,由子类实现。

接口中成员不需要标记修饰符

接口可以定义一个属性,索引

实现性的可以定义

 

求最大值得另一种算法委托

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 接口编程实现比较强

{

    class Program

    {

       static object GetMax(object[]values, Compare c)

        {

            objectmax = values[0];

            foreach(object obj invalues)

            {

                if(c(obj, max))

                {

                    max = obj;

 

                }

            }

            returnmax;

        }

        static void Main(string[] args)

        {

 

            object[]values = new object[]{

                1,5,3,2,4,9,6,7

            };

            Comparec = new Compare(Compare1);

 

           Console.WriteLine((int) GetMax(values, c));

           Console.Read();

        }

        static bool Compare1(objectobj1, object obj2)

        {

            return(int)obj1 > (int)obj2;

        }

       

       

    }

    delegate bool Compare (object obj1,objectobj2);

 

}

 

接口实现比较器实现的多态

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 接口实现比较器

{

    class Program

    {

        static void Main(string[] args)

        {

            object[]values = new object[]{

                1,5,3,2,4,9,6,7

            };

            Mycomparec = new TaCompare();

 

            Console.WriteLine((int)GetMax(values, c));

            Console.Read();

        }

        static object GetMax(object[]values, Mycompare c)

        {

            objectmax = values[0];

            foreach(object obj invalues)

            {

                if(c.Compare(obj, max))

                {

                    max = obj;

 

                }

            }

            returnmax;

        }

    }

    class TaCompare :Mycompare

    {

 

        public bool Compare(objectobj1, object obj2)

        {

            return(int)obj1 > (int)obj2;

        }

    }

    interface Mycompare

    {

        boolCompare(object obj1, objectobj2);

    }

}

 

SqlCommand cmd = new SqlCommand()

SqlCommand cmd = conn.CreateCommand()

IDbCommand cmd = conn.CreateCommand()

第三种写法最好。SQLServerAccess(文件型数据库,连接字符串用VS“服务器资源管理器生成)的Command分别是SqlCommandOleDbCommand类型,如果把它们写死在程序里切换数据库需要改很多地方。SqlCommand OleDbCommand都实现了IDbCommand接口,不用具体的类型来接收返回值,这样就可以将改动减少的最小

以后写程序尽量用IDbConnection IDbCommandIDataParameter这些类型

创建参数用IDataParameterparameter = cmd.CreateParameter()

能用父类就不要用子类,能用接口就不要用类

写一个可以通过配置文件来分别从AccessMSSQL中读取数据的类

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值