加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

[你必须知道的.NET] 第五回:深入浅出关键字---把new说透

发布时间:2020-12-15 21:12:06 所属栏目:asp.Net 来源:网络整理
导读:div style="FONT-SIZE: 10pt" 面向对象基本概念 new关键字深入浅出 对象创建的内存管理? new一个class对象和new一个struct或者enum有什么不同? new在.NET中有几个用途,除了创建对象实例,还能做什么? new运算符,可以重载吗? 范型中,new有什么作用? ne

<div style="FONT-SIZE: 10pt">

  • 面向对象基本概念
  • new关键字深入浅出
  • 对象创建的内存管理?

  1. new一个class对象和new一个struct或者enum有什么不同?
  2. new在.NET中有几个用途,除了创建对象实例,还能做什么?
  3. new运算符,可以重载吗?
  4. 范型中,new有什么作用?
  5. new一个继承下来的方法和override一个继承方法有何区别?
  6. int i和int i = new int()有什么不同?

  • 作为运算符, 用于创建对象和调用构造函数。

  • 作为修饰符,用于向基类成员隐藏继承成员。

using?System;namespace?Anytao.net.My_Must_net{????class?Number????{????????public?static?int?i?=?123;????????public?void?ShowInfo()????????{????????????Console.WriteLine("base?class---");????????}????????public?virtual?void?ShowNumber()????????{????????????Console.WriteLine(i.ToString());????????}????}????class?IntNumber?:?Number????{????????new?public?static?int?i?=?456;????????public?new?virtual?void?ShowInfo()????????{????????????Console.WriteLine("Derived?class---");????????}????????public?override?void?ShowNumber()????????{????????????Console.WriteLine("Base?number?is?{0}",?Number.i.ToString());????????????Console.WriteLine("New?number?is?{0}",?i.ToString());????????????????????}????}????class?Tester????{????????public?static?void?Main(string[]?args)????????{????????????Number?num?=?new?Number();????????????num.ShowNumber();????????????IntNumber?intNum?=?new?IntNumber();????????????intNum.ShowNumber();????????????Number?number?=?new?IntNumber();????????????//究竟调用了谁?????????????number.ShowInfo();????????????//究竟调用了谁?????????????number.ShowNumber();????????}????}}
  • 作为约束,用于在泛型声明中约束可能用作类型参数的参数的类型。

?where?T?:?new()????{????????public?T?GetItem()????????{????????????return?new?T();????????}????}

?MyGen?=?new?Genericer();????????????Console.WriteLine(MyGen.GetItem().Name);????????}????}
  • 使用new实现多态。 这不是我熟悉的话题,详细的内容可以参见?《》,这里有较详细的论述。

using?System;namespace?Anytao.net.My_Must_net{????class?MyClass????{????????private?int?_id;????????public?MyClass(int?id)????????{????????????_id?=?id;????????}????}????struct?MyStruct????{????????private?string?_name;????????public?MyStruct(string?name)????????{????????????_name?=?name;????????}????}????class?NewReflecting????{????????public?static?void?Main(string[]?args)????????{????????????int?i;????????????int?j?=?new?int();????????????MyClass?mClass?=?new?MyClass(123);????????????MyStruct?mStruct?=?new?MyStruct("My?Struct");????????}????}}

.method?public?hidebysig?static?void?Main(string[]?args)?cil?managed{????.entrypoint????.maxstack?2????.locals?init?(????????[0]?int32?num,????????[1]?int32?num2,????????[2]?class?Anytao.net.My_Must_net._05_new.MyClass?class2,????????[3]?valuetype?Anytao.net.My_Must_net._05_new.MyStruct?struct2)????L_0000:?nop?????????//初始化j为0????L_0001:?ldc.i4.0?????L_0002:?stloc.1?????????//使用newobj指令创建新的对象,并调用构造函数以0x76(123的16进制)初始化????L_0003:?ldc.i4.s?0x7b????????L_0005:?newobj?instance?void?Anytao.net.My_Must_net._05_new.MyClass::.ctor(int32)????L_000a:?stloc.2?????//加载“My?Struct”????L_000b:?ldloca.s?struct2????L_000d:?ldstr?"My?Struct"????//调用构造函数执行初始化????L_0012:?call?instance?void?Anytao.net.My_Must_net._05_new.MyStruct::.ctor(string)????L_0017:?nop?????L_0018:?ret?}

  • new一个class时,new完成了以下两个方面的内容:一是调用newobj命令来为实例在托管堆中分配内存;二是调用构造函数来实现对象初始化。
  • new一个struct时,new运算符用于调用其带构造函数,完成实例的初始化。
  • new一个int时,new运算符用于初始化其值为0。
  • 另外必须清楚,值类型和引用类型在分配内存时是不同的,值类型分配于线程的堆栈(stack)上,并变量本身就保存其实值,因此也不受GC的控制,;而引用类型变量,包含了指向托管堆的引用,内存分配于托管堆(managed heap)上,内存收集由GC完成。?

  • new运算符不可重载。
  • new分配内存失败,将引发OutOfMemoryException异常。?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读