Вопрос о C# и статических классах и функциях

В идеале вы должны использовать это

this.setState((prevState) => {
// Use prevState and do the map just like someone suggested in one of the answer
 courses: prevState.map(course => course.id === id ? {...course, courseGrade } : course)
})
5
задан Micah 23 April 2009 в 13:33
поделиться

8 ответов

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

  • Прежде всего, вы очень тесно связаны с реализация, которая всегда плоха.
  • Во-вторых, тестирование всех классов, которые зависят от ваших статических методов, становится очень трудным, потому что вы привязаны к одной реализации.
  • В-третьих, становится очень легко создавать не потокобезопасные методы, так как статические методы могут иметь только статическое состояние (которое совместно используется всеми вызовами методов).
6
ответ дан 13 December 2019 в 22:16
поделиться

Статические методы не имеют особого поведения в отношении многопоточности. То есть вы можете ожидать несколько «копий» метода, запущенного одновременно. То же самое относится и к статическим переменным - разные потоки могут получить к ним доступ одновременно, и ждать там не приходится. И если вы не будете осторожны, это может создать хаос.

3
ответ дан 13 December 2019 в 22:16
поделиться

Этот вопрос немного утомил. Относительно того, почему у вас так много статики.

Но я думаю, что вы спрашиваете о проблемах с многопоточностью, поэтому я бы сказал, посмотрите и посмотрите некоторые документы по многопоточности. h ttp: //msdn.microsoft.com/en-us/library/c5kehkcz (VS.80) .aspx

0
ответ дан 13 December 2019 в 22:16
поделиться

Да, это плохая идея.

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

1
ответ дан 13 December 2019 в 22:16
поделиться

Если вы используете одно статическое соединение для доступа к базе данных, вам придется синхронизировать вызовы методов. Многократные потоки, запрашивающие базу данных для данных по единственному соединению, будут ... эээммм ... испортить вещи. Таким образом, вы сериализуете доступ к данным всех потоков, и это сильно повлияет на производительность.

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

Если вы используете статический пул соединений, вы уменьшите это влияние на производительность, поскольку вам нужно только сериализовать доступ к пулу соединений.

Кроме того, статика в общем случае не хорошее дизайнерское решение - они делают модульное тестирование очень сложным. Вам следует рассмотреть возможность использования шаблона Singleton или Monostate.

0
ответ дан 13 December 2019 в 22:16
поделиться

Static определяет только область, в которой метод определяется, и как он связан / вызван. Это не имеет ничего общего с многопоточностью.

Вы должны быть осторожны со статическими полями. Их разделяют все темы. Потоки не ждут друг друга, но вам нужны блокировки, чтобы заставить его работать.

Но если ваше приложение немного сложнее, чем Hello World, вам следует подумать о том, чтобы ваши методы были не статичными, а использовали объектно-ориентированные шаблоны.

Это не имеет ничего общего с многопоточностью.

Вы должны быть осторожны со статическими полями. Их разделяют все темы. Потоки не ждут друг друга, но вам нужны блокировки, чтобы заставить его работать.

Но если ваше приложение немного сложнее, чем Hello World, вам следует подумать о том, чтобы ваши методы были не статичными, а использовали объектно-ориентированные шаблоны.

Это не имеет ничего общего с многопоточностью.

Вы должны быть осторожны со статическими полями. Их разделяют все темы. Потоки не ждут друг друга, но вам нужны блокировки, чтобы заставить его работать.

Но если ваше приложение немного сложнее, чем Hello World, вам следует подумать о том, чтобы ваши методы были не статичными, а использовали объектно-ориентированные шаблоны.

0
ответ дан 13 December 2019 в 22:16
поделиться

Если вы сделаете это правильно , это не будет проблемой. Если вы сделаете это неправильно , это может привести к последовательному доступу к ресурсу.

Иногда различие между правильным и неправильным может быть очень тонким и трудно заметным, но главное, что ни один метод не должен полагаться или блокировать какое-либо «состояние» (членов) класса.

0
ответ дан 13 December 2019 в 22:16
поделиться

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

Таким образом, мне не нужно создавать экземпляры объектов поиска каждый раз, когда мне это нужно, и это уменьшает необходимость вызова БД для повышения производительности.

0
ответ дан 13 December 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: