C#——传值参数(2)
这次与大家共同学习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)的更多相关文章
- C#——传值参数(1)
//我的C#是跟着猛哥(刘铁猛)(算是我的正式老师)<C#语言入门详解>学习的,微信上猛哥也给我讲解了一些不懂得地方,对于我来说简直是一笔巨额财富,难得良师! 这次与大家一起学习C#中的值 ...
- C#——传值参数(3)
上篇文章我与大家共同学习了 值参数——引用类型这次与大家共同学习 传值参数--引用类型,不创建新对象,只操作对象这是个思维导图:我们仍需记住:1.值参数创建变量的副本 2.对值参数的改变不会影响变量的 ...
- PCL智能指针疑云 <三> 智能指针作为函数的传值参数和传引用参数
一 函数的参数传递可以简单分类为“传值”和“传引用”. 声明函数时,形参带引用“&”,则函数调用时,是把实参所在的内存直接传给函数所开辟的栈内存.在函数内对形参的修改相当于对实参也进行修改. ...
- Mybatis框架中Mapper文件传值参数获取。【Mybatis】
1.参数个数为1个(string或者int) dao层方法为以下两种: /** * 单个int型 */ public List<UserComment> findByDepartmentI ...
- asp.net MVC4在Action间跳转 RedirectToAction 传值参数问题
return RedirectToAction("Test", new { cw = cw, firstdirectoryid = firstdirectoryid }); 上式中 ...
- 用AJAX传值参数是中文时可能会乱码
1.ajax代码 function SelectSemesterBySchYear() { // alert('sssssss'); var temp1 = document.getElementBy ...
- C# - 值类型、引用类型&走出误区,容易错误的说法
1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...
- Delphi_07_Delphi_Object_Pascal_基本语法_05_函数参数
这里主要讨论Delphi中函数.方法的相关内容. 一.工程文件 { Delphi语法方法和函数 1.方法 2.函数 } program Routine; {$APPTYPE CONSOLE} uses ...
- C++基础知识面试精选100题系列(11-20题)[C++ basics]
[原文链接] http://www.cnblogs.com/hellogiser/p/100-interview-questions-of-cplusplus-basics-11-20.html [题 ...
随机推荐
- 【.net 深呼吸】细说CodeDom(4):类型定义
上一篇文章中说了命名空间,你猜猜接下来该说啥.是了,命名空间下面就是类型,知道了如何生成命名空间的定义代码,之后就该学会如何声明类型了. CLR的类型通常有这么几种:类.接口.结构.枚举.委托.是这么 ...
- 继电器是如何成为CPU的(1)
继电器是如何成为CPU的(1) ——<穿越计算机的迷雾>整理和总结 究竟是如何设计的电路,具有计算和控制的智力? 这一点也不高深.本系列文章从初中学的最简单的电路图说起,看看能不能从最初的 ...
- LeetCode: 3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程
前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...
- VS2015在创建项目时的一些注意事项
一.下面是在创建一个新的项目是我最常用的,现在对他们一一做一个详细的介绍: 1.Win32控制台应用程序我平时编写小的C/C++程序都用它,它应该是用的最多的. 2.名称和解决方案名称的区别:名称是项 ...
- Java 进阶 hello world! - 中级程序员之路
Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...
- Linux系统中用DNW向ARM开发板下载程序
在Linux下通过dnw来给开发板发送程序.包括驱动程序代码:secbulk.c,应用程序代码:dnw.c.只能运行在32位系统上,在64位系统上提示错误:DNW download Data size ...
- Storm介绍(一)
作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 内容简介 本文是Storm系列之一,介绍了Storm的起源,Storm ...