引用类型的变量有时候需要加ref或者out才能返回改变的状态吗using Systemusing System.Collections.Gener
引用类型的变量有时候需要加ref或者out才能返回改变的状态吗
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Reftest
{
class Program
{
static ClassA mClassA;
static void Main(string[] args)
{
ClassA.FillData(1, mClassA);
foreach(int i in mClassA.numList)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
}
public class ClassA
{
public static ClassA classa = null;
public List<int> numList = new List<int>();
public static ClassA InitClassA()
{
if (classa == null)
{
classa = new ClassA();
}
return classa;
}
public static void FillData(int a, ClassA wclassa)
{
wclassa = InitClassA();
classa.numList.Add(a);
}
}
}
上面的代码会在foreach那行报mClassA为null错误,可是我明明在FillData方法里对mClassA做了初始化呀,怎么会为null,实在想不通,我这样做的目的是不使用FillData方法时不对mClassA初始化,使用此方法时才对唯一的mClassA实例进行初始化并进行操作
当我在FillData(int a, ClassA wclassa) 的参数wclassa前加ref时会出现正确结果,不是说类对象是引用类型的,不需要加ref吗,这是为什么呢?
下面是程序运行时图片
本来想传截好的图片的,可是网速不给力,老传不上来。
[解决办法]类对象是引用类型,但是你重新赋值,就不是引用的原来的对象了。
[解决办法]只是改变状态不需要加ref或out
你这里出错原因是你改变的不只是“状态”,而是引用本身被改了,所以要加out才行
[解决办法]public static void FillData(int a, ClassA wclassa)
改成
public static void FillData(int a, ref ClassA wclassa)
或者
public static void FillData(int a, out ClassA wclassa)
都行
[解决办法]重新引用了才需要加,比如new了一个新对象
[解决办法]此引用非彼引用
给引用类型加上ref,相当于引用的引用,你可以将它指向另一个对象:
void Main()
{
User u1 = new User("a");
User u2 = new User("b");
foo1(ref u1, ref u2);
//此时u1指向第二个对象,u2指向第一个对象
foo2(u1, u2);
//此时,u1和u2指向各自原来的对象,但是Name被交换
}
void foo1(ref User u1, ref User u2)
{
User u = u2;
u2 = u1;
u1 = u;
}
void foo2(User u1, User u2)
{
string s = u2.Name;
u2.Name = u1.Name;
u1.Name = s;
}