C# XNA 在构造函数中通过引用类传递

标签 c# xna pass-by-reference

我正在 XNA 中制作矢量图形游戏。我设计了一个 Line 类来围绕中心点旋转以帮助绘制特定形状。为了保持单一的真实性,有没有办法将对形状中心的引用传递给我创建的所有线条,以便更新中心的位置也会更新线条的位置?我认为这样的事情会起作用:

class Line
{
    private Vector2 start;
    private double length;
    private double angle;

    public Line(ref Vector2 start, double length, double angle){
        this.start = start;
        this.length = length;
        this.angle = angle;
    }
}




class Obj
{
    private Vector2 center;
    private Line[] lines;
    public Obj(){
        center = new Vector2(50,50);
        lines = new Lines[5];
        for (int i = 0; i < 5; i++){
            lines[i] = new Line(ref center,30, (i/5 * 2 * Math.PI));

        }

    }
}

但是当我移动中心时线条不会更新。我做错了什么?

最佳答案

虽然 struct 是通过引用正确传递给 Line 的,但是当您在内部分配它时:

public Line(ref Vector2 start, double length, double angle){
    this.start = start;
}

您实际上是在获取 struct副本

如果您发现自己需要 struct 的引用类型语义而不是将其传递给单个方法,那么您可能需要重新考虑使用 class

您可以在类中重新实现该类型或将 Vector2 包装在类中并使用它:

class Vector2Class
{
    public Vector2 Centre;

    public Vector2Class(Vector2 inner)
    {
        Centre = inner;
    }
}

class Line
{
    private Vector2Class _centre;

    public Line(Vector2Class centre)
    {
        _centre = centre;    
    }
}

请注意,您仍在处理一个副本,但如果您共享类(class),你们将在相同副本上工作。

就个人而言,我会避免包装器并创建我自己的类来表示“中心”。这得到了广泛接受的想法的支持,即 struct 类型应该是不可变的,但您似乎需要改变值以保持表示为真。

class CentreVector<T>
{
    public <T> X { get; set; }
    public <T> Y { get; set; }
}

这只会让您共享数据,实际上不会通知中心已更改的线路。为此,您需要某种事件。

关于C# XNA 在构造函数中通过引用类传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11011768/

相关文章:

c# - Html 编码导致 Chrome 中出现新行

c# - 是否有可能对象被释放但不为 NULL

c# - ObservableList ReadOny 数据网格

c# - WP7 C#/XNA 中的可变字符串?

c - 如何在 C 中执行此程序?第 3.0 部分

c# - 自动映射器 UseDestinationValue 不起作用

c# - 将 XNA Color 对象转换为字符串

c# - 3d 平铺地形

c++ - 按值或按引用传递构造函数参数

python - 当变量引用同一个对象时,它是如何调用的,为什么python有这个特性?