.Net常见的一些区别
说明:这是面试过程中整理的,不全是我原创的,感谢原作者。
如果错误,请指正,不胜感激。。
一,Equals()和==的区别
1,值类型,对象的值相等,则都返回True
2,引用类型,==比较的是两个变量的值是否相等,或两个引用是不是指向同一个内存地址,对于string类型,比较的是值。
equals()方法比较的是两个对象指向的内存空间的内容是否相同,也就是比较两个引用类型是否是同一个对象的引用。
object o1=s1;
object o2=s2;
o1==o2 //True 另外默认情况下引用相等,==和Equals一样
o1.Equals(o2) //True 同一个对象存储空间的内容相等
ClassA a=new ClassA("CC");
ClassA b=new ClassA("CC");
a==b //False 两个不同的对象,内存地址不同
a.Equals(b) //False 对不同对象的引用
ClassA a=new ClassA("CC");
ClassA b=a;
a==b //True b=a,赋值操作,所以内存指向同一个地址
a.Equals(b) //true 同一个对象的引用
二,const和readonly的区别
1,readonly和const都是用来标示常量的标示符
2,const必须在声明的同时赋值
public const int MaxValue=10 //正确
public const int MaxValue //错误
readonly可以再初始化(声明或构造函数)的过程中赋值,其他地方不能进行赋值,否则会编译报错
public class Class1
{
public readonly int a=10 //正确
public const int b
public Class1
{
b=10;
}
protected void Load()
{
b=23 //正确
}
}
3,const要求编译时计算出确定的值,不能用变量初始化,readonly可以用某些变量初始化,在运行时确定值
4,const默认是静态的,readonly设置成静态的必须声明
5,object Array(数组) strut(结构)不能被声明为const
三,private,protected,public,internal的区别
private,是私有的,只能在类内部调用,子类不能继承private的属性和方法
protected,自己和自己的子类可以调用
public,对任何类成员完全开放,无限制
internal,同一个引用程序集内部,不是解决方案
四,sealed,new,virtual,abstract,override
sealed,不能继承,不能重写,当应用于方法和属性时,sealed必须和override一起使用
new,现实隐藏基类的成员,在子类调用是new新定义出来的,不是基类的方法
virtual,虚成员,可以由子类中的方法重写更改,不能将virtual和static,abstract,override一起使用
abstract,抽象,可以继承,只能在抽象类中使用抽象方法,不能被实例化,不提供实际实现,没有方法体
override,重写,重写基类方法必须是抽象的,虚拟的,重写的,
五,Server.Transfer()和Response.Redirect区别
1,前者是在服务器端跳转,浏览器地址不变,后者是在客户端跳转,地址栏变化,前者性能比后者好
2,前者只能在同一服务器的同一站点运行,后者可以定向到不同的服务器
3,在网站内部尽量使用Server.Transfer(),定向外面是用Response.Redirect
六,get和post的区别
1,get提交表单时值和表单一一对应,在URL显现出来,post不会显现出来。
2,get使用Rquest.QuerString[],post使用Request.From[];
3,get最大为2k,post理论上不受限制,get安全性比post低
七,ref和out:
ref与out是很特殊的两个关键字。使用它们,可以使参数按照引用来传递。
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。
区别:
out 参数在进入方法(函数)时后清空自己,使自己变成一个干净的参数,也因为这个原因必须在方法返回之前或再使用out参数前为 out 参数赋值(只有地址没有值的参数是不能被.net接受的);
ref参数是不需要在被调用方法使用前先赋值的,甚至也可以被调用方法中不改变ref参数的 值,这都不会引起编译错误。
ref参数在使用前必需初始化,而out不需要。
out参数只进不出,ref参数有进有出。
用法上概括一下就是:out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。