值类型和引用类型的区别?
值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。
值类型存取速度快,引用类型存取速度慢。
值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
值类型继承自System.ValueType,引用类型继承自System.Object
栈的内存分配是自动释放;而堆在.NET中会有GC来释放
值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。
何时必须声明一个类为抽象类?
当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时
foreach和for循环谁的效率高?switch和if呢?
foreach高,for 循环每次都要进行判断i的大小,foreach 依赖 IEnumerable.第一次 var a in GetList() 时调用 GetEnumerator 返回第一个对象并赋给a,以后每次再执行 var a in GetList()的时候 调用 MoveNext.直到循环结束。期间GetList()方法只执行一次.
同样的道理:当有多个判断时,switch更快。
out 和 ref的区别与相同点
out 和 ref都指示编译器传递参数地址,在行为上是相同的;
他们的使用机制稍有不同,ref要求参数在使用之前要显式初始化,out要在方法内部初始化;
out 和 ref不可以重载,就是不能定义Method(ref int a)和Method(out int a)这样的重载,从编译角度看,二者的实质是相同的,只是使用时有区别:
使用ref型参数时,传入的参数必须先被初始化,对out而言,必须在方法中对其完成初始化
使用ref和out时,在方法的参数和执行方法时,都要加ref或out关键字,以满足匹配
out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候
简述 private、 protected、 public、 internal、protected internal 访问修饰符和访问权限
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 当前程序集内可以访问。
protected internal: 访问仅限于当前程序集或从包含类派生的类型。
不带修饰符的类是默认internal。
virtual,sealed,override,abstract的区别?
virtual声明虚方法的关键字,说明该方法可以被重写
sealed说明该类不可被继承
override重写基类的方法
abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。
什么是匿名方法?请写一段代码。
delegate(int i) { return i > 0; }
接口和抽象类有什么区别?
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract,class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型
下面比较一下两者的语法区别:
抽象类可以有构造方法,接口中不能有构造方法。
抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
抽象类中抽象方法可以指定为public,接口中抽象方法不能指定任何修饰符,默认就是public
一个类可以实现多个接口,但只能继承一个抽象类。
public static const int A=1;这段代码有错误么?是什么?
const不能用static修饰
写一个单例模式。
public class Singleton
{
private static Singleton _Singleton = null;
private static object Singleton_Lock = new object();
public static Singleton CreateInstance()
{
if (_Singleton == null) //双if +lock
{
lock (Singleton_Lock)
{
Console.WriteLine("路过。");
if (_Singleton == null)
{
Console.WriteLine("被创建。");
_Singleton = new Singleton();
}
}
}
return _Singleton;
}
}