c# 参数通过 class 字段传入 ref

c# parameter passing in ref with class field

我想交换 ConvexHull class 中的场,就像交换(点[0],点[1])。

我该怎么办?

public class ConvexHull
{
    List<Point> points;

    public void run ()
    {
        Point.swap ( ref points[ 0 ], ref points[ 1 ] );  //Error!!
    }
}

public class Point
{
    private double x, y;

    Point () { x = y = 0; }
    public static void swap(ref Point a, ref Point b) {
        Point c = a;
        a = b;
        b = c;
    }
}

当您索引 List<T> 的元素时,您实际上是在访问 this 索引器,它是一种 属性(即具有 getter 和 setter 方法)。您只能将 变量 作为 refout 传递,而不能传递属性。

在你的场景中,也许你想要更像这样的东西:

public class ConvexHull
{
    List<Point> points;

    public void run ()
    {
        swap(0, 1);  //No error!!
    }

    private void swap(int i, int j)
    {
        Point point = points[i];

        points[i] = points[j];
        points[j] = point;
    }
}

更通用的解决方案可能如下所示:

public class ConvexHull
{
    List<Point> points;

    public void run ()
    {
        points.SwapElements(0, 1);
    }
}

static class Extensions
{
    public static void SwapElements<T>(this List<T> list, int index1, int index2)
    {
        T t = list[index1];

        list[index1] = list[index2];
        list[index2] = t;
    }
}

无论哪种情况,正确的方法是为实际交换值的代码提供访问 List<T> 对象本身的权限,以便它可以访问索引器 属性 来完成交换.

几乎所有这些都扔掉了。您不能通过 ref 传递属性或列出对象。我注意到最初没有填充这些点。填充你的点列表,然后在你的 ConvexHull class 中调用一个函数到 SwapPoints(int point1idx, int point2idx) 并在那里编写代码来进行交换。

在点 class 上,公开 X 和 Y,并从那里删除交换例程,因为它永远不会工作。