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

C# 具有多个参数的多方法或具有对象参数的一种方法,c#,class,methods,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

考虑以下几点:;我有一个包含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);
    }

}
过了一段时间,我重新思考并说为什么我在上面有两个方法(仅适用于任意一个轴),我可以通过传递这个类中的object来获得最后一个方法,并将不需要的轴设置为零,如下面显示U的块所示

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);
    }
}

有人能告诉我,在最佳实践方面,前面的代码块中哪一个更好?为什么

对于“位置”或“向量”这样的实体,最好的做法是使它们不可变——因为它的身份只取决于它的状态。这意味着两个
ChangePosition
对象,用相同的
X\u AxisPosition
Y\u AxisPosition
初始化,是相等的。因此,无论何时,只要您想要更改一个不可变enity的字段,您总是可以简单地替换整个对象。在代码中,具有相同状态的两个点可能被视为不同的实体,这一事实可能会给您带来麻烦

在您的情况下,
public void ChangeXAxis\u YAxisValues(ChangePosition newlocalation)
没有意义,因为只要您愿意使用它

someObject.Position.ChangeXAxis_YAxisValues(new ChangePosition(x, y));
你最好写信

someObject.Position = new ChangePosition(x, y);
点/位置的一种常见做法是使用
struct
struct
实际上是可变的,但它的标识用它的状态表示(
struct
,具有相同字段值的字段是相等的,但不是类)。如果不会显著降低性能,将其字段设置为只读也很好

因此,请保持简单:

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;
    }
}

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

对于“位置”或“向量”等实体,最佳做法是使它们不可变,因为其标识仅取决于其状态。这意味着两个
ChangePosition
对象,用相同的
X\u AxisPosition
Y\u AxisPosition
初始化,是相等的。因此,无论何时,只要您想要更改一个不可变enity的字段,您总是可以简单地替换整个对象。在代码中,具有相同状态的两个点可能被视为不同的实体,这一事实可能会给您带来麻烦

在您的情况下,
public void ChangeXAxis\u YAxisValues(ChangePosition newlocalation)
没有意义,因为只要您愿意使用它

someObject.Position.ChangeXAxis_YAxisValues(new ChangePosition(x, y));
你最好写信

someObject.Position = new ChangePosition(x, y);
点/位置的一种常见做法是使用
struct
struct
实际上是可变的,但它的标识用它的状态表示(
struct
,具有相同字段值的字段是相等的,但不是类)。如果不会显著降低性能,将其字段设置为只读也很好

因此,请保持简单:

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;
    }
}

另外,通常您会发现实现
+
操作符很有用。

适合您业务需要的代码总是比不适合的代码好。坦率地说,你的问题不适合SO。这样的问题应该迁移到,因为这比SO问题更像是一个代码审查。以下是一些:您不应该在参数上使用
NullReferenceException
,而应该使用
ArgumentNullException
。如果参数不正确(
null
),请不要重置字段。不要将字段公开。但就像@Ňuf所说的。这是一个代码检查项目。@J.vanLangen-感谢您的观点,但请注意,如果我没有将字段设置为默认值,则可能会出现我预期的值问题。例如,考虑使用一个只在一个轴上执行的方法(无论是代码> CxEXAXISSITS< <代码>或<代码> CuxyAxISSITS> <代码>),然后我使用了最后一个方法(<代码> CuxExxSISY-AxISValue),并且我通过的对象是NULL,然后我期望两个轴(没有发生)的零值,但这是不可能发生的。Axis将具有上述任一方法的先前值。适合您业务需要的代码总是比不适合的代码好。坦率地说,你的问题不适合SO。这样的问题应该迁移到,因为这比SO问题更像是一个代码审查。以下是一些:您不应该在参数上使用
NullReferenceException
,而应该使用
ArgumentNullException
。如果参数不正确(
null
),请不要重置字段。不要将字段公开。但就像@Ňuf所说的。这是一个代码检查项目。@J.vanLangen-感谢您的观点,但请注意,如果我没有将字段设置为默认值,则可能会出现我预期的值问题。例如,考虑使用一个只在一个轴上执行的方法(无论是代码> CxEXAXISSITS< <代码>或<代码> CuxyAxISSITS> <代码>),然后我使用了最后一个方法(<代码> CuxExxSISY-AxISValue),并且我通过的对象是NULL,然后我期望两个轴(没有发生)的零值,但这是不可能发生的。轴将具有上述任一方法的先前值。