powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Статический класс.
10 сообщений из 10, страница 1 из 1
Статический класс.
    #32811768
Витася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

У меня вопрос -- можно ли в С# создать статический класс, подобно тому, как это можно было сделать в C++? Именно класс, а не статический метод, со всеми вытекающими последствиями -- например, с конструктором, вызывающимся перед выполнением метода Main?

Упреждая вопрос, "зачем это нужно?", отвечу: хочу проинициализировать свою библиотеку независимо от того, создаются ли экземпляры класса в основной программе или нет...

С уважением,
...
Рейтинг: 0 / 0
Статический класс.
    #32811837
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
статическим бывает не класс - а объект...в С++ в том числе

Код: plaintext
1.
2.
3.
4.
5.
6.
class test
{
private static test myTest = new test()


}
...
Рейтинг: 0 / 0
Статический класс.
    #32811846
Фотография # Darth Vader #
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется создавать класс со всеми методами static надо не для создания экземпляров объектов.
...
Рейтинг: 0 / 0
Статический класс.
    #32811956
Витася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
funikovyuriстатическим бывает не класс - а объект...в С++ в том числе

Код: plaintext
1.
2.
3.
4.
5.
6.
class test
{
private static test myTest = new test()


}


Ну и? Без создания экземпляра класса test внутрення статическая переменная тоже не будет создана, соответственно, конструктор не будет вызван... Увы...

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
//static_class.cs
using System;

namespace Test {
    class EntryPoint {
	static void Main() {
		Console.WriteLine("Main");
        }
    }

    class Test {
	static Test t = new Test();
        public Test(){
	    Console.WriteLine("Test constructor");
	}
    }
}

Код: plaintext
1.
2.
C:\Work\Test\cs>static_class.exe
Main

Как видно из этого примера, статического экземпляра t класса Test не создается, конструктор, соответственно, не вызывается...
...
Рейтинг: 0 / 0
Статический класс.
    #32812016
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно вам чем-то поможет использование статического конструктора, он вызывается перед вызовом любого стат. метода или обращения к любому стат. свойству. Хотя это, конечно, не совсем то, что вы хотели...
Код: 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.
using System;

namespace Test 
{
	class EntryPoint 
	{
		static void Main() 
		{
			Test.TestStr();

			Console.WriteLine("Main");
		}
	}

	class Test 
	{
		static Test t = new Test();

		public Test()
		{
			//instance constructor
			Console.WriteLine("Test constructor");
		}
		static Test()
		{
			//static constructor
			t.ToString();
		}

		public static string TestStr()
		{
			return "String";
		}
	}
}
...
Рейтинг: 0 / 0
Статический класс.
    #32812705
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Витася

Ну и?

ну и используйте

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class test
{
public static test myTest = new test()

public void DoSomeWork()
{}

}

class myApp
{

... main()
{
   test.myTest.DoSomeWork()
}
}

...
Рейтинг: 0 / 0
Статический класс.
    #32812796
Витася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
funikovyuri

ну и используйте

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class test
{
public static test myTest = new test()

public void DoSomeWork()
{}

}

class myApp
{

... main()
{
   test.myTest.DoSomeWork()
}
}



Ну так ведь смысл вопроса-то был в чем? Сделать так, чтобы конструктор класса Test отрабатывал без всякого упоминания класса Test в основной программе!
Если конкретнее -- хочется написать библиотечный класс, который бы создавал некий "глобальный" статический объект, инициализировал свои внутренние настройки при загрузке, и делал это все независимо от остальной части программы.
В плюсах такая возможность была (путем создания статического экземпляра класса), в шарпе такая возможность, похоже, исчезла...

Ближе всего ответ Alexey Kudinov-а по поводу статического конструктора.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
using System;
namespace Test {
    class EntryPoint {
	public static Test t = new Test();
	static void Main() {
		Console.WriteLine("Main");
        }
    }

    class Test {
        static Test(){
	    Console.WriteLine("Test constructor");
	}
    }
}
-------------------------------
C:\Work\Test\cs>static_class.exe
Test constructor
Main

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

Хотелось бы как-нибудь так: ((с) масяня)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
using MyDataLayer;
namespace MyNS{
    class MyCoolApp {
	static void Main() {
                 SqlConnection t = DataLayer.GetConnFromPool();
                 ..............
        }
    }
}

... и при этом чтобы класс DataLayer уже был проинициализирован, строка соединений прочитана из настроек, коннекшены в пуле пооткрываны и готовы к употреблению и вообще все было чики-пуки...
А самое главное -- хочу обращаться к этому же пулу соединений из библиотечной формы, которая не обязана знать, как в каждом конкретном случае называется класс главной программы и откуда ей брать этот пул соединений...
Неужели я хочу слишком многого? ;-)
...
Рейтинг: 0 / 0
Статический класс.
    #32812824
Стр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в таком варианте конструктор будет вызван при первом обращении к классу StaticClass
Код: 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.
using System;

namespace Test
{
	class MainClass
	{
		[STAThread]
		static void Main(string[] args)
		{
			StaticClass.method();
			StaticClass.Connection="8989";
			Console.WriteLine("Main "+StaticClass.Connection);
		}
	}

	class StaticClass
	{
		private static string _connection=string.Empty;
		// стат. констуктор
		static StaticClass()
		{	Console.WriteLine("Ctor");
			Connection="6590";

		}		
		// стат. метод
		public static void method()
		{	Console.WriteLine("method "+_connection);
		}
		// стат. свойство
		public static string Connection
		{ 	get
			{ Console.WriteLine("get "+_connection);
			  return(_connection);
			}
			set
			{ _connection=value;
			  Console.WriteLine("set "+_connection);
			}
		}
	}	
}
Ctor
set 6590
method 6590
set 8989
get 8989
Main 8989
...
Рейтинг: 0 / 0
Статический класс.
    #32814415
Ustazz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про паттерн Singleton слышали? Мне кажется он был уместен в данном случае.

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


Зачем инициализировать библиотеку, если ей не будут пользоваться? IMHO Когда попытаются получить соединение, тогда и стоит загружать.
...
Рейтинг: 0 / 0
Статический класс.
    #32814583
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Витася Основной недостаток, который я вижу -- невозможность получения "глобального" объекта. Все равно экземпляр класса, хоть он и статический, но существует только в контексте класса EntryPoint, да и вообще надо явно его создавать...
Ну и что ? Пользователям ваших API обязательно знать внутреннюю организацию классов, доступа к которым у них все равно нет ? Кроме того, библиотеку вообще нельзя загрузить не "в контексте", на она и библиотека.
Витася
... и при этом чтобы класс DataLayer уже был проинициализирован, строка соединений прочитана из настроек, коннекшены в пуле пооткрываны и готовы к употреблению и вообще все было чики-пуки...
А самое главное -- хочу обращаться к этому же пулу соединений из библиотечной формы, которая не обязана знать, как в каждом конкретном случае называется класс главной программы и откуда ей брать этот пул соединений... Зачем ей знать как называется класс главной программы ? Или вы хотите, чтобы соединение создавалось и описывалось в "главной программе", но доступ к нему был и из библиотек ?
Вы хотите написать
Код: plaintext
SqlConnection t = DataLayer.GetConnFromPool();
Ну так и пишите, в static конструкторе класса DataLayer инициализируйте все, что хотите. Физически инициализация произойдет при обращении к GetConnFromPool.
Мне кажется, что это более правильно, чем создавать соединение и все остальное прямо при загрузке библиотеки, т.к. не ясно, а будет ли нужно это соединение вообще.

OFF
Лично я не сторонник активного применения концепции lazy loading.
Такой стиль программирования кажется красивым и изящным на стадии проектирования, но создает определенное число проблем при отладке, работе в Design Time, сборке программы.
Непонятно что и когда создается и загружается. Компоненты "внезапно" начинают создавать соединение с сервером, что-то делать и т.п. К сожалению, часто видил это на практике.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Статический класс.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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