当前位置: 首页 > 编程日记 > 正文

NEW关键字的三种用法

声明:本文最初是本人从他出转载到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

相关文章:

论文解读 | 微信看一看实时Look-alike推荐算法

作者丨gongyouliu编辑丨lily来源 | 授权转载自大数据与人工智能(ID:ai-big-data)微信看一看的精选文章推荐(见下面图1)大家应该都用过&#xff0c;微信团队在今年发表了一篇文章来专门介绍精选推荐的算法实现细节(Real-time Attention based Look-alike Model&#xff0c;简称R…

经典网络GoogLeNet介绍

经典网络GoogLeNet由Christian Szegedy等于2014年提出&#xff0c;论文名为《Going deeper with convolutions》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/1409.4842v1.pdf GoogLeNet网络用到了Inception-v1模块&#xff0c;关于Inception模块的介绍可以参考&…

iOS webview 点击按钮返回上一页面或者返回首页

- (void)floatBtn:(UIButton *)sender { NSLog("点击"); if ([self.webView canGoBack]) { [self.webView goBack]; } else{ [self.view resignFirstResponder]; [self.navigationController popViewControllerAnimate…

centos6.6 Kickstart无人值守安装(一):原理篇

为什么80%的码农都做不了架构师&#xff1f;>>> #为什么要自动化无人值守安装&#xff1f; 偷懒……nb……zb……geekno no no 瞬间完成大规模机器部署,提高生产力&#xff0c;节省时间精力&#xff0c;为公司谋取更多利益&#xff0c;实现社会和谐&#xff01;#怎…

拿来就能用!如何用 AI 算法提高安全运维效率?

作者 | 黄龙责编 | 伍杏玲来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 在整个安全工作中&#xff0c;安全运维是不可或缺的一环&#xff0c;其目的是保证各项安全工作持续有效地运作。除了对外的沟通和业务对接相关工作&#xff0c;大部分安全运维的日常工作相…

深度神经网络中Inception-ResNet模块介绍

之前在https://blog.csdn.net/fengbingchun/article/details/113482036 介绍了Inception&#xff0c;在https://blog.csdn.net/fengbingchun/article/details/114167581 介绍了ResNet&#xff0c;这里介绍下深度神经网络中的Inception-ResNet模块。 介绍Inception-ResNet的论文…

iOS 让UIView的左上角和右上角为圆角

-(UIView *)platFormBGV{ if (!_platFormBGV) { _platFormBGV [[UIView alloc] init]; _platFormBGV.backgroundColor [UIColor whiteColor]; _platFormBGV.frame CGRectMake(0, self.view.frame.size.height, APP_WIDTH, 220); // 左上和右上为圆角 UIBezierPath *cornerRa…

HttpUnit学习笔记

HttpUnit 能模拟浏览器的动作&#xff0c;如提交表单、JavaScript执行、基本HTTP认证、cookies建立以及自己主动页面重定向&#xff0c;通过编写代码能够处理取回来的文本、XML DOM或表单、表、链接。当与Junit等框架结合时&#xff0c;就能很easy地进行一个站点的功能測试了。…

C++11中头文件type_traits介绍

C11中的头文件type_traits定义了一系列模板类&#xff0c;在编译期获得某一参数、某一变量、某一个类等等类型信息&#xff0c;主要做静态检查。 此头文件包含三部分&#xff1a; (1).Helper类&#xff1a;帮助创建编译时常量的标准模板类。介绍见以下测试代码&#xff1a; …

反季大清仓,最低仅需34.9元

不知不觉已经12月份了还有一个月就要过年啦很多地方已经进入了寒冬的季节有的地方已经开启了下雪模式纷纷开始买冬天的商品棉衣、羽绒服、取暖器......但是.......今天我是来搞反季清仓的快来看看今天的反季清仓有啥商品~●反季清仓商品—程序员专属定制T ●专属定制T_shirt&am…

iOS 预览word pdf 文件

此类用于改变QLPreviewController 导航栏title #import <QuickLook/QuickLook.h> NS_ASSUME_NONNULL_BEGIN interface QLPreviewController (title) property (nonatomic, strong) NSString *qlpTitle; end NS_ASSUME_NONNULL_END #import "QLPreviewControllertitl…

Java过滤器模式

//创建一个类&#xff0c;在该类上应用标准 public class Person { private String name; private String gender; private String maritalStatus; public Person(String name, String gender, String maritalStatus) { this.name name; …

C++中指向类成员指针的用法

C中&#xff0c;指向类的成员指针包含两种&#xff1a; (1).指向类的成员函数的指针&#xff1a; 类型 (类名::* 函数成员指针名)(参数表); 函数成员指针名 &类名::函数成员名; 也可将以上两条语句调整为一条语句&#xff1a; 类型 (类名::* 函数成员指针名)(参数表) &…

多模态人物识别技术及其在爱奇艺视频场景中的应用 | 公开课笔记

【12月公开课预告】&#xff0c;入群直接获取报名地址12月11日晚8点直播主题&#xff1a;人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播&#xff1a;利用容器技术打造AI公司技术中台12月17日晚8点直播主题&#xff1a;可重构计算&#xff1a;能效比、通用性…

JsonObject json字符串转换成JSonObject对象

字符串&#xff1a;{"code":"1004","msg":"请先添加系统靠勤人员信息&#xff01;","userRegistInfo":{"acc":"小谷","id":0,"phoneMac":"","phoneNum":"…

基于人脸关键点修复人脸,腾讯等提出优于SOTA的LaFIn生成网络

作者 | Yang Yang、Xiaojie Guo、Jiayi Ma、Lin Ma、Haibin Ling译者 | 刘畅编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】现实场景中&#xff0c;人脸的变化是很大的&#xff0c;例如不同的姿势、表情和遮挡等&#xff0c;因此在现…

在Ubuntu上编译opencv 2.4.13源码支持android平台操作步骤

之前在https://blog.csdn.net/fengbingchun/article/details/96430706中编译过opencv源码用于海思平台&#xff0c;这里通过修改脚本编译opencv 2.4.13.6源码&#xff0c;使其支持android平台。 1. 从https://github.com/opencv/opencv/releases下载opencv 2.4.13.6源码&#…

Java组合模式

组合模式&#xff1a;适用于把一组相似的对象当作一个单一的对象&#xff0c;组合迷失一句树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类的设计模式属于结构型模式&#xff0c;他创建了对象组的树形结构 这种模式创建了一个包含自己对象组的的类。给类提供了…

SQL故障转移集群操作方法

SQL故障转移集群操作方法1 给SQL服务器配置IP地址,每台服务器需要两个IP,一个通讯用,一个作为心跳线,修改计算机的名称,关闭服务器的防火墙,开启远程桌面.2心跳网卡配置去掉ipv6,并去掉下列几项进行验证3域控制器服务器管理器 添加角色 AD域服务启动AD域服务加入到域中打开DNS服…

Windows/Linux上使用fopen相关函数读取大文件

在介绍读取大文件之前&#xff0c;先了解下<cstdint>文件&#xff0c;标准头文件&#xff0c;存放固定宽度整数类型&#xff0c;如int32_t, uint32_t&#xff0c;不管在32位上还是64位上&#xff0c;长度都为4个字节&#xff1b;int64_t, uint64_t&#xff0c;不管在32位…

蚂蚁金服提新概率图模型GLN,正确率提升8.2%,具备可解释性 | NeurIPS 2019

作者 | 蚂蚁金服编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1b;rgznai100&#xff09;【导读】一年一度的国际顶级学术会议NeurIPS 2019将于12月8日至14日在加拿大温哥华举行。作为人工智能和机器学习领域最顶级的盛会之一&#xff0c;每年都会吸引来自全世界的AI大…

Java外观模式

外观模式&#xff1a;隐藏系统的复杂性&#xff0c;并向客户提供了一个客户端可以访问系统的接口&#xff0c;这种类型的设计模式属于结构型模式&#xff0c;他向现有的系统添加一个接口&#xff0c;来隐藏系统的复杂性 这种模式设计到一个单一的类&#xff0c;该类提供了客户请…

【spring框架】spring整合hibernate初步

spring与hibernate做整合的时候&#xff0c;首先我们要获得sessionFactory。我们一般只需要操作一个sessionFactory&#xff0c;也就是一个"单例"&#xff0c;这一点很适合交给spring来管理。下面的代码演示如何创建一个JDBC DataSource 和Hibernate SessionFactory:…

PyTorch简介

PyTorch是一个针对深度学习&#xff0c;并且使用GPU和CPU来优化的tensor library(张量库)。最新发布的稳定版本为1.9&#xff0c;源码在https://github.com/pytorch/pytorch 。它支持在Linux、Mac和Windows上编译和运行。调用Python接口可以通过Anaconda或Pip的方式安装&#x…

Java 责任链模式

顾名思义&#xff0c;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;为请求创建了一个接收者对象的链。这种模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中&#xff0c;通常每个接收者…

2019嵌入式智能国际大会圆满落幕,7大专场精彩瞬间释出!

全球第二大市场研究机构MarketsandMarkets报告称&#xff0c;2019年全球AIoT市场规模为51亿美元&#xff0c;到2024年&#xff0c;这一数字将增长至162亿美元。5G元年&#xff0c;人工智能开始更多地转向应用智能。基于此&#xff0c;12月6-7日&#xff0c;由哈尔滨工业大学&am…

ubuntu12.04 alternate win7 双系统安装

ubuntu alternate的安装比desktop复杂一点,因为alternate的安装过程有个步骤是检测cd-rom,如果你是刻盘安装,自然没问题,但是,现在的安装一般是将系统刻到U盘里,或者在硬盘中划出一个分区,将其制作成启动盘. 这里我是用U盘安装的... 安装前的准备: 1)在硬盘上分出一个空闲分区:…

C/C++包管理工具Conan简介

Conan是一个开源的、跨平台的、去中心化的C和C包管理器&#xff0c;它的源码在https://github.com/conan-io/conan &#xff0c;License为MIT&#xff0c;最新发布版本为1.38.0&#xff0c;由Python实现。版本更新较频繁&#xff0c;但保持向前兼容。 Conan特点&#xff1a; (1…

神经架构搜索在视频理解中研究进展的综述

作者 | Michael S. Ryoo 研究员与 AJ Piergiovanni 学生研究员&#xff08;Google 机器人团队&#xff09;来源 | TensorFlow&#xff08;ID&#xff1a;TensorFlow_official&#xff09;视频理解一直是项颇具挑战性的难题。视频中包含时空数据&#xff0c;因此要提取特征表示需…

Java命令模式

命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式&#xff0c;它属于行为型模式。请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&#xff0c;该对象执行命令…