【问题标题】:c# How to optimize repeated codes on inline if statement [closed]c#如何优化内联if语句中的重复代码[关闭]
【发布时间】:2021-01-09 20:48:48
【问题描述】:

我使用模型类来创建对象。我的代码运行良好,但代码重复。

想象一下下面的代码:

ModelA objectA = new ModelA
{
    x = A-B <= 0 ? 0 : A - B,
    y = C - D > 0 ? C-D : int.MinValue
   
    
};

下面的代码创建内联对象。问题是当 A-B

我们可以做些什么来优化这段代码?

【问题讨论】:

  • 上面的代码有什么问题,重复的地方在哪里?
  • 你试过Math.Max()吗?

标签: c# asp.net optimization model-view-controller conditional-operator


【解决方案1】:

一种可能性是向您的类添加一个参数化构造函数,该类没有xy 作为参数,而是ABCD

public class ModelA
{
    public ModelA(int A, int B, int C, int D)
    {
        X = A-B <= 0 ? 0 : A - B;
        Y = C - D > 0 ? C-D : int.MinValue;
    }

    public int X { get; set; }
    public int Y { get; set; }
}

现在您可以使用

创建新对象了
ModelA objectA = new ModelA(A1, B1, C1, D1);
ModelA objectB = new ModelA(A2, B2, C2, D2);

您可以选择添加构造函数重载。

// Default constructor. Allows you to use an object initializer.
public ModelA()
{
}

// Or pass x and y as constructor arguments instead of using an object initializer.
public ModelA(int x, int y)
{
    X = x <= 0 ? 0 : x;
    Y = y > 0 ? y : int.MinValue;
}

最后一个变体允许您创建这样的对象,同时让构造函数执行所有范围检查

ModelA objectA = new ModelA(A - B, C - D);

当然,您也可以在属性设置器中进行这些检查:

private int _x;
public int X
{
    get {
        return _x;
    }
    set {
        X = value <= 0 ? 0 : value;
    }
}

private int _y;
public int Y
{
    get {
        return _y;
    }
    set {
        Y = value > 0 ? value : int.MinValue;
    }
}

如果您需要可变属性,这是最安全的版本,因为始终会执行检查,无论您是使用构造函数还是对象初始化器,还是在对象生命周期的后期更改属性。


与往常一样,您有很多选择。哪个最好,取决于您的需求。

【讨论】:

    【解决方案2】:

    您的投诉是A-B&lt;=0 ? 0 : A-B 执行两次A-B 减法运算?

    如果是,为什么不呢:

    ModelA objectA = new ModelA
    {
        x = A<B ? 0 : A-B,
        y = C>D ? C-D : int.MinValue
    };
    

    例如“如果 B 大于 A,那么 A-B 肯定是负数,我们想要 0 而不是负数,所以放 0,否则做数学运算”

    所以您不必在这些情况下进行数学运算并查看结果,您可以在不进行数学运算的情况下确定结果是否不可接受

    【讨论】:

    • 谢谢伙计。你的答案很清楚,并优化了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多