声明:本文最初是本人从他出转载到51CTO上的一篇文章,但现在记不清最初从出处了,原文作者看到还请原来,现在发表在这里只为学习,本人在51CTO的该文章的地址为:http://kestrelsaga.blog.51cto.com/3015222/751536

一、             new运算符
①     用于创建对象和调用构造函数。 例如:
  1. Class1 obj  = new Class1();
②     还可用于创建匿名类型的实例:
  1. var query = from cust in customers
  2. select new {Name = cust.Name, Address = cust.PrimaryAddress};
③     new 运算符还用于调用值类型的默认构造函数。 例如:
  1. int i = new int();
在上一个语句中,i 初始化为 0,它是 int 类型的默认值。 该语句的效果等同于:
  1. int i = 0;
请记住,为结构声明默认的构造函数是错误的,因为每一个值类型都隐式具有一个公共的默认构造函数。 可以在结构类型上声明参数化构造函数以设置其初始值,但是,只有在需要默认值之外的值时才必须这样做。
值类型对象(例如结构)是在堆栈上创建的,而引用类型对象(例如类)是在堆上创建的。 两种类型的对象都是自动销毁的,但是,基于值类型的对象是在超出范围时销毁,而基于引用类型的对象则是在对该对象的最后一个引用被移除之后在某个不确定的时间销毁。 对于占用固定资源(例如大量内存、文件句柄或网络连接)的引用类型,有时需要使用确定性终止以确保对象被尽快销毁。
不能重载 new 运算符。
如果 new 运算符分配内存失败,将引发异常 OutOfMemoryException。
示例
在下面的示例中,通过使用 new 运算符创建并初始化一个 struct 对象和一个类对象,然后为它们赋值。 显示了默认值和所赋的值。
  1. struct SampleStruct
  2. {
  3. public int x;
  4. public int y;
  5. public SampleStruct(int x, int y)
  6. {
  7. this.x = x;
  8. this.y = y;
  9. }
  10. }
  11. class SampleClass
  12. {
  13. public string name;
  14. public int id;
  15. public SampleClass() {}
  16. public SampleClass(int id, string name)
  17. {
  18. this.id = id;
  19. this.name = name;
  20. }
  21. }
  22. class ProgramClass
  23. {
  24. static void Main()
  25. {
  26. // Create objects using default constructors:
  27. SampleStruct Location1 = new SampleStruct();
  28. SampleClass Employee1 = new SampleClass();
  29. // Display values:
  30. Console.WriteLine("Default values:");
  31. Console.WriteLine("   Struct members: {0}, {1}",
  32. Location1.x, Location1.y);
  33. Console.WriteLine("   Class members: {0}, {1}",
  34. Employee1.name, Employee1.id);
  35. // Create objects using parameterized constructors:
  36. SampleStruct Location2 = new SampleStruct(10, 20);
  37. SampleClass Employee2 = new SampleClass(1234, "Cristina Potra");
  38. // Display values:
  39. Console.WriteLine("Assigned values:");
  40. Console.WriteLine("   Struct members: {0}, {1}",
  41. Location2.x, Location2.y);
  42. Console.WriteLine("   Class members: {0}, {1}",
  43. Employee2.name, Employee2.id);
  44. }
  45. }
  46. /*
  47. Output:
  48. Default values:
  49. Struct members: 0, 0
  50. Class members: , 0
  51. Assigned values:
  52. Struct members: 10, 20
  53. Class members: Cristina Potra, 1234
  54. */
注意,在示例中字符串的默认值为 null 因此未显示它。
二、             new修饰符
在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。 隐藏继承的成员时,该成员的派生版本将替换基类版本。 虽然可以在不使用 new 修饰符的情况下隐藏成员,但会生成警告。 如果使用 new 显式隐藏成员,则会取消此警告,并记录要替换为派生版本这一事实。
若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用 new 修饰符修饰该成员。 例如: 
  1. public class BaseC
  2. {
  3. public int x;
  4. public void Invoke() { }
  5. }
  6. public class DerivedC : BaseC
  7. {
  8. new public void Invoke() { }
  9. }
在此示例中,DerivedC.Invoke 隐藏了 BaseC.Invoke。 字段 x 不受影响,因为它没有被类似名称的字段隐藏。
通过继承隐藏名称采用下列形式之一:
·             引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。
·             引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。 同时也隐藏具有相同签名的所有基类方法。
·             引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。
对同一成员同时使用 new 和 override 是错误的做法,因为这两个修饰符的含义互斥。 new 修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。 override 修饰符会扩展继承成员的实现。
在不隐藏继承成员的声明中使用 new 修饰符将会生成警告。
示例
在该例中,基类 BaseC 和派生类 DerivedC 使用相同的字段名 x,从而隐藏了继承字段的值。 该示例演示了 new 修饰符的用法。 另外还演示了如何使用完全限定名访问基类的隐藏成员。见:
  1. public class BaseC
  2. {
  3. public static int x = 55;
  4. public static int y = 22;
  5. }
  6. public class DerivedC : BaseC
  7. {
  8. // Hide field 'x'.
  9. new public static int x = 100;
  10. static void Main()
  11. {
  12. // Display the new value of x:
  13. Console.WriteLine(x);
  14. // Display the hidden value of x:
  15. Console.WriteLine(BaseC.x);
  16. // Display the unhidden member y:
  17. Console.WriteLine(y);
  18. }
  19. }
  20. /*
  21. Output:
  22. 100
  23. 55
  24. 22
  25. */
在此示例中,嵌套类隐藏了基类中同名的类。 此示例演示了如何使用 new 修饰符来消除警告消息,以及如何使用完全限定名来访问隐藏的类成员。见:
  1. public class BaseC
  2. {
  3. public class NestedC
  4. {
  5. public int x = 200;
  6. public int y;
  7. }
  8. }
  9. public class DerivedC : BaseC
  10. {
  11. // Nested type hiding the base type members.
  12. new public class NestedC
  13. {
  14. public int x = 100;
  15. public int y;
  16. public int z;
  17. }
  18. static void Main()
  19. {
  20. // Creating an object from the overlapping class:
  21. NestedC c1  = new NestedC();
  22. // Creating an object from the hidden class:
  23. BaseC.NestedC c2 = new BaseC.NestedC();
  24. Console.WriteLine(c1.x);
  25. Console.WriteLine(c2.x);
  26. }
  27. }
  28. /*
  29. Output:
  30. 100
  31. 200
  32. */
如果移除 new 修饰符,该程序仍可编译和运行,但您会收到以下警告:The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.
三、             new约束
new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 如果要使用 new 约束,则该类型不能为抽象类型。
示例
当泛型类创建类型的新实例,请将 new 约束应用于类型参数,如下面的示例所示:
  1. class ItemFactory<T> where T : new()
  2. {
  3. public T GetNewItem()
  4. {
  5. return new T();
  6. }
  7. }
当与其他约束一起使用时,new() 约束必须最后指定:
  1. public class ItemFactory2<T>
  2. where T : IComparable, new()
  3. {
  4. }

转载于:https://www.cnblogs.com/KeSaga/p/4354060.html

NEW关键字的三种用法相关推荐

  1. 【零基础学Java】—this关键字的三种用法+Java继承的三个特点(二十一)

    [零基础学Java]-this关键字的三种用法+Java继承的三个特点(二十一) 一.this关键字的三种用法 在本类的成员方法中,访问本类的成员变量 在本类的成员方法中,访问本类的另一个成员方法 在 ...

  2. java this()函数_java中this关键字的三种用法

    this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this的用法在java中大体可以分为3种: 1.普通的直接引用,this相当于是指向当前对象本身. 2.形参与成员名字重 ...

  3. Java中的this关键字(三种用法)

    this关键字的三种用法: 通过this关键字可以明确的访问一个类的成员变量,解决成员变量与局部变量名称冲突问题. 实例: public class Student {//定义四个成员变量String ...

  4. 微课系列(6):Python关键字else的三种用法

    技术要点:Python关键字else在选择结构.循环结构和异常处理结构中的三种用法. ----------相关阅读---------- 教学课件 1900页Python系列PPT分享一:基础知识(10 ...

  5. static的三种用法,定义静态变量,静态函数,静态代码块!

    static的三种用法,定义静态变量,静态函数,静态代码块! 1.定义静态变量 class PersonStatic { //静态变量的特点 //1.静态变量无需生成对象就可被调用,可以使用类名和对象 ...

  6. 【零基础学Java】—final关键字与四种用法(二十九)

    [零基础学Java]-final关键字与四种用法(二十九) 一.final关键字 final关键字代表最终.不可改变的 常见的四种用法: 可以用来修饰一个类 可以用来修饰一个方法 可以用来修饰一个局部 ...

  7. this关键字的四种用法

    this关键字的四种用法 一.this.属性名 表示对象自己的属性使用this调用成员变量,解决变量与局部变量之间的冲突问题 1.实例分析 代码如下(示例): public class Person{ ...

  8. Kotlin object的三种用法

    文章目录 Kotlin object的三种用法 概述 object 匿名内部类 object 单例模式 @JvmStatic companion object 伴生对象 工厂模式 Kotlin obj ...

  9. java里break的使用方法_Java中break的第三种用法说明

    在Java中,break语句有三种用法,第一种是用于终止switch语句中的语句序列,第二种是用于退出循环,然而第三种是用作goto语句的"文明"形式! 我们知道,goto语句会破 ...

最新文章

  1. 再见 FTP/SFTP,是时候拥抱下一代文件传输利器 Croc 了!
  2. 温泉关一役历史资料(电影:斯巴达300勇士)
  3. 浅谈CMMI几个过程概念流程管理 (转)
  4. 建站需要mysql_你还在对建站数据不重视吗-Navicat for MySQL赶快上手使用吧
  5. MySql---数据库笔记(功能齐全)
  6. SAP ABAP Netweaver里进程能够申请的最大内存
  7. 前端学习(1645):前端系列实战课程之留言板功能实现
  8. 火速拿来用!对比近 10,000 个 Python 开源项目发现最实用的 TOP34!
  9. 安装McAfee 8.7i 提示错误1920怎么办?
  10. c# 第七节 编程规范,vs中的各种设置
  11. 【转】Sections Headers for Android ListViews
  12. XShell/Xftp免费版下载及安装教程
  13. 服装制版师用软件代替手工_楚天都市报_多媒体报
  14. 吐血分享9个软件下载网站以及那些开发者大佬的传奇人生
  15. 为Springboot工作流版本myabaits的xml 建表
  16. 重磅!Google推出了AI人体图像分割工具,惊呆了小伙伴.....
  17. C 语言 数据类型及所占字节数
  18. 加大货币发行量 quantitative easing
  19. 身份证识别SDK——混合非原生调用
  20. 基于微信小程序食谱大全系统(微信小程序毕业设计)

热门文章

  1. sendmail服务器案例配置
  2. C# 视频监控系列(9):服务器端——数据捕获(抓图 + 录像)
  3. 反编译工具jad简单用法
  4. 金邦黑金刚4G内存 VS Vista系统
  5. slf4j 日志监控
  6. Azure系列2.1.15 —— SharedAccessBlobPolicy
  7. C# 值类型与引用类型
  8. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 3 Keynote: Scott Hanselman
  9. Maven+mybatis教程
  10. 轻量级持久层V2版本代码与模板