ref用法,不能传递一个数组吗? 对程序有点疑问
c#吧
全部回复
仅看楼主
level 8
a1364533187 楼主
namespace lambda_委托
{
class Program
{
static List<int> Max(ref List<int> nums) //求大于3的数
{
var list = new List<int>();
int max = 3;
Console.WriteLine("大于3的list表的数");
foreach (var num in nums)
{
if (num > max)
{
list.Add(num);
Console.WriteLine(num);
}
}
return list;
}
static void Main(string[] args)
{
var nums = new List<int>() { 1, 2, 3, 4, 5, 7 };
Max(ref nums) ;
Console.WriteLine("应用引用ref后的list表的数");
foreach (var num in nums)
{
Console.WriteLine(num);
}
}
}
}
现象如下
2014年05月29日 04点05分 1
level 11
数组不用ref...
2014年05月29日 04点05分 2
level 13
你这段代码里 ref 根本没有任何意义。
2014年05月29日 05点05分 3
对,ref没有任何作用,输出来的数还是刚开始初始化的数
2014年05月29日 06点05分
回复 a1364533187 :你先确定你知道ref 是干什么用的。 你在这段代码里又希望这个ref给你带来什么效果? 你这样写的ref,本事就没有任何意义。在方法里,根本就没有改变nums的值,那ref 写着干啥
2014年05月29日 06点05分
ref不是把值引用传进去吗,这样应该会改变出来的数啊
2014年05月29日 06点05分
回复 a1364533187 :ref 是把值类型 当作引用类型来使用,举个例子,在方法外 声明了变量inta = 1; 你把a 传入到方法里,在方法中写 a=2 ,方法调用结束后,输出a 的值是1。 这个叫值类型引用。 如果你方法传入a的时候加上ref,就变成引用类型 输出a 就是2 。我在下面写个例子给你。
2014年05月29日 06点05分
level 12
对于引用类型,用ref的唯一情况是改变这个引用类型指向的引用
2014年05月29日 05点05分 4
ref没有任何作用,输出来的数还是刚开始初始化的数,这是为啥
2014年05月29日 06点05分
回复 a1364533187 :还为啥!!!!这代码是你自己写的吗,先不谈用不用ref,你在Max里面有修改传进去的list吗?你return一个值,然后再Main里有接收吗?
2014年05月29日 10点05分
回复 此ID已被我抢注 :谢谢哈,问题已解决
2014年05月29日 12点05分
level 13
int a=1;
getValue(a);
Console.WriteLine(a); //输出1
getRefValue(a);
Console.WriteLine(a); //输出2
public void getValue(int num)
{ num = 2; }
public void getRefValue(ref int num)
{num=2;} //在这个方法里,对于ref 声明的 num 变量,已经成为引用类型,也就是改变的是内存地址上的值,也就是a的内存地址的值,所以a的值被改变为2。
在说你写的那个代码,方法声明了ref nums 但是在你的方法里 只对nums 进行了读取,又没有改变nums 的值。那nums 用不用ref又有什么意义。
2014年05月29日 06点05分 6
我把nums传递到max()中,不应该会改变nums中的值吗,改变完后,在打印出来
2014年05月29日 06点05分
回复 a1364533187 :请问你哪行代码改变了nums的值? 你能再写给我看看吗?
2014年05月29日 06点05分
在c语言中传递数组首地址就能改变数组,我觉得ref就相当于传地址
2014年05月29日 06点05分
回复 a1364533187 :ref 就是传地址,你把一个地址传到方法里,却只对他进行了foreach读取, 难道foreach 一下就改变了他的值?
2014年05月29日 06点05分
level 8
a1364533187 楼主
改成nums=Max(nums) 就好了,我回寝室调试了一下,并且加不加ref 都一样,数组不用加ref
2014年05月29日 08点05分 7
[黑线]所以我早就说了,你的ref 没有任何意义。
2014年05月29日 09点05分
level 13
好吧,现在给你说说ref的用途, 还是说你那个函数,我把需求稍微改一下,用一个函数判断集合中是否含有大于3的整数,并返回大于3的整数。
这样的话,问题就出现了,既要返回是否包含(bool),又要返回大于3的整数集合(List<int>),一个函数怎么可能有两个返回类型。这就要用到ref或者out 两个关键字(这两个功能类似)
static bool Max(ref List<int> nums) //求大于3的数
{
var list = new List<int>();
int max = 3;
Console.WriteLine("大于3的list表的数");
for(i=nums.Count-1;i>=0;i--)
{
if(nums[i]<=3)
{
nums.Remove(nums[i]); // 移除 nums 中小于3的数字
}
}
return nums.Count>0 //返回是否有大于3的数字。
}
var nums = new List<int>() { 1, 2, 3, 4, 5, 7 };
bool hasNum = Max(ref nums) ;
调用该方法后,就能返回一个bool值,并且经过函数的处理,nums中只保留大于3的数。
2014年05月29日 12点05分 8
1