C # Статические открытые поля для приращения исполнителей потока - PullRequest
0 голосов
/ 01 декабря 2018

Я строю систему, используя AKKA.net (возможно, не относящийся к этой проблеме), и у меня есть класс, который отвечает за подсчет количества действующих лиц (для тех, кто не знает актеров, они могут показаться потоками дляупростить).В общем, у меня есть статическое открытое поле:

class MyClass{
    public static long TotalOutstandingRequests;
}

, и я увеличиваю / уменьшаю его внутри акторов / потоков (потому что у меня есть акторы, которые запускают / запускают другие акторы) с помощью:

Interlocked.Increment(ref MyClass.TotalOutstandingRequests);
Interlocked.Decrement(ref MyClass.TotalOutstandingRequests);

то, что происходит, - то, что IDE и интернет говорят, что плохая идея иметь общедоступное статическое поле, поэтому я хотел бы знать, есть ли альтернатива для моей проблемы, или нет, если все в порядке, пусть все так, как естьесть.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Плохая идея в том, что она может стать нестатической сверхурочно (во время разработки).

Почему вы спрашиваете?Просто потому, что в какой-то момент вы захотите нестатическую зависимость в этой статической.Будь то логгер, база данных, вспомогательный класс, сервис, соединение, все, что имеет разное время жизни.

С другой стороны, с нестатическим статусом вы можете легко сделать его статическим, гарантируя, что вы создадите его один раз или используйте внедрение зависимостей, чтобы легко управлять синглетами и другими возможнымивремя жизни (да, существует многократное время жизни, например на соединение, на сессию, на поток и т. д.).

Для решения:

public class MyClass
{
    public long TotalOutstandingRequests;
    private readonly ILogger _logger;
    //some incrementing, decrementing code here
    public MyClass(ILogger logger)
    {
        _logger = logger;
    }
    public void AddRequest()
    {
        Interlocked.Increment(ref TotalOutstandingRequests);
        _logger.Debug("New request here!");
    }
}

Так когда же использовать статический?Просто:

  • , когда вы уверены, что у него нет зависимостей, он не будет иметься в будущем и будет превращен в камень (языковые расширения, такие как LINQ, Regex, любые вспомогательные методы, константы и т. Д.)
  • вы работаете с неуправляемым кодом (вызывая функции Windows и т. Д.).

Я никогда не встречал код, который не может жить без статического, кроме этих двух случаев.

PS

Если это домашний проект - вы можете забыть о том, что я сказал, и просто сделать это так, как вы хотите =)

0 голосов
/ 01 декабря 2018

Если вы используете его правильно, это не такой плохая идея.

В любом случае, вы можете выставить некоторые статические методы, такие как:

public static long AddRequest() 
{
    return Interlocked.Increment (ref _totalOutstandingRequests);
}

public static long RemoveRequest() 
{
    return Interlocked.Decrement (ref _totalOutstandingRequests);
}

public static long GetRequests() 
{
    return _totalOutstandingRequests;
}
...