.NET:默认是按值传递的
小测试
代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Linq.Expressions;
using System.Threading; namespace CSharpStudy
{
class Program
{
static void Main(string[] args)
{
{
var t1 = new TestClass();
var t2 = TestMethod1(t1); Console.WriteLine(t1.Value);
Console.WriteLine(t2);
}
{
var t1 = new TestClass();
var t2 = TestMethod2(ref t1); Console.WriteLine(t1);
Console.WriteLine(t2);
}
} private static TestClass TestMethod1(TestClass test)
{
test.Value = ;
test = null;
return test;
} private static TestClass TestMethod2(ref TestClass test)
{
test.Value = ;
test = null;
return test;
}
} internal class TestClass
{
public int Value { get; set; }
}
}
输出
如果输出结果你不意外,也能理解到底发生了什么,那么就不用看这篇文章了。
默认是按值传递的
var a = new TestClass(); 中 a 叫“reference”,等号右侧叫“instance”,作为局部变量的 reference 分配在栈中,作为成员的 reference 内联存储在堆中,instance 始终分配在堆中,reference 指向了 instance,可以理解为存储了 instance 的地址。
var a = new TestStruct(); 中 a 叫“value”,右侧返回的值就分配在 a 中,作为局部变量的 value 分配在栈中,作为成员的 value 内联存储在堆中。
.NET 默认是按值进行传递的(参数传递、变量之间的赋值),var a = b; 中如果 b 是引用类型,栈中就有两个引用,一个对象,两个引用共同指向同一个对象。如果 b 是值类型,栈中就有两个值,彼此独立。
.NET:默认是按值传递的的更多相关文章
- 有关C# struct的一个误区
参考:http://blog.csdn.net/onlyou930/article/details/5568319 下面写一个新的例子: using System; using System.Coll ...
- CLR VIA
标题 状态 内容 什么是CLR? 什么是托管模块? 托管模块由什么组成? .net代码的执行过程 http://www.cnblogs.com/aaa6818162/p/4726581.ht ...
- C#基础|值类型和引用类型以及传参问题
为了明白什么是值类型和引用类型,先引入你两个概念.堆内存与栈内存 堆内存与栈内存 由于咱的描述能力有限,就不对其下定义了,来看看两者的作用. 共同点: 都是用来存放数据的 不同点: 堆 ...
- C#编译器闭包机制
背景 C# 在编译器层面为我们提供了闭包机制(Java7 和 Go 也是这种思路),本文简单的做个解释. 背景知识 你必须了解:引用类型.值类型.引用.对象.值类型的值(简称值). 关于引用.对象和值 ...
- 《细说PHP》的php语言结构
6.1流程控制 顺序结构 语句按照出现的先后次序自上而下依次执行 分支结构 先做判断再做选择 6.3.4 特殊的流程控制语句 break语句结束当前for.foreach.while.do-while ...
- 工作中的趣事:聊聊ref/out和方法参数的传递机制
0x00 前言 我在之前的游戏公司工作的时候,常常是作为一只埋头实现业务逻辑的码农.在工作之中不常有同事会对关于编程的话题进行交流,而工作之余也没有专门的时间进行技术分享.所以对我而言上家虽然是一家游 ...
- 深入理解.net - 4.你必须知道的String
为什么要单独写string,主要是它太常用了,同时又太特殊了,特殊到CLR对它的处理都和其它对象不一样.简直可以称为VIP用户啊.本文并不是一篇介绍如何使用string的文章,而是旨在阐述string ...
- .NET:C# 如何实现的闭包?
背景 C# 在编译器层面为我们提供了闭包机制(Java7 和 Go 也是这种思路),本文简单的做个解释. 背景知识 你必须了解:引用类型.值类型.引用.对象.值类型的值(简称值). 关于引用.对象和值 ...
- [UE4]传值与传引用
值传递是圆形图标 设置引用需要使用Set by ref函数 对象在蓝图中都是以引用传递 对象,不需要额外设置参数类型是传值还是传引用. 结构体在蓝图中默认是按值传递 也可以手动设置结构体参数为按引用类 ...
随机推荐
- 查看library的依赖树
今天一同事问我如何解决包依赖重复的问题,我告诉他你可以用exclude,provide,compileOnly等关键字,他问我如何查找某个库依赖了什么,我说有一个插件,愣是想了好久没想起什么名字来,搜 ...
- ecplise里的run as里只有run configurations是怎么回事?
一.没有main方法 二.main方法所在的类不是在与文件名同名的类中
- 体会 git 之优越性
既生瑜,何生亮.已有subversion,何需git?先有firefox叱咤一时,何需chrome来搅局? 原本以为之前的解决方案已经能够满足现时的需求,但这是真正的事实吗?直到新颖的工具降临,才惊叹 ...
- SpringBoot属性配置
一:url的配置 1.配置 默认配置文件是application.properties 2.配置 配置端口 配置context path 3.启动效果 4.第二种配置方式 要先删除applicatio ...
- 005 jquery过滤选择器-----------(内容过滤选择器)
1.介绍 2.程序 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- 关于Sql Server的一些知识点的定义总结
数据库完整性:是指数据库中数据在逻辑上的一致性.正确性.有效性和相容性 实体完整性(Entity Integrity 行完整性):实体完整性指表中行的完整性.主要用于保证操作的数据(记录)非空.唯一 ...
- django邮件
1.邮件变量 (django settings.py) ADMINS = [('JOHN','JOHN@example.com'),('zhang','zhang@example.com')] #设置 ...
- 一个轻巧高效的多线程c++stream风格异步日志(二)
目录 一个轻巧高效的多线程c++stream风格异步日志(二) 前言 LogFile类 AsyncLogging类 AsyncLogging实现 增加备用缓存 结语 一个轻巧高效的多线程c++stre ...
- Bzoj4237 cdq分治+树状数组+单调栈
二维平面在某区域内点的问题,要么树套树,kdtree,要么就是cdq分治了.然而这题树套树和kdtree都不是很好搞的样子,于是我们就只能cdq分治了.首先把点按照横坐标x排序,在每一层我们需要算出右 ...
- C#、Java、Javascript获取Unix时间戳
背景: 因为项目需要,需要几种语言联动开发,日期字段设计的数字型 获取Unix时间戳代码: Java System.currentTimeMillis() Javascript new Date(). ...