今天查bug的时候,遇到一个问题,一个Dictionary<int[],string>数据结构,在使用key取它的value时:

var tempVar = _dic[key];

发生崩溃。跟进去看看,发现不对啊,key是有的啊,怎么回事?然后并不可能是VS的问题。仔细查了才发现,原来用作索引的key,并不是Dictionary里的keys里的key。

简单地说,就是Dictionary里用1,2,3作为key,而传入的key是:1',2',3'。这样当然是找不到的。由此,引发的想到引用类型和值类型的问题。

写了个简单的程序整理了一下,代码如下。

public class IntArrayProperty
{
public void verifyNew(int[] alist)
{
alist = new int[]
{
-1,-1,-1,
};
} public void verifyModify(int[] alist)
{
alist[0] = -1;
alist[1] = -1;
alist[2] = -1;
} public static void print(int[] arr)
{
foreach (var item in arr)
{
Console.WriteLine(item);
}
} /// <summary>
/// 9
/// 9
/// 9
/// -1
/// -1
/// -1
/// </summary>
public static void solution()
{
IntArrayProperty it = new IntArrayProperty();
int[] arr = { 9, 9, 9 };
it.verifyNew(arr);
print(arr); int[] brr = { 8, 8, 8 };
it.verifyModify(brr);
print(brr); Console.ReadLine();
}
}

仅仅看代码还是不够理论,对于这个现象,我总结了一下:you cannot change a reference even if it refers to a reference; you can only modify it unless it's modified by ref keyword.

分析一下:对于引用类型的值,传递的时候,仍旧是引用的值。当通过引用来修改时,当然没有问题;但是new出来的对象,只赋值给了参数传递时,创建的引用的复本,因此并不能影响到原始参数。

Passing Reference by value的更多相关文章

  1. Passing Reference Data Type Arguments

    public void moveCircle(Circle circle, int deltaX, int deltaY) { // code to move origin of circle to ...

  2. Python中的passed by assignment与.NET中的passing by reference、passing by value

    Python文档中有一段话: Remember that arguments are passed by assignment in Python. Since assignment just cre ...

  3. 9.Parameters

    1.Optional and Named Parameters calls these methods can optionally not specify some of the arguments ...

  4. java按值传递理解(转)

    ava没有引用传递只有按值传递,没有引用传递只有按值传递,值传递. 通过下面代码解释: 1 public class Test { 2 public static void main(String[] ...

  5. [No0000145]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈2/4

    前言   虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程 ...

  6. 由swap引发的关于按值传递和引用传递的思考与总结

    函数的参数传递定义:在调用一个函数时,将实参传递给形参. C++中函数的参数传递有按值传递.地址传递和引用传递3种方式.注意:地址也是一种值,按值传递和按地址传递都是单向的值传递方式,即形参都不会回传 ...

  7. (转)vim 访问系统剪贴板

    原文出处:http://vim.wikia.com/wiki/Accessing_the_system_clipboard Please review this tip: This tip was i ...

  8. 关于C#你应该知道的2000件事

    原文 关于C#你应该知道的2000件事 下面列出了迄今为止你应该了解的关于C#博客的2000件事的所有帖子. 帖子总数= 1,219 大会 #11 -检查IL使用程序Ildasm.exe d #179 ...

  9. passed into methods by value java专题

    java没有引用传递只有按值传递,没有引用传递只有按值传递,值传递.因为Primitive类型的值不能改变,所以method不能更改调用方传的primitive 值.因为method更改的是Primi ...

随机推荐

  1. mac osx 10.9安装配置macvim

    如果你已经安装了macvim,升级后又不能用了,建议你可以看看http://kodira.de/2013/10/macvim-osx-10-9-mavericks/这篇文章,如果你还没有安装,下面由我 ...

  2. Win32_Battery class

    wmi的Win32_Battery类实现 其中EstimatedChargeRemaining属性返回剩余电量的百分比,EstimatedRunTime属性返回剩余时间(分钟) 其他属性参考http: ...

  3. 构建一个真实的应用电子商务SportsStore(十一)

    构建一个真实的应用电子商务SportsStore(十一) 我们的项目已经进入了非常好的良性循环,项目中涵盖了多数现在的主流开源框架的使用.就Ninject而言,我们的运用是非常的成功,没有任何一点多余 ...

  4. 对dump脱壳的一点思考

    对dump脱壳的一点思考 偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能 ...

  5. html5基础的常用的技巧

    html5基础的常用的技巧 1. 新的Doctype声明 XHTML的声明太长了,我相信很少会有前端开发人员能手写出这个Doctype声明. <!DOCTYPE html PUBLIC &quo ...

  6. 如何使用开源库,吐在VS2013发布之前,顺便介绍下V2013的新特性"Bootstrap"

    如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap" 刚看到Visual Studio 2013 Preview - ASP.NET, M ...

  7. 安卓开发16:Spinner 下拉列表控件

    Spinner 下拉列表控件 创建一个activity_main.xml文件: <RelativeLayout xmlns:android="http://schemas.androi ...

  8. 【Servlet3.0新特性】第03节_文件上传

    这是一个Web Project 首先是web.xml <?xml version="1.0" encoding="UTF-8"?> <web- ...

  9. Android的状态栏通知(Notification)

    通知用于在状态栏显示消息,消息到来时以图标方式表示,如下: 如果需要查看消息,可以拖动状态栏到屏幕下方即可查看消息. 1.Layout布局文件: <RelativeLayout xmlns:an ...

  10. js动画(二)

    嗯,今天好冷,特别冷,我的手指,都冻的打不了字了.今天一件特别的傻的事就是,在 for(var i;i<obj.length;i++){} 找了半天没有注意到 var i 没有赋值.够150 了 ...