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值,但是没有限制个数 ...
随机推荐
- C#使用oledb操作excel文件的方法
本文实例讲述了C#使用oledb操作excel文件的方法.分享给大家供大家参考.具体分析如下: 不管什么编程语言都会提供操作Excel文件的方式,C#操作Excel主要有以下几种方式: 1.Excel ...
- .NET高级代码审计(第一课)XmlSerializer反序列化漏洞
0X00 前言 在.NET 框架中的 XmlSerializer 类是一种很棒的工具,它是将高度结构化的 XML 数据映射为 .NET 对象.XmlSerializer类在程序中通过单个 API 调用 ...
- leetcode 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...
- NetCore入门篇:(八)Net Core项目使用Controller之三
一.简介 1.本节主要说明入参的几种接收方式 二.不限定模式 1.定义一个id入参与一个model入参. 2.get\post分别查看访问效果. api代码 public class OneContr ...
- 如何做好iOS应用安全?这有一把行之有效的“三板斧”
本文由 网易云发布. iOS应用面临很多破解问题,常见的有IAP内购破解.山寨版本.破解版本等:大众应用上,微信抢红包.微信多开等:而在iOS游戏上,越来越泛滥的外挂问题也不断困扰着游戏厂商. 网易 ...
- Visual Studio在Win10中以管理员方式运行
在Win10中运行VS不是默认以管理员程序运行的,需要手动设置 第一步:将VS快捷方式设置为以管理员身份运行 第二部 在C:\Program Files\Microsoft Visual Studio ...
- Tomcat 7.x/8.x 优化
一.优化Connector http://www.aikaiyuan.com/8466.html tomcat的运行模式有3种 1)bio 默认的模式,性能非常低下,没有经过任何优化处理和支持. 2) ...
- dpdk EAL: Error reading from file descriptor 23: Input/output error
执行test程序时输出: EAL: Error reading from file descriptor 23: Input/output error 原因: 在虚拟机添加的网卡,dpdk不支持导致的 ...
- Union Find-547. Friend Circles
There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...
- TOMCAT开启APR模式
Tomcat支持三种接收请求的处理方式:BIO.NIO.ARP. BIO模式:阻塞式I/O操作,表示Tomcat使用传统Java I/O操作.默认情况下,Tomcat7以下版本使用BIO模式运行,由于 ...