老问题,但我认为需要更好的解决方案。
您可以利用 Tuple 类型获取命名参数,但将其包装在自定义命名类型中,该类型将 .Item1、.Item2 等包装在有意义的属性名称中。
我也讨厌元组具有使代码不可读的未命名参数这一事实,但不能忽略它节省的时间必须自己实现 IComparable、IStructuralEquatable 等,以便您可以安全地将结构用作字典键,例如.
我认为这是一个非常愉快的妥协:
public class Velocity : Tuple<double, double, string>
{
public Velocity(double Speed, double Direction, string Units) : base(Speed, Direction, Units) { }
public double Speed { get { return this.Item1; } }
public double Direction { get { return this.Item2; } }
public string Units { get { return this.Item3; } }
}
现在代替这个垃圾:
Tuple<double, double, string> myVelocity = new Tuple<double, double, string>(10, 2.34, "cm/s");
System.Diagnostics.Debug.Print("Speed: " + myVelocity.Item1);
System.Diagnostics.Debug.Print("Direction: " + myVelocity.Item2);
System.Diagnostics.Debug.Print("Units: " + myVelocity.Item3);
你可以这样做:
Velocity myVelocity2 = new Velocity(10, 2.34, "cm/s");
System.Diagnostics.Debug.Print("Speed: " + myVelocity2.Speed);
System.Diagnostics.Debug.Print("Direction: " + myVelocity2.Direction);
System.Diagnostics.Debug.Print("Units: " + myVelocity2.Units);
而且您仍然可以从所有美妙的元组功能中受益,这些功能可以让您将其用作字典等中的复杂键。
唯一的缺点是,如果您只计划在单个方法的范围内使用此元组,则必须在该方法的包含类的范围内声明一个类型。对于大多数应用程序,我认为这不是问题。