结构变量作为方法的参数调用,在方法内部使用的“坑”你遇到过吗?
时间:2022-04-29
本文章向大家介绍结构变量作为方法的参数调用,在方法内部使用的“坑”你遇到过吗?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
很久没有写博了,今天一个同学在问结构变量的问题,问结构到底是传递值还是传递引用。查过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.X++;
p.Y++;
}
这说明,定义一个结构变量,让另外一个结构变量的值赋值给它,等于是复制这个结构变量的值。
往往有时候,我们为了敲代码方便,少写几个字,便定义一个临时变量去引用原来的变量,而这种行为,对于操作结构变量,无疑是一个最大的坑,这个坑,你遇到过吗?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Docker日常使用方式
- 使用Python爬取动态网页-豆瓣电影(JSON)
- Linux安装配置PHPmyadmin
- Angular Service依赖注入的一个具体例子
- php学习day1
- 在Angular里使用rxjs的异步API - Observable
- 自动化监控Oracle表空间并发送报警
- Angular里的消息(Message)显示
- Angular应用内路由(In App Route)的最佳实践
- Angular应用的路由指令RouterLink
- ctfhub-信息泄泄露_备份文件下载
- Angular In-memory Web API使用介绍
- 攻防世界-php_rce
- 无法添加某个relationship给SAP CRM Product category的一个可能原因
- 记一次DataGuard SWITCHOVER_STATUS 状态为RESOLVABLE GAP的处理