使变量指向另一个变量

时间:2018-10-09 06:33:43

标签: c# pointers unity3d

我需要有一个实例,该实例是另一个实例的指针。基本上,我将在同一类中创建两个分别称为 A B 的实例。每当我更改A实例的属性时,B实例的属性都会被更改。基本上,属性在存储器上将具有相同的地址。

我只想用不同的变量名到达同一对象。每当其中一个将被编辑时,另一个也应被编辑。

  

如何在Unity中使用c#做到这一点?

3 个答案:

答案 0 :(得分:3)

  

我将有2个具有相同类型的实例。每当其中一个会   编辑,另一个也应该编辑。

     

我只想用不同的变量名到达同一对象。

您可以使用属性来伪造指向另一个变量的指针。使用getset访问器很容易做到这一点。

比方说,主变量名为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";
}

Example 1

请注意,如果要修改传递给方法的变量指向的类实例,则需要使用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";
}

Example 2

还有另一个关键字out,它允许通过传入要填充的变量来实例化调用方范围内的对象的方法:

void Test()
{
    MyClass a;
    Instantiate(out a);
    Console.WriteLine(a.Name); // "John"
}

void Instantiate(out MyClass myClass)
{
    myClass = new MyClass();
    myClass.Name = "John";
}

Example 3