如何从一个函数返回 2 个值
本文关键字:函数 一个 返回 个值 | 更新日期: 2023-09-27 17:55:46
我有一个计算两个位置的函数,我想同时获得它们,有没有办法获取从同一函数返回的两个值,而无需将它们转换为数组。 我认为带有 out 参数或类似的东西......TNX.这是我的代码:
public static int Location(int p_1, int p_2, int p_3, int p_4)
{
int XLocation = p_2 - p_1;
int YLocation = p_4-p_3;
return XLocation,YLocation;
}
public void Print()
{
}
有多种方法可以做到这一点:
1)用途:
public KeyValuePair<int, int> Location(int p_1, int p_2, int p_3, int p_4)
{
return new KeyValuePair<int,int>(p_2 - p_1, p_4-p_3);
}
或
static Tuple<int, int> Location(int p_1, int p_2, int p_3, int p_4)
{
return new Tuple<int, int>(p_2 - p_1, p_4-p_3);
}
2)使用自定义类,如Point
public class Point
{
public int XLocation { get; set; }
public int YLocation { get; set; }
}
public static Point Location(int p_1, int p_2, int p_3, int p_4)
{
return new Point
{
XLocation = p_2 - p_1;
YLocation = p_4 - p_3;
}
}
3)使用out
关键字:
public static int Location(int p_1, int p_2, int p_3, int p_4, out int XLocation, out int YLocation)
{
XLocation = p_2 - p_1;
YLocation = p_4 - p_3;
}
以下是这些方法的比较:多重返回值。
最快的方法(最佳性能)是:
public KeyValuePair<int, int> Location(int p_1, int p_2, int p_3, int p_4)
{
return new KeyValuePair<int,int>(p_2 - p_1, p_4-p_3);
}
使用结构或类:
public struct Coordinates
{
public readonly int x;
public readonly int y;
public Coordinates (int _x, int _y)
{
x = _x;
y = _y;
}
}
public static Coordinates Location(int p_1, int p_2, int p_3, int p_4)
{
return new Coordinates(p_2 - p_1, p_4 - p_3);
}
我觉得它比使用out
关键字更漂亮。
不能以这种方式返回 2 个值。但是您可以将变量作为输出变量传递,如下所示:
public static void Location(int p_1, int p_2, int p_3, int p_4, out int XLocation, out int YLocation)
{
XLocation = p_2 - p_1;
YLocation = p_4-p_3;
}
然后你只需要将目标变量传递给方法:
int Xlocation, YLocation;
Location(int p_1, int p_2, int p_3, int p_4, out int XLocation, out int YLocation);
它将用计算值填充它们。
从 C# 7.0 开始,你可以像这样使用元组:
(string, string) LookupName(long id) // tuple return type
{
... // retrieve first, middle and last from data storage
return (first, last); // tuple literal
}
var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item2}.");
甚至带有名称:
(string first, string middle, string last) LookupName(long id)
var names = LookupName(id);
WriteLine($"found {names.first} {names.last}.");
更多信息可以在这里找到。
运算符"return"不可能返回两个值。您可以将以下代码与"struct"一起使用:
public static Position Location(int p_1, int p_2, int p_3, int p_4)
{
Position location;
location.xLocation = p_2 - p_1;
location.yLocation =p_4-p_3;;
return location;
}
public struct Position
{
public int xLocation;
public int yLocation;
}
您可以使用
out、坐标结构或元组。
使用元组:
public Tuple<int, int> GetLocation()
{
return new Tuple<int,int>(1,2);
}
如果您使用的是 Windows 窗体,则可以使用Point
结构;
public static Point Location(Point p1, Point p2)
{
return new Point(p2.X - p1.X, p2.Y - p1.Y);
}
如果方法不是公共合同的一部分,我更喜欢使用元组:
private Tuple<int, string> Foo()
{
// ...
}
您可以使用Tuple<T1, T2>
或使用 out 参数。
使用数组列表
public ArrayList Location(int p_1, int p_2, int p_3, int p_4)
{
ArrayList ar = new ArrayList();
ar.AddRange(new string[] { "", "" });
int XLocation = p_2 - p_1;
int YLocation = p_4-p_3;
ar[0] = XLocation.ToString();
ar[1] = YLocation.ToString();
return ar;
}