今天查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. 3 MySQL SQL基础

    目录 1. SQL概述2. 数据库操作3. 表操作4. 记录操作 1. SQL概述 SQL,结构化查询语言(Structured Query Language),一种数据库查询和程序设计语言,用于存取 ...

  2. [Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]

    Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...

  3. iOS学习之路十三(动态调整UITableViewCell的高度)

    大概你第一眼看来,动态调整高度是一件不容易的事情,而且打算解决它的第一个想法往往是不正确的.在这篇文章中我将展示如何使图表单元格的高度能根据里面文本内容来动态改变,同时又不必子类化UITableVie ...

  4. 【July】从头到尾彻底理解KMP

    从头到尾彻底理解KMP 作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进. 1. 引言 本KMP原文最初写于2年多前的2011 ...

  5. VS2012的安装项目只能用InstallShield Limited Edition

    [吐槽]VS2012的安装项目只能用InstallShield Limited Edition[附资源下载]   以前版本的Visual Stuido中安装项目都可以使用微软自家的Visual Stu ...

  6. asp.net MVC实现文章的“上一篇下一篇”

    由于这个东西的原理没有什么难的(只是实现的时候有少量的坑),故直接上代码以便查阅.另:本文给出的Action附送了点击量统计. public ActionResult SingleNews(int? ...

  7. Android过滤Logcat输出

    logcat和grep配合使用 1.打印特定tag的log,如打印Tag为Adm的Log        adb logcat | grep Adm        adb logcat | grep - ...

  8. 转--htaccess语法教程 apache服务器伪静态规则教程

    转自:http://blog.csdn.net/qingli518/article/details/9118361 htaccess语法教程apache服务器伪静态规则教程 注:如果你是为了找Disc ...

  9. ERROR 1130: Host xxx is not allowed to connect to this MySQL server

    在使用MySQL-Front连接mysql的时候发生的这个错误 ERROR 1130: Host xxx is not allowed to connect to this MySQL server ...

  10. Yellow

    Yellow这首歌让我知道了yellow这个单词出了黄色的意思外,还有胆怯的,懦弱的意思~~~ 它是Coldplay 的歌曲,歌词很简单,但是有着莫名的忧伤感,值得一提的是这首歌的MV,一个长镜头给出 ...