具有多参数的多方法或具有对象参数的一种方法

时间:2018-09-01 09:18:24

标签: c# class methods

请考虑以下内容;我有一个带有X和Y变量的类。类的想法是改变点在X轴和Y轴上的位置。为此,我首先提出了三种方法:

  • 第一个是追至X位置
  • 第二个更改Y位置
  • 第三个是通过传递此类的对象来更改X和Y

代码为

    public class ChangePosition
{
    public int X_AxisPosition;
    public int Y_AxisPosition;

    public ChangePosition(int X_Axis,int Y_Axis)
    {
        this.X_AxisPosition = X_Axis;
        this.Y_AxisPosition = Y_Axis;
    }
    public void ChangeXAxisPosition(int XValue)
    {
        X_AxisPosition = XValue;
    }
    public void ChangeYAxisPosition(int YValue)
    {
        Y_AxisPosition = YValue;
    }
    public void ChangeXAxis_YAxisValues(ChangePosition NewLocaltion)
    {
        if (NewLocaltion == null)
        {
            X_AxisPosition = default;
            Y_AxisPosition = default;
            throw new NullReferenceException("Invalid Inputs");
        }
        ChangeXAxisPosition(NewLocaltion.X_AxisPosition);
    }

}

过了一会儿,我重新思考并说为什么我在上面有两个方法(仅适用于两个轴),我可以通过传递此类的对象并将最后一个不需要的Axis设置为零来获得最后一个方法,如以下块所示

public class ChangePosition
{
    public int X_AxisPosition;
    public int Y_AxisPosition;
    public ChangePosition(int XValue, int YValue)
    {
        X_AxisPosition = XValue;
        Y_AxisPosition = YValue;
    }
    public void ChangeXAxis_YAxisValues(ChangePosition NewLocaltion)
    {
        if (NewLocaltion == null)
        {
          throw new NullReferenceException("Invalid Inputs");
        }
        X_AxisPosition =(NewLocaltion.X_AxisPosition);
        Y_AxisPosition =(NewLocaltion.Y_AxisPosition);
    }
}

有人可以告诉我最佳实践吗,以前的代码块哪个更好?为什么?

1 个答案:

答案 0 :(得分:2)

“位置”或“向量”等实体的最佳做法是使它们不可变-因为其 identity 仅取决于其状态。这意味着用相同的ChangePositionX_AxisPosition初始化的两个Y_AxisPosition对象是等于。因此,每当您要更改不可变实体的字段时,始终可以简单地替换整个对象。状态相同的两个点可能被视为代码中的不同实体,这可能会给您带来麻烦。

对于您而言,public void ChangeXAxis_YAxisValues(ChangePosition NewLocaltion)毫无意义,因为只要您可以像这样使用它

someObject.Position.ChangeXAxis_YAxisValues(new ChangePosition(x, y));

你最好写

someObject.Position = new ChangePosition(x, y);

点/位置的常见做法是使用structstruct实际上是可变的,但是其身份用其状态表示(struct的字段值相同等于,但不是类)。如果不会显着降低性能,最好将其字段设置为readonly

因此,请保持简单:

public struct ChangePosition
{
    public int X_AxisPosition;
    public int Y_AxisPosition;

    public ChangePosition(int X_Axis,int Y_Axis)
    {
        this.X_AxisPosition = X_Axis;
        this.Y_AxisPosition = Y_Axis;
    }
}

此外,通常您可能会发现对实现+运算符有用。