C#值类型赋值与引用类型的赋值

在C#中,数据类型大致可以分为两类,一类是值类型,一类是引用类型。初学者往往会被类型之间的相互赋值搞的很迷惑,尤其是引用类型变量的相互赋值。

现在举2个例子,来一一说明。

值类型变量的赋值: 值类型变量中保存的是实际数据,在赋值的时候只是把数据复制一份,然后赋给另一个变量。

例子1:

int var1=2;

int var2=var1;  //编译器会先复制var1的值,然后把它赋给var2.很明显var2的值也为2

引用类型变量的赋值:  引用类型变量中保存的是“指向实际数据的引用指针”。在进行赋值操作的时候,它和值类型一样,也是先有一个复制的操作,不过它复制的不是实际的数据,而是引用(真实数据的内存地址)。所以引用类型的变量在赋值的时候,赋给另一变量的实际上是内存地址。这样赋值完成后,2个引用变量中保存的是同一引用,他们的指向完全一样。

例子2:

class MyClass
 {
       public int val;
}
struct MyStruct
{
       public int val;
}
class Program
{
      static void Main(string[] args)
      {
             MyClass objectA=new MyClass();
             MyClass objectB=objectA;                 //引用变量的赋值 赋值操作完成后,两个变量都指向同一内存地址
             objectA.val=10;                               //给objectA.val赋值=10 由于objectB和objectA指向同一内存地址,所以ojbectB.val的值也为10
             objectB.val=20;                               //给objectB.val赋值=20 由于objectB和objectA指向同一内存地址,所以objectA.val的值也为20

             MyStruct structA=new MyStruct();
             MyStruct structB=structA;                //结构是值类型 赋值操作完成后,两个结构中的结构信息一致。注意是“结构中的信息”一致。
             structA.val=30;
             structB.val=40; 

             Console.WriteLine(objectA.val);         //输出结果是20
             Console.WriteLine(objectB.val);         //输出结果是20
             Console.WriteLine(structA.val);         //输出结果是30
             Console.WriteLine(structB.val);         //输出结果是40
             Console.ReadLine();
       }
}  

  

从上面2个例子可以看出,值类型变量的赋值操作,仅仅是2个实际数据之间的复制。而引用类型变量的赋值操作,复制的是引用,即内存地址,由于赋值后二者都指向同一内存地址,所以改变其中一个,另一个也会跟着改变,二者就像绑定在了一起。

原文地址:https://www.cnblogs.com/bingbing-liuyue/p/11821004.html

时间: 2024-10-07 07:44:18

C#值类型赋值与引用类型的赋值的相关文章

EffectiveC#6--区别值类型数据和引用类型数据

1. 设计一个类型时,选择struct或者class是件简单的小事情,但是,一但你的类型发生了改变, 对所有使用了该类型的用户进行更新却要付出(比设计时)多得多的工作. 2.值类型:无多态但性能佳. 值类型(结构)存储数据,而引用类型(类)表现行为或职责. 3. public class C { private MyType _a = new MyType( ); private MyType _b = new MyType( ); // Remaining implementation rem

【转】c#引用类型与值类型的区别大盘点

解析:CLR支持两种类型:值类型和引用类型.用Jeffrey Richter(<CLR via C#>作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题”.这就要求我们正确理解和使用值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类).C#中的每

【转】C#详解值类型和引用类型区别

通用类型系统 值类型 引用类型 值类型和引用类型在内存中的部署 1 数组 2 类型嵌套 辨明值类型和引用类型的使用场合 5 值类型和引用类型的区别小结 首先,什么是值类型,什么是引用类型? 在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中. 值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型.值类型变量声明后,不管是否已经赋值,编译器为其分配内

C# 类型基础 值类型和引用类型

引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复制(Shallow Copy)和深度复制(Deep Copy),浅度复制和深度复制又是以如何复制引用类型成员来划分的.由此又引出了引用类型和值类型,以及相关的对象判等.装箱.拆箱等基础知识.索性从最基础的类型开始自底向上写起. 值类型和引用类型 先简单回顾一下C#中的类型系统.C# 中的类型一共分为

20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)

1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class 类名 { 字段; 属性; 方法; } 写好了一个类之后,我们需要创建这个类的对象,那么,我们管创建这个类的对象过程称之为类的实例化.使用关键字new 实例化类===创建类 this:表示当前这个类的对象. 类是不占内存的,而对象是占用内存的. 结构是面向过程的,类是面向对象的,之前没有面向对象的时候

c#值类型和引用类型

值类型值类型的特性:1.C#的所有值类型均隐式派生自System.ValueType.各个值类型及其基类:结构体:struct(直接派生于System.ValueType):数值类型:整型:short(System.Int16),ushort(System.UInt16),int(System.Int32),uint(System.UInt32),long(System.Int64),ulong(System.UInt64),sbyte(System.SByte的别名),byte(System.

c# 引用类型与值类型的区别有哪些

解析:CLR支持两种类型:值类型和引用类型.用Jeffrey Richter(<CLR via C#>作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题”.这就要求我们正确理解和使用值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类).C#中的每

.Net中值类型和引用类型的区别

解析:CLR支持两种类型:值类型和引用类型.用Jeffrey Richter(<CLR via C#>作者)的话来说,"不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题".这就要求我们正确理解和使用值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的

NET基础(4):引用类型和值类型

CLR支持两种类型:引用类型和值类型.虽然FCL的大多数类型都是引用类型,但程序员用的最多的还是引用类型,引用类型总是从托管堆分配,c#的new操作符返回对象内存地址-即指向对象数据的内存地址.使用引用类型必须注意性能问题.首先要认清楚以下4个方面: 1.内存必须从托管堆分配. 2.堆上分配的每个对象都有一些额外的成员,这些成员必须初始化. 3.对象中的其它字节(为字段而设)总是设为零. 4.从托管堆分配对象时,可能强制执行一次垃圾回收. 如果所有类型都是引用类型,应用程序的性能将会显著下降.设