【1】 new一个class对象和new一个struct或者enum有什么不同?
new一个class的时候,做了两步,1是通过调用newboj命令来为实例在托管堆中分配内存,2是调用构造函数来实现对象初始化
new一个statuct时候,new用于调用其带构造函数,完成实例的初始化
【2】 new在.NET中有几个用途,除了创建对象实例,还能做什么?
1.用作运算符创建新的对象,2用作修饰符,在子类中隐藏父类成员,
(作为修饰符,基本的规则可以总结为:实现派生类中隐藏方法, new作为修饰符,实现隐藏基类成员时,不可和override共存,原因是这两者语义相斥:new用于实现创建一个新成员,同时隐藏基类的同名成员;而override用于实现对基类成员的扩展。)
3.在泛型中用作约束(约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数)
4.用作多态
【3】new运算符,可以重载吗?
不可重载
【4】范型中,new有什么作用?
用作约束,提供一个无参数公用的构造函数
【5】new一个继承下来的方法和override一个继承方法有何区别?
new一个继承的方法是吧父类的方法隐藏了,在新建一个方法(对父类方法没有影响),而override一个继承的方法是对父类方法的扩充改造(修改了父类的方法),
【6】int i和int i = new int()有什么不同?
int i是创建变量,不分配内存空间
int i = new int()是创建变量并且分配内存空间,值为0
int a=0;定义一个int型的变量,在使用之前必须赋值
Int a = New Int(); 实例化一个int类型对象,具有int型的属性和方法
int i 和 int i = new int()作为类的成员,也就是字段定义时,是没有区别的,因为会自动完成初始化,此时的int i中的i被默认 为0;而如果int i和int i = new i()作为一个方法的变量定义时,二者是有区别的,此时的new i()会进行初始化处理
2.作为修饰符,用于向基类成员隐藏继承成员
作为修饰符,基本的规则可以总结为:实现派生类中隐藏方法,则基类方法必须定义为virtual;new作为修饰符,实现隐藏基类成员时,不可和override共存,原因是这两者语义相斥:new用于实现创建一个新成员,同时隐藏基类的同名成员;而override用于实现对基类成员的扩展。
另外,如果在子类中隐藏了基类的数据成员,那么对基类原数据成员的访问,可以通过base修饰符来完成。
namespace WebApplication1
{
public partial class WebForm46 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Number num = new Number();
num.ShowNumber();
IntNumber intNum = new IntNumber();
intNum.ShowNumber();
intNum.ShowInfo();
Number number = new IntNumber();
//究竟调用了谁?
number.ShowInfo();
//究竟调用了谁?
number.ShowNumber();
}
}
class Number
{
HttpResponse resp = HttpContext.Current.Response;
public static int i = 123;
public void ShowInfo()
{
resp.Write("base class---");
}
public virtual void ShowNumber()
{
resp.Write(i.ToString());
}
}
class IntNumber : Number
{
HttpResponse resp = HttpContext.Current.Response;
new public static int i = 456;
public new virtual void ShowInfo()
{
resp.Write("Derived class---");
base.ShowInfo();
}
public override void ShowNumber()
{
resp.Write("Base number is "+Number.i.ToString());
resp.Write("New number is "+i.ToString());
}
}
}
对于基本类型来说,使用new操作符来进行初始化的好处是,某些构造函数可以完成更优越的初始化操作,而避免了不高明的选择,例如:
string str = new string('*', 100);
string str = new string(new char[] {'a', 'b', 'c'});
而不是
string str = "***************************************";