首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

引用类型的变量有时需要加ref或者out才能返回改变的状态吗

2013-09-28 
引用类型的变量有时候需要加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;
}

热点排行