Я хочу понять, как лучше всего в С# использовать глобальную переменную

Я делаю проект колледжа. Это приложение для чата в форме Windows. Я хотел бы понять, как правильно иметь глобальную переменную, хотя это противоречит философии oop!

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

Если есть способ лучше, чем глобальный, то я весь в ушах. В противном случае вы можете посоветовать, как лучше всего достичь этой цели?

Спасибо Ps я новичок - будьте добры!


person Piquet    schedule 17.01.2016    source источник
comment
Этот кандидат-обманщик закрыт, но у него есть несколько полезных ответов.   -  person Henk Holterman    schedule 17.01.2016
comment
Вы уже знаете, что это не очень хорошая практика. Лучший способ слишком широк для ответа, но начните с различения классов и объектов.   -  person Henk Holterman    schedule 17.01.2016
comment
@Piquet, я думаю, что на ваш вопрос будет намного проще ответить (и более конкретно), если вы опубликуете часть кода, который вы упомянули ...   -  person Nikolai Samteladze    schedule 17.01.2016
comment
Нет хорошего пути. Сделать это правильно ничего не стоит, как минимум использовать статическое свойство. С явным установщиком, чтобы вы могли отлаживать типичные проблемы, вызванные глобальными переменными. И найдите как минимум 10 причин сделать его общедоступным, а не внутренним.   -  person Hans Passant    schedule 17.01.2016


Ответы (2)


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

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

Что-то вроде этого:

public class ReadNewestEntries {
  public int entryId {get;set}
  public List<someDataType> ReadNewEntries() {
     // some code to read the database, using the entryId

     // Get last ID read
     entryId = dataList.Max(x => x.entryId);
  }
}

// in main class:
ReadNewestEntries getNewEntries = new ReadNewestEntries();
// Then just keep this class instance around to use
List<someDataType> = getNewEntries.ReadNewEntries();

Ваша «глобальная переменная» - это просто entryId int в самом классе, который будет хранить и хранить для вас ваш последний прочитанный идентификатор. Я не проверял приведенный выше код, но, надеюсь, он вам поможет и без использования глобальной переменной.

person astrosteve    schedule 17.01.2016

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

person Yuriy Zaletskyy    schedule 17.01.2016