C#中对值类型和引用类型的一点认识
区别值类型和引用类型的重要一点就是值类型赋值的时候是给出一块内存空间,空间里放下要赋给值类型的值。而引用类型是开辟一块内存空间,空间里放下的是要赋给引用类型值的指向地址。
就像一个是复制了银行卡里的现金,你花了你复制的现金,和该银行卡是没有关系的。而引用类型是复制了一个银行卡,此卡为银行卡的副卡,因为他们的指向地址是一样的,所以当你使用副卡
的时候,主卡里的钱也会随之变动。
下面给出一段代码。
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#中对值类型和引用类型的一点认识的更多相关文章
- C# 中的值类型和引用类型
原文 C# 中的值类型和引用类型 值类型(value type):int,long,float,double,decimal,char,bool 和 struct 统称为值类型.值类型变量声明后,不管 ...
- C++ : 从栈和堆来理解C#中的值类型和引用类型
C++中并没有值类型和引用类型之说,标准变量或者自定义对象的存取默认是没有区别的.但如果深入地来看,就要了解C++中,管理数据的两大内存区域:栈和堆. 栈(stack)是类似于一个先进后出的抽屉.它的 ...
- C#中的值类型和引用类型,深拷贝,浅拷贝
from https://www.jianshu.com/p/2d27b06e253f 一.C#中的值类型和引用类型 概念 值类型直接存储其值. 引用类型存储对值的引用. 说起来有些拗口,其本质是Va ...
- 浅谈C#中的值类型和引用类型
在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个 ...
- 【.Net】浅谈C#中的值类型和引用类型
在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个 ...
- .NET中的值类型与引用类型
.NET中的值类型与引用类型 这是一个常见面试题,值类型(Value Type)和引用类型(Reference Type)有什么区别?他们性能方面有什么区别? TL;DR(先看结论) 值类型 引用类型 ...
- Windows Phone 开发起步之旅之二 C#中的值类型和引用类型
今天和大家分享下本人也说不清楚的一个C#基础知识,我说不清楚,所以我才想把它总结一下,以帮助我自己理解这个知识上的盲点,顺便也和同我一样不是很清楚的人一起学习下. 一说起来C#中的数据类型有哪些,大 ...
- js中的值类型和引用类型的区别
1.JavaScript中的变量类型有哪些? (1)值类型(基本类型):字符串(String).数值(Number).布尔值(Boolean).Undefined.Null (这5种基本数据类型是按 ...
- C#中的值类型、引用类型,代码告诉你他是什么类型。
C#代码告诉你这是什么类型. using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
随机推荐
- 华为-on演习--身高找到最好的二人
称号: 从5个人选择2作为个人礼仪器.中的每个个体的身高的范围160-190,要求2各高度差值至少(假设差异值同样的事情,他们中最高的选择),输出的两个人的身高升序. Smple input:161 ...
- Javascript作用域问题的构造函数的变量
构造函数new对于使用.代表创建对象.此外,它可以被用作普通的函数调用,因为它也是一个功能. function Person(name) { this.name=name; } Person(12); ...
- 聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描写叙述 聪明的"KK" 非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘.体现出本 ...
- D其他项目打电话AL工程EF Model
Based on your description and the error code, you will just need to ensure that your DataContext ...
- InputMonitor注意事项
文章只记录自己的点点理解.为了你自己的参考. 1.mInputFocus WMS.addWindow()-->WMS.finishUpdateFocusedWindowAfterAssignLa ...
- android从中国天气网获取天气
http://download.csdn.net/detail/sun6223508/8011669 里面的一切..可完全移植 版权声明:本文博主原创文章.博客,未经同意不得转载.
- redhat6.3已安装was6.1你可以不弹出安装程序
这在为期两天的课程redhat6.3安装was6.1 使用Xmanager打开图形界面.进入/WAS夹,跑./install 它有一个直接跳转,不管是什么反应,起初我以为这个问题的图形界面,搜索了半天 ...
- Codeforces 439C Devu and Partitioning of the Array(模拟)
题目链接:Codeforces 439C Devu and Partitioning of the Array 题目大意:给出n个数,要分成k份,每份有若干个数,可是仅仅须要关注该份的和为奇数还是偶数 ...
- android怎么在launcher改动内置apk的icon
找到launcher下的IconCache中加入变量用来存储要改动apk的包名 及要改动成的icon private String[] className = {"com.google.an ...
- oracle10g获得Date类型字段无分,秒的解决方案!
一般的数据库中,DATE字段只表示日期,不包含日期信息,而Oracle数据库中的DATE数据类型是包含日期.时间的,对于不同的Oracle jdbc驱动版本号.对于该问题的处理都有些差别. 近期使用 ...