c#中引用类型作为值参数和引用参数问题
一、分类
C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。
C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。
二。参数传递
对于引用类型,不管是将其作为值参数传递还是引用参数传递,都可以在方法成员内部修改其内容。而值类型则不能修改。首先举一个简单的例子
(1)引用类型和值类型作为参数传递的区别:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 引用类型问题
{
class Program
{
static void test1(ref int val1,int val2)
{
val1 = ;
val2 = ;
Console.WriteLine("val1={0},val2={1}", val1, val2);
} static void Main(string[] args)
{
myclass mc = new myclass();
test1(ref mc.val1, mc.val2);
Console.WriteLine("函数调用后:val1={0},val2={1}", mc.val1, mc.val2);
Console.ReadKey();
}
} class myclass
{
public int val1 = ;
public int val2 = ;
}
}
输出结果是: val1=10,val2=20
函数调用后:val1=10,val2=0
引用类型中,如果在方法内创建新对象并赋值给形参会产生什么结果呢?
(1)引用类型作为值参数传递时,如果在方法内创建对象并赋值给形参,将切断形参与实参之间的联系,并在方法调用结束后,新对象也不复存在
class myclass
{
public int val1 = ;
} class Program
{
static void test1(myclass f1)
{
f1.val1 = ;
Console.WriteLine("创建新对象前:val1={0}", f1.val1);
f1 = new myclass();
Console.WriteLine("创建新对象后:val1={0}", f1.val1); } static void Main(string[] args)
{
myclass mc = new myclass();
Console.WriteLine("函数调用...");
test1(mc);
Console.WriteLine("函数调用后:val1={0}", mc.val1);
Console.ReadKey();
}
}
输出结果为: 函数调用...
创建新对象前:val1=60
创建新对象后:val1=10
函数调用后:val1=60
值得注意的是,函数调用结束后并没有改变val1的值,因为在方法调用结束后新对象已经不存在了。
(2)引用类型对象作为引用参数传递时,如果在方法内创建对象并赋值给形参,在方法结束后该对象依然存在,并且是实参所引用的值
class myclass
{
public int val1 = ;
} class Program
{
static void test1(ref myclass f1)
{
f1.val1 = ;
Console.WriteLine("创建新对象前:val1={0}", f1.val1);
f1 = new myclass();
Console.WriteLine("创建新对象后:val1={0}", f1.val1); } static void Main(string[] args)
{
myclass mc = new myclass();
Console.WriteLine("函数调用...");
test1(ref mc);
Console.WriteLine("函数调用后:val1={0}", mc.val1);
Console.ReadKey();
}
}
这段代码和上面几乎没区别,只是在引用参数调用的时候添加了ref关键字,但结果却不一样
输出结果为: 函数调用...
创建新对象前:val1=60
创建新对象后:val1=10
函数调用后:val1=10
函数调用后val1的值也变成了10.
c#中引用类型作为值参数和引用参数问题的更多相关文章
- C#值参数和引用参数
一.值参数 未用ref或out修饰符声明的参数为值参数. 使用值参数,通过将实参的值复制到形参的方式,把数据传递到方法.方法被调用时,系统做如下操作. 在栈中为形参分配空间. 复制实参到形参. 值参数 ...
- C#方法的六种参数,值参数、引用参数、输出参数、参数数组、命名参数、可选参数
方法的参数有六种,分别是值参数.引用参数.输出参数.参数数组.命名参数.可选参数. 值参数 值参数是方法的默认类型,通过复制实参的值到形参的方式把数据传递到方法,方法被调用时,系统作两步操作: 在栈中 ...
- C#_delegate - 值参数和引用参数
值参数不能加,引用参数可以. 引用参数是共享的 using System; using System.Collections.Generic; using System.Linq; using Sys ...
- C#的值参数与引用参数
值参数:在使用值参数时,是把变量的值传给函数,函数中对此变量的任何修改都不影响该变量本身的值. 引用参数:使用引用参数时,在函数中对此变量的修改会影响变量的值. 说简单点,值参数,就是我把身份证复印件 ...
- 传入值参数&传入引用参数的区别
传值&传引用 1.传值 是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 2.传地址 是传值的一种特殊方式,只是他传递的是地址 那么传地址以后,实参和行参都指向同一个对象 3.传引用 ...
- [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子
本文地址:http://blog.csdn.net/sushengmiyan/article/details/20406269 作者:sushengmiyan // sushengmiyanTest. ...
- python-在定义函数时,不定长参数中,默认值参数不能放在必选参数前面
如果一个函数的参数中含有默认参数,则这个默认参数后的所有参数都必须是默认参数,否则会报错:SyntaxError: non-default argument follows default argum ...
- Java中到底是值传递还是引用传递?
Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...
- python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参
1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...
随机推荐
- apache模块 合并多个js/css 提高网页加载速度
win : http://blog.csdn.net/mycwq/article/details/9361117 linux :http://blog.csdn.net/mycwq/article/ ...
- Tomcat的error-page掩盖action实例化的exception
在使用Struts2+Spring+Tomcat开发的时候,为了避免骚扰用户,线上系统我们一般会定义错误处理页面.但是如果开发环境中也这么做(在web.xml定义了错误转发页面),而碰巧某个actio ...
- DBCC--常用跟踪标记
使用DBCC TRACEON 和DBCC TRACEOFF来打开和关闭跟踪标记 使用DBCC TRACESTATUS来查看所有打开的跟踪标记 --260:打印关于扩展存储过程动态链接库的版本信息 -- ...
- DBCC--SHOWCONTIG
DBCC SHOWCONTIG是显示指定的表的数据和索引的碎片信息. Usage: dbcc SHOWCONTIG [ ( { 'table_name' | table_id | 'view_name ...
- .NET 简易方法拦截器
伟大的无产阶级Willaim曾说过:"无论你觉得自己多么的了不起,也永远有人比你更强".对,我说过!我就是william. 今天想记录一下在项目中遇到的一个比较有意思的东西,异常拦 ...
- C# 实现邮件代发
由于自己很好奇,有一些推广之类的 邮件,发件人后面,都有一个 由 .... 代发. 所以,查找了一些资料,来验证了一下实现方法. 咱们先来看看,实现代发的 理想效果图 当然,这一种,是利用 代发的 邮 ...
- NGUI图集字体
UIFont里使用Symbols来指定字体时用Sprite前缀和名字自动分配的工具,前段时间工作需要时写的,具体用法有空时再写. using UnityEngine; using UnityEdito ...
- 換根lca
假設我們要求u,v,在根為rt情況下的lca 則lca為lca(u,v),lca(u,rt),lca(v,rt)中的深度的最大值
- mybatis中单个参数的引用
单个参数时在test条件中不能用参数名来引用,可以使用_parameter
- Git 使用流程
# 下载远程仓库到本地 git clone 仓库地址cd 本地仓库文件夹 # 创建本地开发分支并与远程开发分支关联 git checkout -b develop origin/developgit ...