C#对象的声明与实例化
在代码中我们经常能看到下面这样的语句。
A a = new A();(1)
B b = null;(2)
C c;(3)
代码( 1 )
创建 A 的对象并对其进行初始化。
A :类;
new A() :创建 A 的对象并对其初始化;
a :引用,指向 new A() 这个对象的引用。
注意: a 不是 A 的对象, new A() 才是 A 的对象。
代码( 2 )
声明 引用 b ,并指向 null 。
B :类;
b :引用,指向的对象为 null (空)。
代码( 3 )
与代码( 2 )一样,声明一个 引用 。
与代码( 2 )的区别是:代码( 3 )中 声明 的引用 c 不指向任何对象。
提示:变量本质上是引用的一个别名而已 。
由上面的分析可以了解到,在 C# 中实例化一个对象时,需要经历下面这几步:
声明引用;
使用 new 关键字创建类的对象并对其初始化;(分配内存空间)
将引用指向类的对象。
若没有使用 new关键字 创建类的实例,则仅仅创建引用,指向的对象为 null 。
实例说明
public class ExampleModel
{
public int C1 { get; set; }
public string C2 { get; set; }
}
ExampleModel e1 = new ExampleModel();
ExampleModel e2 = null;
ExampleModel e3;
if (e1 == null)
{
Console.WriteLine("e1 == null");
}
else
{
Console.WriteLine("{ C1 = " + e1.C1 + ", C2 = " + e1.C2 + " }");
}
if (e2 == null)
{
Console.WriteLine("e2 == null");
}
else
{
Console.WriteLine("{ C1 = " + e2.C1 + ", C2 = " + e2.C2 + " }");
}
if (e3 == null)
{
Console.WriteLine("e3 == null");
}
else
{
Console.WriteLine("{ C1 = " + e3.C1 + ", C2 = " + e3.C2 + " }");
} 编译代码,会出现编译错误,提示“使用了未赋值的局部变量 e3 ”,原因是并未对 e3进行初始化,但是使用 e2 变量时并不会产生编译错误,因为 e2 已经被初始化了,只是初始化的值为 null 而已,这并不影响编译的通过。
注释掉e3 部分的代码,运行程序得到下图所示的结果。
在开发过程中,我们还是尽量不要让一个引用指向 null ,否则在运行过程中很容易出现空引用的异常。
修改 e2 部分的代码, 去掉e2是否为空引用的条件判断, 并运行程序。
运行中,会产生“未将对象引用设置到对象的实例。”的异常。(原因你懂的。)
同样去掉 e1 部分中是否为空引用的条件判断语句,再次执行程序,一切正常。(因为e1指向了不为null的对象)
C#对象的声明与实例化的更多相关文章
- 使用Delphi对象(声明、实例化、构造、释放)
一.声明和实例化 在使用一个对象之前,用class关键字声明一个对象.可以在一个程序或单元的type部分声明一个对象类型: type TFooObject = class; 除了声明一个对象类型,通常 ...
- Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入
本节主要内容: 1.实例化Spring容器示例 2.利用Spring容器创建JavaBean对象 3.如何控制Bean实例化 4.利用Spring实现bean属性sett ...
- 如何:声明、实例化和使用委托(C# 编程指南)
委托的声明如下所示: C# public delegate void Del<T>(T item); public void Notify(int i) { } C# Del< ...
- 【初识Spring】对象(Bean)实例化及属性注入(xml方式)
title: [初识Spring]对象(Bean)实例化及属性注入(xml方式) date: 2018-08-29 17:35:15 tags: [Java,Web,Spring] --- #初识S ...
- 面向对象+闭包+三种对象的声明方式(字面式、new Object、构造函数、工厂模式、原型模式、混合模式)
面向对象: 对代码的一种抽象,对外统一提供调用接口的编程思想 对象的属性:事物自身拥有的东西 对象的方法:事物的功能 对象:事物的一个实例 对象的原型:.prototype -> 内存地址 -& ...
- Python的类变量和对象变量声明解析
Python的类和C++一样,也都是存在两种类型的变量,类变量和对象变量!前者由类拥有,被所有对象共享,后者由每个对象独有.这里我主要想讨论一下他们的声明办法. 首先说的是对象变量: 只要是声明在类的 ...
- JavaScript面向对象之对象的声明、遍历和存储
一.对象的声明方式 1. 字面式(json格式)声明对象 var obj={ 属性名:属性值, 方法名:function(){ //函数执行体 } } 2. new 操作符+Object 声明对象 v ...
- 【初识Spring】对象(Bean)实例化及属性注入(注解方式)
通过xml的方式进行对象的实列化或属性注入或许有一些繁琐,所以在开发中常用的方式更多是通过注解的方式实现对象实例化和属性注入的. 开始之前 1.导入相关的包(除了导入基本的包还要导入aop的包): 创 ...
- javaScript的函数(Function)对象的声明(@包括函数声明和函数表达式)
写作缘由: 平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种 ...
随机推荐
- [转]Calling Web Service Functions Asynchronously from a Web Page 异步调用WebServices
本文转自:http://www.codeproject.com/Articles/70441/Calling-Web-Service-Functions-Asynchronously-from Ove ...
- php数组操作,删除第一个和最后一个元素
对于一个php数组,该如何删除该数组的第一个元素或者最后一个元素呢?其实这两个过程都可以通过php自带的函数 array_pop 和 array_shift 来完成,下面就具体介绍一下如何来操作. ( ...
- snowflake
snowflake在分布式系统中生成全局id
- python 安装pip的时候出现UnicodeEncodeError错误
另外 Python 中一个比较常见的问题是编码问题,若遇到类似"UnicodeEncodeError: 'ascii' codec can't encode character u'\u62 ...
- git基础及分支
关于版本控制 git是一种分布版本控制系统,每一主机都保存了完整副本.必杀技是分支. 在Windows可安装git客户端msysgit. git基础 第一次看progit觉得有点不懂,不懂版本控制,一 ...
- [办公自动化]Wlan无法启动,无法连接无线网wifi,所有无线网都搜索不到
转帖: http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20121023172943554.html 故障现象: 启动wlan autoco ...
- OpenFlow.p4 源码
/* Copyright 2013-present Barefoot Networks, Inc. Licensed under the Apache License, Version 2.0 (th ...
- Web 在线文件管理器学习笔记与总结(2)显示文件列表(名称,类型,大小,可读,可写,可执行,创建时间,修改时间,访问时间)
主要函数: filetype() 判断文件类型 filesize() 得到文件大小(字节) is_readable() 判断文件是否可读 is_writeable() 判断文件是否可写 is_exec ...
- Spring Project Annotations
Project Annotation Discovered By Package Target(s) Parameters Notes . AspectJ @EnableSpr ...
- 实现LoadRunner多个场景的顺序执行(命令行)
应用场景:假设有3个不同的测试场景,分别为并发登录.核心业务.可靠性测试,3个场景有先后执行顺序.由于白天测试机器另有用处,只能在晚上进行性能测试,这时我们的期望是能否把测试场景都设定好之后晚上自动运 ...