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

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. 关于TbSchedule任务调度管理框架的整合部署

    一.前言 任务调度管理作为基础架构通常会出现于我们的业务系统中,目的是让各种任务能够按计划有序执行.比如定时给用户发送邮件.将数据表中的数据同步到另一个数据表都是一个任务,这些相对耗时的操作通过任务调 ...

  2. erlang-jiffy 安装手记

    今天安装 erlang-jiffy 把握逼疯,不过最后还是成功了. 错误避免: rebar只能再英文目录下运行,如果编译jiffy的目录中有中文或其它unicode字符,将会出错 从git relea ...

  3. ztree学习之异步加载节点(一)

    ztreedemo.jsp: <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  4. iOS -- MVC的理解

    今天在写项目的时候困惑了一下 我在写一个应用的主界面,其实是很简单的,上面有几个控件,我在想把空间写到viewController里会不会有点冗杂 后来查了一下,发现貌似也不需要分开写,毕竟界面好简单 ...

  5. mysql 常用知识

    1.uuid guid UUID是一个由4个连字号(-)将32个字节长的字符串分隔后生成的字符串,总共36个字节长.比如:550e8400-e29b-41d4-a716-446655440000 CH ...

  6. OpenCV学习笔记——视频的边缘检测

    使用Canny算子进行边缘检测,并分开输出到三个窗口中,再给每一个窗口添加文字 代码: #include"cv.h" #include"highgui.h" / ...

  7. Asp.Net:Repeater 详情 备用

    页面 repeator就想for循环一样,没有编辑模板,有删除delete和详情detail模板 <%@ Page Language="C#" AutoEventWireup ...

  8. 每天php函数 - floatval() 获取变量的浮点值

    float floatval ( mixed $var ) 返回变量 var的 float 数值. var 可以是任何标量类型.你不能将 floatval() 用于数组或对象. <?php$va ...

  9. Class 实现IDisposing方法

    public class MyResourceHog : IDisposable  {   // 已经被处理过的标记   private bool _alreadyDisposed = false;  ...

  10. 解决mysql数据库连接问题

    设置mysql远程连接root权限 在远程连接mysql的时候应该都碰到过,root用户无法远程连接mysql,只可以本地连,对外拒绝连接.需要建立一个允许远程登录的数据库帐户,这样才可以进行在远程操 ...