powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как правильно на C# создать глобальные переменные(обьекты)?
6 сообщений из 6, страница 1 из 1
Как правильно на C# создать глобальные переменные(обьекты)?
    #32906076
Hup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проясните следующий момент...
Как правильно на C# создать глобальные переменные(обьекты)
Я для подобных целей выбрал тип данных static и завел отдельный класс. Все вроде бы нормально,
но есть ряд мелких непоняток.

Сначала приведу код этого класса...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
namespace Configs
{
	abstract class Constants
	{
		public const string Conf_file_name = "//conf//conf.xml";
		public const string Template_file_name = "//conf//template.xml";
	}
	
	public class conf
	{
		static private usexml cxml;
		static private usexml [] dsxml;
		
		static private string passwd_file_name;
		static private string log_days;

		static public string GetFileNamePasswd() { return passwd_file_name; }
		static public string gGetFileNameLog() { return log_days; }
		static public usexml GetXML() { return cxml; }
		static public usexml [] GetDSXML() { return dsxml; }

		static conf()
		{
			object [] dat = new object [3];
			
			cxml = new myXml.usexml(Directory.GetCurrentDirectory() + Constants.Conf_file_name);
			dat = cxml.GetXmlDataSet().Tables["main"].Rows[0].ItemArray;
			
			passwd_file_name = dat[1].ToString();
			log_days = dat[2].ToString();

			int n = cxml.GetXmlDataSet().Tables["shop"].Rows.Count;
			dsxml = new usexml [n];
			for(int j = 0; j<n; j++)
			{
				dsxml[j] = new myXml.usexml(Directory.GetCurrentDirectory() + Constants.Template_file_name);
			}			
		}
	}
}
1. В этом коде меня смущает конструктор с типом static, т.е. скажите как он работает?
2. Второй вопрос вытекает из первого.
Есть контрол с комбоБоксом, который необходимо наполнить данными.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private void list_comboBox1_Load()
		{
			object [] dat = new object [3]; 
			DataTable table = conf.GetXML().GetXmlDataSet().Tables["shop"]; // (*)
			foreach(DataRow row in table.Rows)
			{
				dat = row.ItemArray;
				if(dat[3].ToString() == "true")
				{
					comboBox1.Items.Add(dat[1]); // наполняем данными
				}
			}

			dat = table.Rows[0].ItemArray;
			comboBox1.Text = label1.Text = dat[1].ToString();
		}

Если я задам тип конструктора как public, то вылетит ошибка в (*). Оно и понятно,
т.к. не создан обьект, но если я начну его создавать, то получится повторное
чтение данных из файлов(а этого не нужно, т.к. накладно). Для подобных целей я завел
отдельное окно(соотв. отдельный класс), при запуске которого отображается само окно и
в отдельном потоке происходит извлечение данных из различных внешних источников.
Так вот по идее обьект usexml cxml как static private и следовательно, если бы был вместо
static conf <-> public conf, то достаточно в любом классе записать conf cf = new conf() и
должно быть все нормально при обращении к cxml из другого класса, но вылетае ошибка (*)
(видимо обьект не создан).
Следовательно вопрос, как все же контролировать такой код, т.е. мне нужно сделать все загрузки
в моем спец. заведенном классе, а потом просто использовать обьекты в любом месте программы?
И сколько раз вызывается конструктор с типом static(один или более)?

P.S. что-то я загнул =)))

--
Хочешь избежать критики – ничего не делай, ничего не говори и будь никем.
...
Рейтинг: 0 / 0
Как правильно на C# создать глобальные переменные(обьекты)?
    #32906099
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. В этом коде меня смущает конструктор с типом static, т.е. скажите как он работает?
при первом обращении к любому статичному члену вызывается (только один раз) статический конструктор, так что ошибок быть не должно,
кроме того, ты не привел код ошибки, соответсвенно трудно судить что произошло
...
Рейтинг: 0 / 0
Как правильно на C# создать глобальные переменные(обьекты)?
    #32912431
Ustazz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот стандартное решение проблемы:
http://dotsite.ru/solutions/patterns/singleton/

Статический конструктор вызывается только один раз. Причной вызова может быть:
1. Создание экземпляра класса
2. Обращение к статическому члену класса
...
Рейтинг: 0 / 0
Как правильно на C# создать глобальные переменные(обьекты)?
    #32912749
serkir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тоже раньше так считал,
но ниже приведенная конструкция работает

abstract class ConstName
{
public const string name = "//conf//conf.xml";
}
abstract class StaticName
{
public static string name = "//conf//conf.xml";
}
Console.WriteLine(ConstName.name);
Console.WriteLine(StaticName.name);

Значит, для доступа ConstName.name и StaticName.name экземляра класса не нужно..( он ведь abstract).. Несколько неожиданно..
...
Рейтинг: 0 / 0
Как правильно на C# создать глобальные переменные(обьекты)?
    #32915964
Ustazz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serkirЯ тоже раньше так считал,
но ниже приведенная конструкция работает

abstract class ConstName
{
public const string name = "//conf//conf.xml";
}
abstract class StaticName
{
public static string name = "//conf//conf.xml";
}
Console.WriteLine(ConstName.name);
Console.WriteLine(StaticName.name);

Значит, для доступа ConstName.name и StaticName.name экземляра класса не нужно..( он ведь abstract).. Несколько неожиданно..

Так оно и есть. Для доступа к статически членам экземпляра класса не нужно.

P.S. Если бы имелся статический конструктор, он был бы вызван. Это пункт № 2 - обращение к статическому члену класса. Чтобы вызвался статический конструктор нужно либо первое, либо второе.
...
Рейтинг: 0 / 0
Как правильно на C# создать глобальные переменные(обьекты)?
    #32920719
Фотография B0rG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 serkir

так дык, там один const, а другой static. Какие тут конструкторы.

Человеку нужен либо синглетон, либо его вариации. Я например люблю такой:


class Configurator
{

private static DOMDocument m_oXML = null;

public static getParameter(aName)
{

if ( m_oXML is null ) { load(); }

return ...
}

private static load()
{
m_oXML = new DOMDocument;
m_oXML.load( "c:\some.xml");

}
}



Cheers
Pete
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как правильно на C# создать глобальные переменные(обьекты)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]