【问题标题】:Setting a member variable to an object outside the class将成员变量设置为类外的对象
【发布时间】:2012-04-23 12:14:28
【问题描述】:

我想跟踪我的类中在范围之外创建的变量。在 C++ 中,我只需像这样传递一个指针。

class Camera
{
    Player* player;
    Position pos;

    void setFollow(Player* pl) { pl = player; }
    void update() { pos = pl->getPos(); }
}

int Main()
{
    Camera* camera = new Camera();

    Player* player = new Player();

    camera->setFollow(player);
}

在 C# 中,我尝试通过引用传递,但它似乎不起作用。

public class Game1 : Microsoft.Xna.Framework.Game
{
    Camera cam = new Camera();
    Player player = new Player();

    cam.setFollow(ref player);  // <-- by reference
}

这只是我实际代码的缩短版本。

感谢您的帮助。

编辑:感谢大家提供的信息。

【问题讨论】:

  • 那只会按值传递,不是吗?所以当播放器更新时,相机不会更新。
  • 阅读答案有很多解释
  • “没用”不是很有帮助。你期望它做什么,它做了什么?此外,发布 Camera 的 C# 版本及其 setFollow 方法可能会有所帮助。

标签: c# variables reference parameters


【解决方案1】:

在 C# 中,对象(类)变量是隐式指针。因此,如果您的类Camera 有一个p 类型为Player 的字段,那么在您的代码中设置cam.p = player 将使两个引用都指向同一个实例。通常不需要使用ref,除非您通过引用传递值类型(intfloatstructs 等)。

【讨论】:

    【解决方案2】:

    这里不需要使用 ref 关键字,因为在 C# 中对象总是通过引用传递。 C# 中的 ref 关键字通常更像是在 C/C++ 中使用的指针指针 (**)

    【讨论】:

      【解决方案3】:

      Player 本身是一个引用类型,为什么要使用 ref. 您可以在此处阅读有关 ref 的更多信息 http://msdn.microsoft.com/en-us/library/14akc2c7.aspx

      【讨论】:

        【解决方案4】:

        类总是通过引用传递,所以你不需要你试图做的 ref 位

        简单

        cam.setFollow(player);
        

        【讨论】:

          【解决方案5】:

          ref C# 中的关键字有一个非常糟糕的名字。这并不意味着您通过引用传递!它应该被命名为alias,因为这是描述ref语义的好词。

          // here I assign a reference(another bad name :) )
          // you can also call it Garbage Collector Handler 
          // of type Player with a new object
          Player player = new Player(); 
          // ref means that player is the same thing that parameter pl of setFollow
          cam.setFollow(ref player); 
          

          More details

          【讨论】:

            猜你喜欢
            • 2013-12-09
            • 2017-05-28
            • 1970-01-01
            • 2012-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多