我需要有一个实例,该实例是另一个实例的指针。基本上,我将在同一类中创建两个分别称为 A 和 B 的实例。每当我更改A实例的属性时,B实例的属性都会被更改。基本上,属性在存储器上将具有相同的地址。
我只想用不同的变量名到达同一对象。每当其中一个将被编辑时,另一个也应被编辑。
如何在Unity中使用c#做到这一点?
答案 0 :(得分:3)
我将有2个具有相同类型的实例。每当其中一个会 编辑,另一个也应该编辑。
我只想用不同的变量名到达同一对象。
您可以使用属性来伪造指向另一个变量的指针。使用get
和set
访问器很容易做到这一点。
比方说,主变量名为score:
public int score;
您可以使用其他两个变量指向分数变量:
public int scoreWithDifferentName1
{
get { return score; }
set { score = value; }
}
和
public int scoreWithDifferentName2
{
get { return score; }
set { score = value; }
}
现在,您可以更改分数变量或使用上面的两个属性变量进行访问:
scoreWithDifferentName1 = 0;
Debug.Log(scoreWithDifferentName1);
或
scoreWithDifferentName2 = 3;
Debug.Log(scoreWithDifferentName2);
另一种选择是使用IntPtr
,但这不是必需的。 C#属性功能足以满足您的需求。这适用于值和引用类型。
答案 1 :(得分:2)
这似乎是一个设计问题,关于您希望类的外观以及它们的职责是什么。我不确定您所讨论的类的目的是什么,但是这里明显的解决方案是使用带有static修饰符的属性。 在您的类中添加静态属性将确保该类在所有实例中都具有相同的值,即:
public class ClassX
{
public static string staticVar = "This is a static string";
private string var1;
}
答案 2 :(得分:1)
听起来您正在描述引用类型在C#中的正常工作方式:
public class MyClass
{
public string Name {get;set;}
}
void Test()
{
var a = new MyClass();
a.Name = "Test";
var b = a;
Console.WriteLine(a.Name); // "Test"
Console.WriteLine(b.Name); // "Test"
b.Name = "MossTeMuerA";
Console.WriteLine(a.Name); // "MossTeMuerA"
Console.WriteLine(b.Name); // "MossTeMuerA"
Mutate(a);
Console.WriteLine(a.Name); // "John"
Console.WriteLine(b.Name); // "John"
}
void Mutate(MyClass myClass)
{
myClass.Name = "John";
}
请注意,如果要修改传递给方法的变量指向的类实例,则需要使用ref
关键字:
void Test()
{
var a = new MyClass();
a.Name = "Test";
var b = a;
Console.WriteLine(a.Name); // "Test"
Console.WriteLine(b.Name); // "Test"
Mutate(ref a);
Console.WriteLine(a.Name); // "John"
Console.WriteLine(b.Name); // "Test"
}
void Mutate(ref MyClass myClass)
{
myClass = new MyClass();
myClass.Name = "John";
}
还有另一个关键字out
,它允许通过传入要填充的变量来实例化调用方范围内的对象的方法:
void Test()
{
MyClass a;
Instantiate(out a);
Console.WriteLine(a.Name); // "John"
}
void Instantiate(out MyClass myClass)
{
myClass = new MyClass();
myClass.Name = "John";
}