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 方法)。您只能将 变量 作为 ref
或 out
传递,而不能传递属性。
在你的场景中,也许你想要更像这样的东西:
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,并从那里删除交换例程,因为它永远不会工作。
我想交换 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 方法)。您只能将 变量 作为 ref
或 out
传递,而不能传递属性。
在你的场景中,也许你想要更像这样的东西:
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,并从那里删除交换例程,因为它永远不会工作。