C# c中的值引用更改#
我有RangeClass和MyClass,它有RangeClass属性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属性。我想了解如何在不查看每个实例的情况下执行此操作。我发现了这一点,但我不
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){
}
}