这次与大家共同学习C#中的 值参数——引用类型

上篇文章我与大家共同学习了 值参数——值类型

我们知道:1.值参数创建变量的副本 2.对值参数的改变不会影响变量的值

这次来看 值参数——引用类型,创建新对象

看一个例子:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ParametersSimple
{
class Program
{
static void Main(string[] args)
{
Student stu = new Student() { Name = "Tom" };
Method(stu);
Console.WriteLine(stu.Name);
} //创建一个叫Method的静态方法传进来的参数是Student类型的参数
//方法内我们创建一个实例并由stu这个参数引用着,新创建的实例名字叫“Mark”
static void Method(Student stu)
{
stu = new Student() { Name = "Mark" };
Console.WriteLine(stu.Name);
}
} class Student
{
public string Name { get; set; }
}
}

程序运行后,窗口内上下两行分别显示:

----------------------------------------------

Mark

Tom

-----------------------------------------------

大家可以自行编译一下。

解释:

引用类型存储的是实例的地址

方法外的变量stu存储了对象的地址,传入方法里的值也便是对象的地址,还记着吗:值参数创建变量的副本 此时方法内的副本也存储了这个对象的地址

我们调用方法后,改变了副本里的值,也便就是改变了副本里之前存的地址,换成了一个新地址,那么自然而然的它指向了一个新对象 还记着吗:对值参数的改变不会影响变量的值

所以 方法外的变量依旧指向原来的那个对象,而更改后的副本指向了一个新对象,它们互不影响。

这个例子有个坏处,那就是我把方法内和方法外的stu的对象的名字都改成一样的,程序运行完后屏幕上打印出两个相同的名字,那么就无法分辨了。

所以我们要改进!

GetHashCode() 方法
每个对象的HashCode是不一样的
所以:
 namespace ParametersSimple
{
class Program
{
static void Main(string[] args)
{
Student stu = new Student() { Name = "Tom" };
Method(stu);
Console.WriteLine("{0},{1}", stu.GetHashCode(), stu.Name);
} static void Method(Student stu)
{
stu = new Student() { Name = "Tom" };//我把这里的名字改的和方法外的一样了
Console.WriteLine("{0},{1}",stu.GetHashCode(),stu.Name);
}
} class Student
{
public string Name { get; set; }
}
}

运行结果

注意到了吗,名字前面的数值不一样,说明他们分别指向了不同的对象,方法内的副本指向了一个新的对象

------------------------------------------------------------------------------------------------------------------------

To be Continued!

下篇与大家一起学习  传值参数--引用类型,不创建新对象,只操作对象

-----------------------------------------------------------------------------------------------------------------------

希望广大网友指出问题所在,指出我哪里理解错了,共同交流,共同进步!

C#——传值参数(2)的更多相关文章

  1. C#——传值参数(1)

    //我的C#是跟着猛哥(刘铁猛)(算是我的正式老师)<C#语言入门详解>学习的,微信上猛哥也给我讲解了一些不懂得地方,对于我来说简直是一笔巨额财富,难得良师! 这次与大家一起学习C#中的值 ...

  2. C#——传值参数(3)

    上篇文章我与大家共同学习了 值参数——引用类型这次与大家共同学习 传值参数--引用类型,不创建新对象,只操作对象这是个思维导图:我们仍需记住:1.值参数创建变量的副本 2.对值参数的改变不会影响变量的 ...

  3. PCL智能指针疑云 <三> 智能指针作为函数的传值参数和传引用参数

    一 函数的参数传递可以简单分类为“传值”和“传引用”. 声明函数时,形参带引用“&”,则函数调用时,是把实参所在的内存直接传给函数所开辟的栈内存.在函数内对形参的修改相当于对实参也进行修改. ...

  4. Mybatis框架中Mapper文件传值参数获取。【Mybatis】

    1.参数个数为1个(string或者int) dao层方法为以下两种: /** * 单个int型 */ public List<UserComment> findByDepartmentI ...

  5. asp.net MVC4在Action间跳转 RedirectToAction 传值参数问题

    return RedirectToAction("Test", new { cw = cw, firstdirectoryid = firstdirectoryid }); 上式中 ...

  6. 用AJAX传值参数是中文时可能会乱码

    1.ajax代码 function SelectSemesterBySchYear() { // alert('sssssss'); var temp1 = document.getElementBy ...

  7. C# - 值类型、引用类型&走出误区,容易错误的说法

    1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...

  8. Delphi_07_Delphi_Object_Pascal_基本语法_05_函数参数

    这里主要讨论Delphi中函数.方法的相关内容. 一.工程文件 { Delphi语法方法和函数 1.方法 2.函数 } program Routine; {$APPTYPE CONSOLE} uses ...

  9. C++基础知识面试精选100题系列(11-20题)[C++ basics]

    [原文链接] http://www.cnblogs.com/hellogiser/p/100-interview-questions-of-cplusplus-basics-11-20.html [题 ...

随机推荐

  1. 初识Hadoop、Hive

    2016.10.13 20:28 很久没有写随笔了,自打小宝出生后就没有写过新的文章.数次来到博客园,想开始新的学习历程,总是被各种琐事中断.一方面确实是最近的项目工作比较忙,各个集群频繁地上线加多版 ...

  2. 在WPF中使用依赖注入的方式创建视图

    在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...

  3. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  4. 继电器是如何成为CPU的(1)

    继电器是如何成为CPU的(1) ——<穿越计算机的迷雾>整理和总结 究竟是如何设计的电路,具有计算和控制的智力? 这一点也不高深.本系列文章从初中学的最简单的电路图说起,看看能不能从最初的 ...

  5. Android 获取meta-data中的数据

    在 Android 的 Mainfest 清单文件中,Application,Activity,Recriver,Service 的节点中都有这个的存在.很多时候我们可以通过 meta-data 来配 ...

  6. ntp

    一: 在一台可以连接外网的服务器A上配置ntp: 配置  /etc/ntp.conf  文件: server 202.120.2.101            # local clock (LCL) ...

  7. 用angular怎么缓存父页面数据

    angular做单页面应用是一个比较好的框架,但是它有一定的入门难度,对于新手来说可能会碰到很多坑,也有许多难题,大部分仔细看文档,找社区是能解决的. 但有些问题也许资料比较少,最近遇到过一个要缓存父 ...

  8. SAP CRM 将组件整合至导航栏中

    到现在,我们已经可以让组件独立地显示.我们只是运行它.让它显示在Web UI中.让我们把组件整合进导航栏,使我们可以在正常登录Web UI时访问它. 步骤一: 为你的UI组件主窗体创建一个内向插件. ...

  9. ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)

    前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...

  10. A/B Testing的简要知识

    A/B testing主要用来检测网站或者APP的两个版本中哪一个更好,它的中心思想是把流量一分为二,一份用作experiment group,访问新的版本,另一份用作control group,访问 ...