在代码中我们经常能看到下面这样的语句。

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#对象的声明与实例化的更多相关文章

  1. 使用Delphi对象(声明、实例化、构造、释放)

    一.声明和实例化 在使用一个对象之前,用class关键字声明一个对象.可以在一个程序或单元的type部分声明一个对象类型: type TFooObject = class; 除了声明一个对象类型,通常 ...

  2. Spring学习笔记之 Spring IOC容器(一)之 实例化容器,创建JavaBean对象,控制Bean实例化,setter方式注入,依赖属性的注入,自动装配功能实现自动属性注入

    本节主要内容:       1.实例化Spring容器示例    2.利用Spring容器创建JavaBean对象    3.如何控制Bean实例化    4.利用Spring实现bean属性sett ...

  3. 如何:声明、实例化和使用委托(C# 编程指南)

    委托的声明如下所示: C#   public delegate void Del<T>(T item); public void Notify(int i) { } C#   Del< ...

  4. 【初识Spring】对象(Bean)实例化及属性注入(xml方式)

    title: [初识Spring]对象(Bean)实例化及属性注入(xml方式) date: 2018-08-29 17:35:15 tags: [Java,Web,Spring] --- #初识S ...

  5. 面向对象+闭包+三种对象的声明方式(字面式、new Object、构造函数、工厂模式、原型模式、混合模式)

    面向对象: 对代码的一种抽象,对外统一提供调用接口的编程思想 对象的属性:事物自身拥有的东西 对象的方法:事物的功能 对象:事物的一个实例 对象的原型:.prototype -> 内存地址 -& ...

  6. Python的类变量和对象变量声明解析

    Python的类和C++一样,也都是存在两种类型的变量,类变量和对象变量!前者由类拥有,被所有对象共享,后者由每个对象独有.这里我主要想讨论一下他们的声明办法. 首先说的是对象变量: 只要是声明在类的 ...

  7. JavaScript面向对象之对象的声明、遍历和存储

    一.对象的声明方式 1. 字面式(json格式)声明对象 var obj={ 属性名:属性值, 方法名:function(){ //函数执行体 } } 2. new 操作符+Object 声明对象 v ...

  8. 【初识Spring】对象(Bean)实例化及属性注入(注解方式)

    通过xml的方式进行对象的实列化或属性注入或许有一些繁琐,所以在开发中常用的方式更多是通过注解的方式实现对象实例化和属性注入的. 开始之前 1.导入相关的包(除了导入基本的包还要导入aop的包): 创 ...

  9. javaScript的函数(Function)对象的声明(@包括函数声明和函数表达式)

    写作缘由: 平时再用js写函数的时候,一般都是以惯例 function fn () {} 的方式来声明一个函数,在阅读一些优秀插件的时候又不免见到 var fn = function () {} 这种 ...

随机推荐

  1. CentOS 下安装无线哥的老爷机DELL的无线驱动

    使用命令检测网卡 lspci | grep Network   为“0c:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g ...

  2. JAVA发送邮件工具类

    import java.util.Date;import java.util.Properties; import javax.mail.BodyPart;import javax.mail.Mess ...

  3. lvs原理和实战

     lvs-dr原理 lvs-nat原理:  当我们的网站流量越来越大时一台web服务器已经无法满足需求了,我们该如何解决呢??把服务器连接起来实现负载均衡或许是个不错的办法..下面我就来看看怎么实现吧 ...

  4. android之消息机制(一)

    消息操作类Handler 首先编写main.xml文件代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk ...

  5. JavaScript - 倒计时

    http://www.helloweba.com/demo/loading/ WEB开发中经常会用到倒计时来限制用户对表单的操作,比如希望用户在一定时间内看完相关协议信息才允许用户继续下一步操作,又比 ...

  6. 【iCore2双核心板视频教程三】iM_LAN 100M 以太网模块TCP压力测试(更新视频教程)

    ============================== 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:h ...

  7. hdu1272 并查集

    如果要输出yes 需要满足 1  这个图连通 2  没有回路 3  0 0 也是yes 看它有没有回路 在un的时候做一次判断就可以了 然后是判断连通 在这里采用的方法是扫一遍 如果这个点出现过就判断 ...

  8. Klayge 引擎的安装

    http://www.klayge.org/wiki/index.php?title=%E4%BE%8B%E5%AD%90%E7%A8%8B%E5%BA%8F&redirect=no& ...

  9. eclipse中project->clean的作用是什么

    1.由于eclipse的编译是基于时间戳的判断机制的.因此当你按build   all的时候有些eclipse认为时间戳没有改变的类不会被编译.因此你可以先clean一下再编译.这个时候eclipse ...

  10. mysql varchar类型使用心得

    自己的一个例子,在存储一个email的需求中.mysql定义的字段,类型:varchar 长度:20 当我插入一个email:huangyuande@sailvan.com  发现怎么样都差不进去.. ...