【问题标题】:Passing a property by ref通过 ref 传递属性
【发布时间】:2013-06-24 18:40:28
【问题描述】:

我有以下课程:

    public class Red
    {
        public List<Blue> theList = new List<Blue>();
    }
    public class Blue
    {
        private Red origin;

        public Blue(ref Red)
        {
            origin = Red;
        }

        public void SomeMethod()
        {
            origin.theList.Add(new Blue(ref origin));//When calling this, i get the error
        }
    }

现在它告诉我我不能将 origin 作为 ref 传递(无论出于何种原因) 但我需要每个 Blue 实例都有一个对 Red 的引用。这样我就可以拥有它的实时版本,并且每个 Blue 实例都将访问 Red 的当前版本(不是副本)

所以我需要以下工作:

    using System;
    public static class Program
    {
        public static Main(string[] Args)
        {
            Red red = new Red();
            red.Add(new Blue(ref red));
            red.Add(new Blue(ref red));
            red.[0].SomeMethod();
            Console.WriteLine(red[0].origin.Count()); //Should be 2, because red was edited after the first blue instance was created
            Console.ReadKey(true);
        }
    }

【问题讨论】:

  • 您的术语不正确。你的origin 是一个field(类级变量),而不是一个property。编译器的确切错误消息是什么(编辑还是运行时异常?)?

标签: c# properties instance ref


【解决方案1】:

你不需要通过引用传递,因为你不需要修改red的位置。

public class Red
{
    public List<Blue> theList = new List<Blue>();
}

public class Blue
{
    private Red origin;

    public Blue(Red red)
    {
        origin = red;
    }

    public void SomeMethod()
    {
        origin.theList.Add(new Blue(origin));
    }
}

由于Red 和Blue 是reference types,因此传递了它们的位置而不是它们的值。

【讨论】:

  • 好的,谢谢,我想在设置属性时,它将是该实例的副本,而不是实例(通过引用)本身,我需要这个,因为我在制作对象需要跟踪的地方他们的父对象,我不希望它创建一些对象的大量重复
  • 它是到实例位置的副本(传递引用)。 ref 关键字在需要修改实例位置时使用(很少)。
【解决方案2】:

实例上不需要ref。它是同一个对象的引用。您需要 ref 和 out 来处理整数、字符串等内容。在没有 ref 的情况下按原样传递所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多