new对象时,当可分配的内存不足GC就会去回收未使用的对象,但是GC的操作是非常复杂的,会占用很多CPU时间,对于移动设备来说频繁的垃圾回收会严重影响性能。下面的建议可以避免GC频繁操作。
- 减少用new创建对象的次数,在创建对象时会产生内存碎片,这样会造成碎片内存不法使用
- 使用公用的对象(静态成员,常量),但是不能乱用,因为静态成员和常量的生命周期是整个应用程序。
- 在拼接大量字符串时StringBuilder。在使用注意,创建StringBuilder对象时要设置StringBuilder的初始大小如:
- StringBuilder sbHtml = new StringBuilder (size);
- 使用object pool(对象池)
5、请描述Interface与抽象类之间的不同
相同点:
- 都可以被继承
- 都不能被实例化
- 都可以包含方法声明
- 派生类必须实现未实现的方法
区别:
- 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
- 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。
- 抽象类只能被单一继承,接口可以被多重实现。
- 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
- 抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
- 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法
- 接口可以用于支持回调,而继承并不具备这个特点
- 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的
- 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
6、下列代码在运行中会产生几个临时对象?
- string a = new string(“abc”); a = (a.ToUpper() +“123”).Substring(0, 2);C#会报错,java可行(个人认为答完这个即可)。
- C#中应该是 string b = new string(new char[] {‘a’,‘b’,‘c’});产生五个临时变量。
**7、**下列代码在运行中会发生什么问题?如何避免?
List<int> ls = new List<int>(new int[] { 1,2,3,4,5});
foreach (var item in ls)
{
Console.WriteLine(item*item);
ls.Remove(item);
}
会产生运行时错误,不能一边遍历一边修改。建议使用for循环来代替,foreach建议只用在读取上,不用在修改上。
8、请简述关键字Sealed用在类声明和函数声明时的作用
类声明时可防止其他类继承此类,在方法中声明则可防止派生类重写此方法。