服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 浅谈C#中对引用类型的误解

浅谈C#中对引用类型的误解

2022-08-01 11:04qylost C#

这篇文章主要介绍了浅谈C#中对引用类型的误解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

值类型和引用类型作为两个非常基础而且很重要的概念,一般我们都是在最开始的时候学的,你听到的可能是这样的:值类型传递的是具体的值(副本),引用类型传递的是引用,对于前者大家都不会有什么疑惑,但是在引用类型上就可能会进入一些误区。

概念插入:

值类型:值类型传递的是数据的副本,也就是将整个数据进行copy然后赋值给另一个变量。

引用类型:传递的是对象的地址/路径(一般都会叫做引用),在对象的赋值过程中实际上是把目标对象的地址以副本的形式给了接收的对象。

实例说明

如下我们新建了一个student类,定义了一个变量student1,然后定义了一个变量student2并将student1赋值给了它,紧接着创建了student3并将student3赋值给了student1。

输出结果:1

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class program
{
  static void main(string[] args)
  {
    //step1
    student student1 = new student() { studentid = 1 };
    student student2 = student1;
    student student3 = new student() { studentid = 3 };
    //step2
    student1 = student3;
    console.writeline(student2.studentid.tostring());
    console.readkey();
  }
}
public class student
{
  public int studentid { get; set; }
}

step1的操作如下图所示:

浅谈C#中对引用类型的误解

在图中的右侧我们使用矩形代替两个通过new关键字创建的对象,并为其标识了两个虚拟的id,在左侧我们定义了三个变量,如图的圆角矩形所示,这三个变量不是真正意义上的对象,只是对象的一个所在地址而已,也就是我们通过这个变量就可以找到一个特定的地址。其中student1变量持有的id(内存地址)为1001,student2也是1001,student3为1002。这里需要注意的是student1的1001和student2的1001虽然都是指向的1001,但是这两个1001都只是对象地址的一个副本,也就是说student1的1001和student2的1001并不是同一个,只是被copy了而已(可以理解为这个地址是以值类型的方式进行传递的)。

这里要注意的是变量student2和student1是没有关系的,它们只和右侧的1001有关系,只是它们地址的值是相等的。

new关键字:

创建特定对象的实例并返回其引用地址(只是返回了地址的一个副本,而不是真正的对象)

when the object is created, the memory is allocated on the managed heap, and the variable holds only a reference to the location of the object.(来源于官方文档:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/

译:创建对象后,内存会在托管堆上进行分配,并且变量只保留对对象位置的引用。

step2的操作如下图所示:

在step2的代码中我们将student3的变量赋值给了student1,那么这段代码执行的是将student3对应的id(引用地址)以副本的方式给了student1。

?
1
2
3
4
//step2
student1 = student3;
console.writeline(student2.studentid.tostring());
console.readkey();

浅谈C#中对引用类型的误解

如果你对引用传递理解有有偏差的话你可能会认为student2的地址也会变成1002,也就是student2.studentid变成了3。这样理解是不正确的,我们刚才说过了虽然它们的引用地址是都是1001,但是这个地址也是通过副本进行传递的。也就是说当student1的地址发生改变并不会影响student2的地址。

浅谈C#中对引用类型的误解

再述:

当右侧对象中的值发生改变时,通过左侧变量来获取拿到的就是改变后的值,而当左侧变量值的改变时并不会影响右侧对象值的。左侧变量值的改变只是对应的地址发生了改变而不是对象的值发生了改变。

浅谈C#中对引用类型的误解

举例分析

这里从我们常用的两个购物平台淘宝、京东来举例说明引用地址传递。

右侧有两个对象分别是淘宝和京东,左侧我们定义了三个变量来保存这个对象的地址(和上边的例子是一样的)

浅谈C#中对引用类型的误解

如下图,我们将vala变量存放的地址改成了www.jd.com ,我们只是改变了变量存放的地址而并没有改变vala之前所对应的对象的值。

浅谈C#中对引用类型的误解

总结

引用类型传递的是对象的引用,是将引用地址以副本的方式进行传递。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://segmentfault.com/a/1190000019968579

延伸 · 阅读

精彩推荐
  • C#C#请求http向网页发送接收数据的方法

    C#请求http向网页发送接收数据的方法

    这篇文章主要为大家详细介绍了C#请求http向网页发送数据、网页接收的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Joker373672022-01-19
  • C#C#异步下载文件

    C#异步下载文件

    这篇文章主要介绍了C#异步下载文件的相关资料,需要的朋友可以参考下...

    guwei40378352021-11-08
  • C#C#中for循环、while循环循环执行的方法

    C#中for循环、while循环循环执行的方法

    这篇文章主要介绍了C#中for循环、while循环循环执行的方法的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧...

    C#教程网6122021-11-29
  • C#C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例

    C#设计模式之Visitor访问者模式解决长隆欢乐世界问题实例

    这篇文章主要介绍了C#设计模式之Visitor访问者模式解决长隆欢乐世界问题,简单描述了访问者模式的定义并结合具体实例形式分析了C#使用访问者模式解决长...

    GhostRider8922022-01-21
  • C#C#实现定时关机小应用

    C#实现定时关机小应用

    这篇文章主要为大家详细介绍了C#实现定时关机小应用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Genven_Liang6972022-07-31
  • C#C#语言MVC框架Aspose.Cells控件导出Excel表数据

    C#语言MVC框架Aspose.Cells控件导出Excel表数据

    这篇文章主要为大家详细介绍了C#语言MVC框架Aspose.Cells控件导出Excel表数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    筱筱脱脱9372022-03-06
  • C#关于C#中ajax跨域访问问题

    关于C#中ajax跨域访问问题

    最近做项目,需要跨域请求访问数据问题。下面通过本文给大家分享C#中ajax跨域访问代码详解,需要的朋友可以参考下...

    CDL_Darren7422022-01-05
  • C#C#实现组合排列的方法

    C#实现组合排列的方法

    这篇文章主要介绍了C#实现组合排列的方法的相关资料,并附实例代码,需要的朋友可以参考下...

    C#教程网6552021-12-09