Где объявить переменную для доступа из любой точки программы?

Я делаю приложение WinForms, используя С#. Я хотел бы объявить переменную для доступа во всей программе, но я не знаю, где ее инициализировать?

Программа основана на BStree, и это то, что я пытаюсь инициализировать:

BSTree<string> record = new BSTree<string>();

c#
person user2154803    schedule 19.03.2013    source источник
comment
dotnetperls.com/global-variable   -  person    schedule 19.03.2013
comment
Я сделал это, но я получаю ошибку сборки, несовместимую доступность для записи   -  person user2154803    schedule 19.03.2013
comment
Возможно, вам просто нужно явно объявить эту переменную общедоступной.   -  person MadHenchbot    schedule 19.03.2013
comment
Аналогично: stackoverflow.com/questions/829698/   -  person Yahya    schedule 19.03.2013
comment
Спасибо всем, Сепстер ответил на мой вопрос, и его метод сработал на 100%.   -  person user2154803    schedule 19.03.2013


Ответы (2)


Если программа тривиальна — например, только одна форма и никаких дополнительных файлов классов и т. д. (например, простое школьное задание), то вы, вероятно, просто объявите статический глобальный внутри вашего класса Form, но вне каких-либо методов, например

public class MyForm : Form
{
   static private BSTree<string> record = new BSTree<string>();

   public MyForm()
   {
      ...
   }

   ...
}

А затем получите к нему доступ из вашего MyForm экземпляра (ов), например, MyForm.record.

Также обратите внимание, что вы можете просто объявить переменную (например, static private BSTree<string> record;) вне методов, а затем инициализировать ее (например, new BSTree<string>()) внутри, например, вашего конструктора. Между этими двумя подходами существует очень тонкая разница (т. е. влияет на порядок, в котором инициализируются различные элементы), но это редко имеет значение.

Имейте в виду, что член static "принадлежит" к классу, поэтому существует только одна "версия" этого члена. т.е. нет отдельной "версии" этого члена для каждого экземпляра вашего класса.

Но в противном случае у вас может быть статический класс «конфигурация» или «глобальный», который содержит эти значения (и, возможно, другие значения, считанные, например, из файла конфигурации):

public static class MyConfig
{
   static public BSTree<string> record = new BSTree<string>();

   ...
}

а затем вы получите доступ к этому из своего класса MyForm, такого как MyConfig.record.

Хотя в идеале вы должны предоставлять свойства, а не поля, например:

public static class MyConfig
{
   static private BSTree<string> record = new BSTree<string>();
   static public BSTree<string> Record
   {
       get {return record;}
       set {record = value;}
   }
   ...
}

а затем вы получите доступ к этому из своего класса MyForm, такого как MyConfig.Record. Это дало бы прямой доступ к базовому члену record.

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

person Sepster    schedule 19.03.2013
comment
@user2154803 user2154803 С удовольствием, приятель, спасибо за согласие. Обратите внимание, что я обновил/исправил свой ответ в отношении доступа к статическому члену из вашего класса MyForm. Я неправильно указал, что вы должны использовать this.record, но поскольку член является статическим, в экземпляре this нет record, а record существует в самом классе, например MyForm.record. - person Sepster; 19.03.2013
comment
да, я все равно понял идею, еще раз спасибо - у меня есть еще один вопрос, который трудно объяснить, если вы не возражаете, пожалуйста. - person user2154803; 19.03.2013
comment
@user2154803 user2154803 Извините, я иду спать... сейчас 3 часа ночи в Австралии ;-) Опубликуйте это как новый вопрос, и вы получите необходимую помощь! Я проверю завтра и ваши вопросы тоже. - person Sepster; 19.03.2013

public static class MyStaticBStreeInstance
{
   public static BSTree Instance {get;private set;}
   static MyStaticBStreeInstance()
       {
          Instance = new BSTree<string>();
       }
}

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

 var bstree = MyStaticBStreeInstance.Instance 
person TalentTuner    schedule 19.03.2013