在c#中按值引用更改

时间:2013-05-30 05:17:32

标签: c# unity3d

我有RangeClass和MyClass,它有RangeClass属性。

 public class RangeClass{
    public int min;
    public int max;
 } 

 public class MyClass{
     RangeClass range;
     public void setRange(Range r){

     }
 }

我想创建几个MyClass实例,myClass.range是RangeClass的引用(比如defaultRange)。所以每当我更改defaultRange时,它都会反映到myclass的所有range属性。我想知道如何在不经历每个实例的情况下完成此操作。我找到了post,但我不确定如何修改已接受的答案以实现我的目标。

UPDATE:下面的代码显示了两个用作MyClass类属性的范围类,并显示了如何访问范围方法。     公共类Range {         公共浮动最小;         公共浮动最大;         public Range(float a,float b){             min = a;             max = b;         }

    public bool Contains(float a){
        if (a >= min && a<=max){
            return true;
        }
        return false;
    }
}

public class MyClass{
    public static Range range;
    public void SetRange(Range r){
        range = r;
    }
    public bool Cointains(float num){
        return range.Contains(num);
    }
}

public class OtherClass{
    MyClass instance1;
    MyClass instance2;

    public OtherClass(){
        Range range1 = new Range(1,5); //creates instance of Range
        Range range2 = new Range(6,10); //creates another instance of Range

        instance1 = new MyClass();
        instance1.SetRange(range1);

        instance2 = new MyClass();
        instance2.SetRange(range2);

        bool isInSetA = instance1.Contains(4);
        bool isInSetB = instance2.Contains(4);
    }
}

4 个答案:

答案 0 :(得分:1)

使范围成为MyClass的静态属性,以便所有MyClass对象共享相同的范围。

答案 1 :(得分:0)

这是引用类型的正常行为,因为您在RangeClass的多个实例之间共享单个MyClass实例。如果您不想反映更改,请:

1 - 您可以使RangeClass不可变,因此,您无法更改其实例:

public class RangeClass
{    
    public int Min { get; private set; }
    public int Max { get; private set; }

    public RangeClass(int min, int max)
    {
        Min = min;
        Max = max;
    }
}

2 - 您可以在RangeClass构造函数中添加默认MyClass个实例的创建:

public class MyClass
{
     public MyClass()
     {
         range = new RangeClass { min = 0, max = 100 };
     }

     RangeClass range;

     public void setRange(Range r)
     {
     }
 }

如果执行想要反映更改,只需在public static中创建一个public static readonly属性或RangeClass字段,该字段对应于默认范围:< / p>

public class RangeClass{
    public int min;
    public int max;

    public static readonly RangeClass DefaultRange = new RangeClass { min = 0, max = 100 };
 } 

答案 2 :(得分:0)

不是你想要的静态修饰符吗? http://msdn.microsoft.com/en-us/library/98f28cdx.aspx

例如:伪代码

Class ClassA
{
    public int IntA = 0;
    public int IntB = 5;
}

class ClassB
{
    public static ClassA;
}

main
{
    ClassB MyClassB;
    ClassB MySecondClassB;

    MySecndClassB.ClassA.IntA = 1; //The vale of 1 will be overwritten by
    MyClassB.ClassA.IntA = 5; //the value of 5 here, for all instances of ClassB.
    System.Diagnostics.Print(MySecndClassB.ClassA.IntA.ToString() + " - " + MyClassB.ClassA.IntA.ToString());
}

答案 3 :(得分:0)

将范围属性从实例更改为静态。这将允许从具有默认值或修改状态的任何MyClass实例查看RangeClass。

public class MyClass{
     public static RangeClass range;
     public void setRange(Range r){

     }
 }