找回密码
 注册帐号

扫一扫,访问微社区

脚本 c#求解惑

8
回复
337
查看
打印 上一主题 下一主题
[ 复制链接 ]
5熟悉之中
780/1000
排名
4368
昨日变化

3

主题

141

帖子

780

积分

Rank: 5Rank: 5

UID
48059
好友
0
蛮牛币
1128
威望
0
注册时间
2014-10-9
在线时间
296 小时
最后登录
2019-6-6
5蛮牛币
同样是引用类型 为什么结果是这个 求一下原理 刚刚学 不太懂

QQ截图20190602143447.png (34.81 KB, 下载次数: 21)

QQ截图20190602143447.png
回复

使用道具 举报

5熟悉之中
780/1000
排名
4368
昨日变化

3

主题

141

帖子

780

积分

Rank: 5Rank: 5

UID
48059
好友
0
蛮牛币
1128
威望
0
注册时间
2014-10-9
在线时间
296 小时
最后登录
2019-6-6
沙发
楼主 2019-6-2 14:37:41 只看该作者
同样是引用类型 一个改变了 一个没改变。。。 求解惑
回复

使用道具 举报

6蛮牛粉丝
1418/1500
排名
3109
昨日变化

5

主题

391

帖子

1418

积分

Rank: 6Rank: 6Rank: 6

UID
234410
好友
4
蛮牛币
1770
威望
0
注册时间
2017-7-26
在线时间
532 小时
最后登录
2019-6-20
板凳
2019-6-3 09:25:05 只看该作者
第一个没变 第二个变了
因为 string 虽然是引用类型 但是赋值的时候是将字符串赋值一份返回
有一段网上的摘抄:“这是一个值类型的赋值,但string是一个引用类型。String被分配在堆上,而不是栈上。因此,当把一个字符串变量赋给另一个字符串时,会得到对内存中同一个字符串的两个引用。但是,string与引用类型在常见的操作上有一些区别。例如字符串是不可改变的。修改其中一个字符串,就会创建一个全新的string对象,而另一个字符串不会发生任何变化。”
所以 你这里的函数放入一个 string 变量 a 时 参数获取的是  string 的一个副本 改变了等于没改
而放入 string[] 就不一样了 这是个数组 可以看做是一个引用 只要你更改数组中的值 就相当于更改真实的变量 (顺便说一下 一分极速PK10你更改这个数组的地址 如:string a[] 是参数 然后
a = new string[]{} 这样是不好使的 因为这里的数组引用也是复制的引用 所以改了复制的引用 是不好使的)
回复

使用道具 举报

7日久生情
2601/5000
排名
848
昨日变化

14

主题

184

帖子

2601

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
157377
好友
4
蛮牛币
5676
威望
0
注册时间
2016-7-19
在线时间
1225 小时
最后登录
2019-6-20
地板
2019-6-3 10:59:30 只看该作者
String类有很多特别的地方,其中之一就是它是“不会改变的”(immutable)
回复

使用道具 举报

4四处流浪
401/500
排名
8154
昨日变化

1

主题

77

帖子

401

积分

Rank: 4

UID
77872
好友
0
蛮牛币
145
威望
0
注册时间
2015-6-20
在线时间
173 小时
最后登录
2019-6-18
5#
2019-6-3 12:56:17 只看该作者
值类型与引用类型的区别看一下就会有很好的理解了。
回复

使用道具 举报

5熟悉之中
501/1000
排名
9200
昨日变化

2

主题

60

帖子

501

积分

Rank: 5Rank: 5

UID
119545
好友
1
蛮牛币
396
威望
0
注册时间
2015-8-24
在线时间
313 小时
最后登录
2019-6-20
6#
2019-6-3 13:53:20 只看该作者
本帖最后由 wx_y9TaVM8v 于 2019-6-3 13:56 编辑

你可以查看一下ref out 关键字,可能会了解更清楚点, string a="1";  void(string a){ a="2"; }   那么参数一分极速PK10传入void(a +"2222");  这样呢。你考虑过这种情况吗,一分极速PK10明白了应该就差不多理解了,值引用关系
回复

使用道具 举报

0

主题

2

帖子

4

积分

Rank: 1

UID
323914
好友
0
蛮牛币
15
威望
0
注册时间
2019-6-4
在线时间
2 小时
最后登录
2019-6-6
7#
2019-6-4 14:55:09 只看该作者
简单来说:Staa(string b)是数值输入,即只要输入变量的值,地址时不一样的(输入后就是不同的变量了)。Staa(string[] b)是数组输入,它是按地址传输的,即在同一地址上进行数值改变,所以这个量也是变的。
回复

使用道具 举报

7日久生情
1992/5000
排名
961
昨日变化

4

主题

123

帖子

1992

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
102526
好友
0
蛮牛币
2845
威望
0
注册时间
2015-5-23
在线时间
771 小时
最后登录
2019-6-20
8#
2019-6-5 16:50:27 只看该作者

值类型与引用类型的变量作为参数传递都是将变量复制一份,然后传入方法体去执行。由于引用类型在堆上存放的是地址,复制的也是地址,相同地址指向的是同一内存空间,通过复制的地址改变等同于通过原地址改变,原地址指向的内存空间就改变了。但一分极速PK10复制后直接改变复制后变量的值,即其存放的地址,那么其后的任何操作都与原地址指向的内存空间无关,操作的是新地址指向的内存空间,所以在函数中一分极速PK10直接对传递的引用new的话,就必须在参数前加out。函数中 b = "1" 相当于 new 了,b存放的地址改变了,但原有的a存放的地址仍不变,所以a的值是不变的。
回复

使用道具 举报

5熟悉之中
876/1000
排名
3457
昨日变化

1

主题

195

帖子

876

积分

Rank: 5Rank: 5

UID
238064
好友
5
蛮牛币
20958
威望
0
注册时间
2017-9-7
在线时间
248 小时
最后登录
2019-6-20
9#
2019-6-12 10:00:05 只看该作者
因为你的aa数组声明出来赋值得时候,是第二个元素为a(数组第一个元素下标是从0开始得,你声明得时候是赋值得下标1,也就是第二个元素),然后你调用了一个方法,方法v里面是给第一个元素赋值为b。你最后打印得时候,打印得也是aa数组里面第一个元素得值,所以打印出来就是b
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则