c# - 使用静态或非静态类

标签 c# design-patterns

我有一个静态类,但这是一个糟糕的选择吗?它应该是一个非静态类吗?

我想在我的类中设置两个值。

当您给属性值时,是否有可能在设置和获取它们时出现某种冲突?如果另一个用户有相同的目标。

我有一个调用这个类的页面。 一位用户点击该页面并发生这种情况。

  1. 设置计算属性
  2. 运行 void 计算两个属性
  3. “也许其他一些功能运行并需要一些时间”
  4. 获取两个属性的值

但是如果另一个用户点击该页面并设置了其他值并使第一个用户的值不正确怎么办。我想这可能吗?

我想到的其他一些选择是要么

  • 将所有属性作为参数发送到 void 中,并返回一个包含我需要的两个值的新类。 (不要将它们存储为可以在使用前由其他用户更改的静态属性)。
  • 创建一个具有属性的新类(可能称为 BreakTime)。将其作为一个参数发送到空隙中。返回它,计算。
  • 或者你告诉我最好的选择是什么! :)

这是它的样子:

public static class BreakTimeCalculator
{
    public static int BreakFromSec { get; private set; }
    public static int BreakUntilSec { get; private set; }
    public static int CustomBreakSec { get; set; }
    public static int FromSec { get; set; }
    public static int UntilSec { get; set; }
    public static int Equlizer { get; set; }

    public static void CalculateBreakFromAndBreakeUntil()
    {
        var taskLength = UntilSec - FromSec;
        var middleOfTask = FromSec + (taskLength / 2);
        var secondsToMoveLeft = middleOfTask % 300;
        var amountEqualizers = CustomBreakSec / Equlizer;
        var fiftyFifty = amountEqualizers % 2 == 0;
        var leftSideEqualizers = fiftyFifty ? amountEqualizers / 2 : (amountEqualizers / 2) + 1;

        BreakFromSec = middleOfTask - secondsToMoveLeft - (leftSideEqualizers * Equlizer);
        BreakUntilSec = BreakFromSec + CustomBreakSec;
    }
}

最佳答案

除非你真的、真的必须这样做,否则永远不要创建静态状态,因为如果你这样做的话,你会为自己跌倒做好准备。您使测试变得更加困难,并且线程冲突(如您所描述的)发生的可能性更高。

如果您必须在类中设置状态然后调用方法,而不是仅仅将值作为参数传递给方法,请将其设为非静态类。此外,您最好通过构造函数传递值,而不是使用属性。

话虽如此,我解决您的问题的方法是创建一个 POCO 来保存结果数据并使用静态方法进行计算。使用 C# 6 语法,这看起来像:

public class BreakTimeResult
{
    public BreakTimeResult(int breakFromSec, int breakUntilSec)
    {
        BreakFromSec = breakFromSec;
        BreakUntilSec = breakUntilSec;
    }

    public int BreakFromSec { get; }
    public int BreakUntilSec { get; }
}


public static class BreakTimeCalculator
{
    public static BreakTimeResult CalculateBreakFromAndBreakeUntil(int customBreakSec,
                                                                   int fromSec,
                                                                   int untilSec,
                                                                   int equlizer)
    {
        var taskLength = untilSec - fromSec;
        var middleOfTask = fromSec + (taskLength / 2);
        var secondsToMoveLeft = middleOfTask % 300;
        var amountEqualizers = customBreakSec / equlizer;
        var fiftyFifty = amountEqualizers % 2 == 0;
        var leftSideEqualizers = fiftyFifty 
            ? amountEqualizers / 2 
            : (amountEqualizers / 2) + 1;

        var breakFromSec = middleOfTask - secondsToMoveLeft - (leftSideEqualizers * equlizer);
        var breakUntilSec = breakFromSec + customBreakSec;
        return new BreakTimeResult(breakFromSec, breakUntilSec);
    }
}

关于c# - 使用静态或非静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34197568/

相关文章:

php - 什么定义了有效的对象状态?

design-patterns - 我的设计中需要访客模式吗

c# - 对于返回值的方法,我应该使用 wsHttpBinding 还是 wsDualHttpBinding?

c# - c# 中的标记接口(interface)

c# - 我的 UserControl 中的事件不会触发 - 为什么?

c# - 性能 - 使用 LINQ 删除多个 MSSQL 数据库条目

c# - 复杂搜索条件的好模式?

php - 将数字转换为 5 位数字字符串

c# - 组合框默认值

c# - 如何通过ID来操作itemtemplate中的item