c#参数在类字段中传入ref

时间:2015-04-16 00:45:17

标签: c# class parameters field ref

我想交换ConvexHull类中的字段,就像swap(points [0],points [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;
    }
}

2 个答案:

答案 0 :(得分:1)

当您索引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>对象本身的访问权限,以便它可以访问索引器属性来完成交换。

答案 1 :(得分:0)

扔掉了所有这些。您不能通过ref传递属性或列表对象。我注意到最初没有任何东西填充这些点。填充您的Points列表,然后将您的ConvexHull类中的函数调用到SwapPoints(int point1idx,int point2idx)并在那里编写代码以进行交换。

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