2013年7月21日星期日

结构变量作为方法的参数调用,在方法内部使用的“坑”你遇到过吗? - 深蓝医生

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
结构变量作为方法的参数调用,在方法内部使用的"坑"你遇到过吗? - 深蓝医生  阅读原文»

很久没有写博了,今天一个同学在问结构变量的问题,问结构到底是传递值还是传递引用。查过MSDN的都知道,结构默认是传递值的,因此在方法内部,结构的值会被复制一份。但是对于结构数组,如果值还是要被复制一份,这个内存占用是不是很多了呢?
一般来说,数组参数传递的是引用,那么数组的元素呢?它是被复制的还是被引用的?如果结构数组的元素象结构变量那样也是复制的,那么对于方法调用的内存占用问题,就得好好考虑下了。

MSDN看了半天,也讨论了半天,感觉还是没有动手实验最有说服力,我们先定义一个结构体:

struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
this.X = x;
this.Y = y;
}
}

定义2个方法,分别以传值和传引用的方式来调用结构变量:

static void TestStruc(Point p)
{
p.X
++;
p.Y
++;

}

static void TestStruc2(ref Point p)
{
p.X
++;
p.Y
++;

}

调用代码:

Point p = new Point(1, 2);
TestStruc(p);
Console.WriteLine(
"call by value Point X={0},Y={1}", p.X, p.Y);

TestStruc2(
ref p);
Console.WriteLine(
"call by ref Point X={0},Y={1}", p.X, p.Y);

调用结果符合预期,以引用传递的结构变量,它的值被改变了:

Struct Pont(X,Y) Test:
call by value Point X
=1,Y=2
call by ref Point X
=2,Y=3

下面,试试结构数组,看有何不同:

static void TestStrucArray2(ref Point[] arr)
{
Point p
= arr[0];
p.X
++;
p.Y
++;

}

调用代码:

Point[] arr = new Point[2];
arr[
0] = new Point(1, 2);
arr[
1] = new Point(3, 4);

TestStrucArray(arr);
Console.WriteLine(
"call by value Point[0]: X={0},Y={1}", arr[0].X, arr[0].Y);

结果:

call by value Point[0]: X=1,Y=2

方法内部对结果数组元素的改变无效,难道结构数组被复制了?

惊出一身冷汗!

改成引用参数的方式来试试,避免复制结构数组:

static void TestStrucArray2(ref Point[] arr)
{
Point p
= arr[0];
p.X
++;
p.Y
++;

}

结果:

call by value Point[0]: X=1,Y=2
call by ref Point
[0]: X=1,Y=2

引用方式数组还是被复制了?看来哪里有问题阿。

去掉用一个结构变量来引用结构数组的成员,直接操作结构数组的元素,来看看调用结果:

static void TestStrucArray3( Point[] arr)
{
//Point p = arr[0];
arr[0].X++;
arr[
0].Y++;

}

static void TestStrucArray4(ref Point[] arr)
{
arr[
0].X++;
arr[
0].Y++;

}

调用代码:

TestStrucArray4(ref arr);
Console.WriteLine(
"call by ref Point[0] not use var : X={0},Y={1}", arr[0].X, arr[0].Y);
arr[
0].X = 1; arr[0].Y = 2;

TestStrucArray3( arr);
Console.WriteLine(
"call by var Point[0] not use var : X={0},Y={1}", arr[0].X, arr[0].Y);

结果:

call by ref Point[0] not use var : X=2,Y=3
call by var Point
[0] not use var : X=2,Y=3

直接操作结构数组的元素,元素的值被改变了,证明结构数组没有复制数组元素的值,依然是对数组的引用,上面的问题虚惊一场。

我们对比下前后不同的代码,发现TestStrucArray2 仅仅多了一行代码:

static void TestStrucArray2(ref Point[] arr)
{
Point p
= arr[0];
p.XTFS新建项目集合 - 虎虎小猫咪  阅读原文»

最近我们的项目因为键冲突导致sharepoint和部分TFS客户端无法使用,由于对这这种问题尚且不了解,暂时无法修复问题,所以重新创建了项目集合,步骤简单说明一下:

1、远程连接到服务器

2、开始-所有程序-Team Foundation Server2010-Team Foundation管理控制台

3、在左边选择应用层-团队项目集合,点击右边的“创建集合”

4、在打开的页面里输入团队项目集合名称,点击“下一步”,直至结束,中间不许做任何修改。

5、打开TFS客户端,进入原项目集合,右击项目集合名称-团队项目集合设置-过程模块管理器(R)...,选择MSF CMMI Process Improvement v5.0,点击“下载”按钮

6、打开TFS客户端,进入新建的项目集合,右击项目集合名称-团队项目集合设置-过程模块管理器(R)...,点击“上载”按钮,选择刚下载的模版文件夹即可。


本文链接:http://www.cnblogs.com/huhu-xiaomaomi/p/3204988.html,转载请注明。

阅读更多内容

没有评论:

发表评论