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 [题 ...
随机推荐
- JS核心系列:浅谈函数的作用域
一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...
- Hyper-V无法文件拖拽解决方案~~~这次用一个取巧的方法架设一个FTP来访问某个磁盘,并方便的读写文件
异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 服务器相关的知识点:http://www.cnblogs.com/dunitia ...
- 使用技术手段限制DBA的危险操作—Oracle Database Vault
概述 众所周知,在业务高峰期,某些针对Oracle数据库的操作具有很高的风险,比如修改表结构.修改实例参数等等,如果没有充分评估和了解这些操作所带来的影响,这些操作很可能会导致故障,轻则导致应用错误, ...
- ASP.NET Core框架揭秘(持续更新中…)
之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进 ...
- ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式
由于ASP.NET Core应用是一个同时处理多个请求的服务器应用,所以在处理某个请求过程中抛出的异常并不会导致整个应用的终止.出于安全方面的考量,为了避免敏感信息的外泄,客户端在默认的情况下并不会得 ...
- Mac OS、Ubuntu 安装及使用 Consul
Consul 概念(摘录): Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStac ...
- C#中将DataTable导出为HTML的方法
今天我要向大家分享一种将DataTable导出为到HTML格式的方法.有时我们需要HTML格式的输出数据, 以下代码就可以帮助我们达到目的,. 首先,我们要绑定DataTable和 DataGridV ...
- 在 SharePoint Server 2016 本地环境中设置 OneDrive for Business
建议补丁 建议在sharepoint2016打上KB3127940补丁,补丁下载地址 https://support.microsoft.com/zh-cn/kb/3127940 当然不打,也可以用O ...
- 解决:SharePoint当中的STP网站列表模板没有办法导出到其它语言环境中使用
首在在你的英文版本上,导出列表或是网站的模板,这个文件可能是这样滴:template.stp 把这个文件 template.stp 命名为 template.cab 解压 这个 *.cab 文件 在解 ...
- ios 类似微信红点显示功能
设计思路:给UIView增加一个分类 所有的视图都可以根据需要来进行红点显示 #import <UIKit/UIKit.h> @interface UIView (CHRRedDot) @ ...