C# c中的值引用更改#

C# c中的值引用更改#,c#,unity3d,C#,Unity3d,我有RangeClass和MyClass,它有RangeClass属性 public class RangeClass{ public int min; public int max; } 及 我想创建几个MyClass实例,MyClass.range是RangeClass(比如defaultRange)的引用。因此,每当我更改defaultRange时,它都会反映到myclass的所有range属性。我想了解如何在不查看每个实例的情况下执行此操作。我发现了这一点,但我不

我有RangeClass和MyClass,它有RangeClass属性

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

我想创建几个MyClass实例,MyClass.range是RangeClass(比如defaultRange)的引用。因此,每当我更改defaultRange时,它都会反映到myclass的所有range属性。我想了解如何在不查看每个实例的情况下执行此操作。我发现了这一点,但我不确定如何修改已接受的答案以实现我的目标

更新:下面的代码显示了用作MyClass类属性的两个range类,并显示了如何访问range方法。 公共类范围{ 公众持股; 公共浮动最大值; 公共范围(浮动a、浮动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);
    }
}
public bool Contains(浮点a){

如果(a>=min&&a使范围成为MyClass的静态属性,以便所有MyClass对象共享相同的范围。

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

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-您可以在
MyClass
构造函数中添加默认
RangeClass
实例的创建:

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

     RangeClass range;

     public void setRange(Range r)
     {
     }
 }
如果您想反映更改,只需在
RangeClass
中创建一个
public static
属性或
public static readonly
字段,该字段将对应于默认范围:

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

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

静态修改器不是您想要的吗?

例如:伪代码

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());
}

将range属性从instance更改为Static。这将允许使用默认值或修改状态从任何MyClass实例查看RangeClass

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

     }
 }

我还有一个问题。我如何访问RangeClass的方法。我更新了我的帖子以反映我当前的代码。你的代码与你的文本相矛盾。你为每个
MyClass
实例设置了不同的范围,你想在默认范围内检查一些值吗?是的,很抱歉造成混淆。因此,基本上,我在这里试图做的是设置一个值属性为range1的MyClass实例和另一组属性为range2的MyClass。如果我更改range1,所有引用它的MyClass实例都将反映该值。我通过在MyClass上公开一个方法来访问RangeMethod,从而成功访问了RangeMethod。:)你有这种开箱即用的行为。这就是.NET中引用类型的行为。我看不出有任何必要在这里使用
static
。你所需要的只是缓存
range1
range2
引用。我无法使用你的方法访问主方法中的ClassA成员。这给了我ClassB中的一个错误,我认为你是错的实现中缺少变量名。
public class MyClass{
     public static RangeClass range;
     public void setRange(Range r){

     }
 }