区别值类型和引用类型的重要一点就是值类型赋值的时候是给出一块内存空间,空间里放下要赋给值类型的值。而引用类型是开辟一块内存空间,空间里放下的是要赋给引用类型值的指向地址。

就像一个是复制了银行卡里的现金,你花了你复制的现金,和该银行卡是没有关系的。而引用类型是复制了一个银行卡,此卡为银行卡的副卡,因为他们的指向地址是一样的,所以当你使用副卡

的时候,主卡里的钱也会随之变动。

下面给出一段代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace WindowsConsoleApplicationValueAndReference
{
class Program
{
static void Main(string[] args)
{
ReferenceAndValue.ReferenceAndValueMethod(); } }
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public static class ReferenceAndValue
{
public static void ReferenceAndValueMethod()
{
Person tang = new Person { Name = "Andelshejlsberge", Age = };
int age = tang.Age;//age=tang.age=25
tang.Age = ; Person name = tang;//name.Name=andelshejlsberge
tang.Name = "tangxuelong";//tang.name=tangxuelong name.name=tang.name=tangxuelong Console.WriteLine("tang.Name={0}",tang.Name);
Console.WriteLine("tang.age={0}", tang.Age);
Console.WriteLine("age={0}", age);
Console.WriteLine("name={0}", name.Name);
Console.ReadLine(); }
}
}

分析一下代码。首先创建了一个person类,该类中包含name和age俩个属性

我们在方法中创建person的对象tang,初始化对象的name和age。

这时候看下一步,我们将对象tang的age赋值给一个int类型的变量age,然后改变对象tang的age的值,运行结果会告诉我们,此时age=25,tang.age=22;

接下来我们继续看下面的代码,继续创建一个对象将tang赋值给该对象。那么此时如果加入断点的话我们都知道name.Name=tang.Name=andershejlsberge这是没错的。那么接下来像上面一样我们改变tang.name的值我们会发现,name.name的值此时也改变了。

就像开始说的那样,引用类型不仅仅分配了内存空间,还解析了内存块的指向地址。

装箱和拆箱

装箱和拆箱其实就是引用类型和值类型之间的转换

值类型转换为引用类型就是装箱,引用类型转换为值类型就是拆箱。

public static class boxingAndUnboxing
{
public static void boxingandunboxing()
{
int ageInt = new int(); //boxing
object age =(object)ageInt; age = null; //unboxing
ageInt = (int)age; Console.WriteLine(ageInt);
}
}

分析一下上面的代码。这段代码会抛出System.NullReferenceException异常,因为age为引用类型,引用类型是可以赋空值的,然后将引用类型转换为值类型时,引用类型没有值。。

所以就抛出了异常。而去掉这段代码输出结果为0,这是因为我们没有初始化,默认的值类型变量的值就为0

C#中对值类型和引用类型的一点认识的更多相关文章

  1. C# 中的值类型和引用类型

    原文 C# 中的值类型和引用类型 值类型(value type):int,long,float,double,decimal,char,bool 和 struct 统称为值类型.值类型变量声明后,不管 ...

  2. C++ : 从栈和堆来理解C#中的值类型和引用类型

    C++中并没有值类型和引用类型之说,标准变量或者自定义对象的存取默认是没有区别的.但如果深入地来看,就要了解C++中,管理数据的两大内存区域:栈和堆. 栈(stack)是类似于一个先进后出的抽屉.它的 ...

  3. C#中的值类型和引用类型,深拷贝,浅拷贝

    from https://www.jianshu.com/p/2d27b06e253f 一.C#中的值类型和引用类型 概念 值类型直接存储其值. 引用类型存储对值的引用. 说起来有些拗口,其本质是Va ...

  4. 浅谈C#中的值类型和引用类型

    在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个 ...

  5. 【.Net】浅谈C#中的值类型和引用类型

    在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个 ...

  6. .NET中的值类型与引用类型

    .NET中的值类型与引用类型 这是一个常见面试题,值类型(Value Type)和引用类型(Reference Type)有什么区别?他们性能方面有什么区别? TL;DR(先看结论) 值类型 引用类型 ...

  7. Windows Phone 开发起步之旅之二 C#中的值类型和引用类型

    今天和大家分享下本人也说不清楚的一个C#基础知识,我说不清楚,所以我才想把它总结一下,以帮助我自己理解这个知识上的盲点,顺便也和同我一样不是很清楚的人一起学习下.  一说起来C#中的数据类型有哪些,大 ...

  8. js中的值类型和引用类型的区别

    1.JavaScript中的变量类型有哪些? (1)值类型(基本类型):字符串(String).数值(Number).布尔值(Boolean).Undefined.Null  (这5种基本数据类型是按 ...

  9. C#中的值类型、引用类型,代码告诉你他是什么类型。

    C#代码告诉你这是什么类型. using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

随机推荐

  1. Linux下一个Nginx安装步骤

    一个.下载pcre 官网下载:http://www.pcre.org/ # wget http://sourceforge.net/projects/pcre/files/pcre/8.35/pcre ...

  2. android应用框架构建------AppManager

    体验一些Android应用程序开发的个人总结 当我们开发应用程序.经常有非常多非常多activity,在这一刻,我们需要一个activity堆栈,以帮助管理activity的finish和start. ...

  3. Android系统APN配置具体解释

     Android 系统APN配置具体解释 这些天一直在调系统原生的Settings.apk里面APN配置的问题.在设置里面手动添加了APN配置选项.可是在界面上还是看不到.所以跟了下代码.原以为就是简 ...

  4. Android于JNI调用列出的程序

    1.安装和下载cygwin,下载Android NDK: 2.于ndk工程JNI接口设计: 3.采用C/C++实现本地方法. 4.JNI生成动态链接库.so档: 5.动态链接库副本javaprojec ...

  5. 从session实现机制分析模拟请求验证码的可行性(转)

    悲剧了,发现写完这篇blog没有配上这个格调超高的标题.   1.0问题背景 现在要实现一个带验证码网站的的自动登陆功能.验证码识别过程不再这篇文章的讨论之中.(之后有篇文章我会详细的总结验证码的识别 ...

  6. HDU 1596 find the safest road (最短路)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. 折返(Reentrancy)VS线程安全(Thread safety)

    在Wiki上,折返例如,下面的定义(接) In computing, a computer program or subroutine is called reentrant if it can be ...

  8. MEF初体验之一:在应用程序宿主MEF

    在MEF出现以前,其实微软已经发布了一个类似的框架,叫MAF(Managed Add-in Framework),它旨在使应用程序孤立和更好的管理扩展,而MEF更关心的是可发现性.扩展性和轻便性,后者 ...

  9. Unity项目优化--开发项目的小经验

    原文地址:http://blog.csdn.net/liang_704959721/article/details/8548619 我们主要使用 3dsmax2010 进行制作,输出 FBX的类型导入 ...

  10. 设计管理员表;webservice用于网络安全的高端内提供服务的

    admin表设计.你应该有角色表,管理员属于一个样的作用,另一个接口选项,以查看表.角色有更多的选择的能力. 角色和选项代表了许多关系,因此,我们必须保持这种关系有一个表 版权声明:本文博客原创文章, ...