Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
.NET 4.x

Static методы и классы

20.12.2016, 19:57. Показов 4745. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если метод в нестатичном классе помечен как static, что будет с памятью после выполнения вот такого метода?
К примеру:
C#
1
2
3
4
5
6
7
8
9
10
11
public class SomeClass
{
      private statis int someInt;
      public statis bool Calculate(int _someValue)
         {
             someInt = _someValue;
            // куча приватных методов в которые не передаётся значение а используется someInt
            //....
            return true;
          }
}
Где-то в коде в проекте
C#
1
bool retVal = SomeClass.Calculate(12);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.12.2016, 19:57
Ответы с готовыми решениями:

Почему static методы работают быстрее Instance методов?
Почему static методы работают быстрее Instance методов?

Классы и их методы
Доброго времени суток! Помогите, пожалуйста с классами... class Coordinates { public int X=0; public int...

Классы и методы
Может кто на пальцах объяснить зачем нужны классы и методы, сколько перечитал не где так толком и не говорят

39
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18355 / 14281 / 5370
Регистрация: 17.03.2014
Сообщений: 28,962
Записей в блоге: 1
20.12.2016, 23:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от skilllab Посмотреть сообщение
Блин....Calculate принадлежит классу SomeClass?
Да.

Цитата Сообщение от skilllab Посмотреть сообщение
Если да, то как я его вообще вызываю
Сколько раз тебе нужно повторить что static методы вызываются без создания экземпляра класса?
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
20.12.2016, 23:31
Цитата Сообщение от skilllab Посмотреть сообщение
Если да, то как я его вообще вызываю SomeClass.Calculate(12)
Когда вы вызываете этот метод CLR уже создала экземпляр некоторого класса (объект-тип), производного от System.Type. Вот этому экземпляру и принадлежит этот метод Calculate как и вообще все методы, определённые в SomeClass (хоть статические хоть нет).
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18355 / 14281 / 5370
Регистрация: 17.03.2014
Сообщений: 28,962
Записей в блоге: 1
20.12.2016, 23:34
TopLayer, этим объяснением ты только путаешь ТСа. Экземпляры Type и экземпляры класса это две разные вещи. Конкретно при вызове static методов Type никак не учавствует т.к. вызов static метода это банальный jmp в ассемблере.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
20.12.2016, 23:34
Другое дело, что вызов нестатических методов без экземпляра new SomeClass() не допускается еще на стадии компиляции программы.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
20.12.2016, 23:41  [ТС]
OwenGlendower, особо можешь не повторять, если считаешь что одного раза было достаточно.
---------------
Цитата Сообщение от TopLayer Посмотреть сообщение
CLR уже создала экземпляр некоторого класса (объект-тип)
Цитата Сообщение от OwenGlendower Посмотреть сообщение
static методы вызываются без создания экземпляра класса?

Согласно этой страничке
Чтобы создать ссылку на статический член x, воспользуйтесь полным именем — MyBaseC.MyStruct.x
Это ссылка на член.
И далее
Поскольку экземпляр класса содержит
значит экземпляр уже есть? Или под экземпляром понимается тупо текст в исходнике??

Добавлено через 2 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
вызов static метода это банальный jmp в ассемблере.
Т.е. SomeClass.Calculate - это не более чем указатель на метод? И никаким там классом, экземпляром и не пахнет?

Добавлено через 2 минуты
Цитата Сообщение от TopLayer Посмотреть сообщение
производного от System.Type. Вот этому экземпляру и принадлежит
ааааа....всё, понял.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18355 / 14281 / 5370
Регистрация: 17.03.2014
Сообщений: 28,962
Записей в блоге: 1
20.12.2016, 23:45
Цитата Сообщение от skilllab Посмотреть сообщение
Чтобы создать ссылку на статический член x, воспользуйтесь полным именем — MyBaseC.MyStruct.x
Это неправильный перевод. В оригинале сказано "To refer to the static member x ... " что следует перевести "Чтобы обратится к статическому члену x ...".

Цитата Сообщение от skilllab Посмотреть сообщение
Поскольку экземпляр класса содержит
Еще один неверный перевод. В оригинале сказано "While an instance of a class contains a separate copy of all instance fields of the class, there is only one copy of each static field." что можно перевести так - "Существует только одна копия static поля, в отличие от экземплярных которые хранятся в отдельных копиях в экземплярах класса".

P.S. Советую не читать русский MSDN. Раньше они переводили его вручную. Сейчас же он переводится автоматически и очень плохо к сожалению.
1
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
20.12.2016, 23:46
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Экземпляры Type и экземпляры класса это две разные вещи
Я этому не противоречил.
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Конкретно при вызове static методов Type никак не учавствует т.к. вызов static метода это банальный jmp в ассемблере.
Ассемблер не имеет прямого отношения к C#. А экземпляр класса, производного от Type, хранит указатели, соответствующие методам класса SomeClass.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18355 / 14281 / 5370
Регистрация: 17.03.2014
Сообщений: 28,962
Записей в блоге: 1
20.12.2016, 23:48
Цитата Сообщение от skilllab Посмотреть сообщение
ааааа....всё, понял.
Увы нет. Тебя ввели в заблуждение.

Добавлено через 1 минуту
Цитата Сообщение от TopLayer Посмотреть сообщение
А экземпляр класса, производного от Type, хранит указатели, соответствующие методам класса SomeClass.
Это не значит что он является экземпляром для статических методов класса.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
20.12.2016, 23:53  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Это не значит что он является экземпляром для статических методов класса.
Так, может я неправильно чего понимаю или придираюсь к словам, но слово: экземпляр - это занимаемый в памяти некий объект?
и другой:
Что тогда является экземпляром для статического метода?

Добавлено через 55 секунд
Или у статического метода НЕТ экземпляра принадлежности?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18355 / 14281 / 5370
Регистрация: 17.03.2014
Сообщений: 28,962
Записей в блоге: 1
20.12.2016, 23:54
Цитата Сообщение от skilllab Посмотреть сообщение
это занимаемый в памяти некий объект?
Да

Цитата Сообщение от skilllab Посмотреть сообщение
Что тогда является экземпляром для статического метода?
Ничего. В этом его отличие от не-static метода.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
20.12.2016, 23:58  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Ничего.
Тогда что вообще является порождающим объектом для статического метода в нестатическом классе, создающим в памяти ссылку на этот метод?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18355 / 14281 / 5370
Регистрация: 17.03.2014
Сообщений: 28,962
Записей в блоге: 1
21.12.2016, 00:00
skilllab, и снова ответ - ничего.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
21.12.2016, 00:16  [ТС]
Хммм...хитрО всё.
Тогда возвращаясь к первому сообщению: если я хочу создать класс-утилиту, задача которого это модифицировать коллекцию с помощью вызовов из неуправляемой памяти и используя объекты неуправляемой памяти вперемешку с управляемой, при этом используется частые вызовы к этой неуправляемой памяти (к некоему объекту вне программы) лучшим решением будет:
1) создать экземплярный класс с экземплярными методами. После выполнения методов среда сама разберётся что и как и когда удалять. Вручную я даже GC вызывать не буду.
2) создать экземплярный класс но с неэкземплярными методами (статичными). Это упростит вызов из основного кода программы. Напоминаю, класс - утилита. Он не является чьим то предком и не будет являться родителем.
3) создать статичный класс с автоматом статичными методами.

Скорость играет вторую роль по значению, ибо визуальная часть программы итак кушает немало, а тут ещё и всё вот это)))

При всём при этом я чуток беспокоюсь за освобождение памяти самой средой. И даже не столько за освобождение, а за повторное использование (ну вот чёрт знает как там внутри всё работает) значений ссылочных переменных. Ибо это приведёт к AccesViolation.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
21.12.2016, 00:23
Кликните здесь для просмотра всего текста
Короче, надоело это жонглирование формулировками, как хрен не назови он хрен и есть.
Объясню так: метод - это указатель на код, то есть на последовательность каких-то инструкций. Этому указателю ничего не надо для счастья. Пусть дан класс:
C#
1
2
3
4
5
class SomeClass
{
    public static void StaticMethod(int x) {}
    public void InstanceMethod(int x) {}
}
Первый метод по сути такой, каким написан: void SomeClass.StaticMethod(int x)
Второй метод, по сути, выглядит так: void SomeClass.InstanceMethod(SomeClass this, int x) (Принимает 2 аргумента а не 1)
Причём для второго метода компилятор C# заставляет нас явно указывать конкретный объект this с помощью удобного синтаксиса:
C#
1
2
var obj = new SomeClass();
obj.InstanceMethod(5);
А для первого метода компилятор запрещает указывать какой-либо объект, но чтобы не путать методы разных классов, заставляет приписывать имя класса явно SomeClass. (обязательно только для внешнего по отношению к классу кода):
C#
1
SomeClass.StaticMethod(8);
Вот и вся принципиальная разница.
2
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18355 / 14281 / 5370
Регистрация: 17.03.2014
Сообщений: 28,962
Записей в блоге: 1
21.12.2016, 00:24
skilllab, не зная деталей взаимодействия с неуправляемым кодом трудно давать совет. Разве что самый общий. Что класс с экземплярными членами создается когда есть смысл в наличии этого экземпляра. Если смысла в наличии экземпляра класса нет, то лучше использовать static класс. Взять например System.Console. Почему он объявлн как статический? Потому что консоль в приложении может быть только одна. А раз так значит не нужно отличать одну консоль от другой и следовательно не нужны экземпляры класса Console.
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
21.12.2016, 00:31  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
не нужно отличать одну консоль от другой
Да, конкретно эта статика будет выполняться именно в указанной части приложения.
Тогда может быть на ночь глядя))) в двух словах скажете о 2) и 3) пунктах? Ну, различия.
У меня сейчас 2 публичных метода и штук 10 приватных. Экземпляр класса точно не нужен. Вопрос: делать ли сам класс статичным или оставить экземплярным (конструктор тоже не нужен, все параметры в методы передаю). Хранение переменных на уровне класса тоже не нужно. Метод принял - метод возвратил. Всё.

Добавлено через 57 секунд
Цитата Сообщение от OwenGlendower Посмотреть сообщение
лучше использовать static класс
и именно тут больше всего ссыкотно за
Цитата Сообщение от skilllab Посмотреть сообщение
AccesViolation.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18355 / 14281 / 5370
Регистрация: 17.03.2014
Сообщений: 28,962
Записей в блоге: 1
21.12.2016, 00:33
skilllab, если все методы в классе объявлены как static, то никакой разницы между п.2 и 3 не будет.

Добавлено через 41 секунду
skilllab, прямой связи между static классом и AccesViolation нет.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
21.12.2016, 00:40  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
прямой связи между static классом и AccesViolation нет.
Если я получил значение статичной переменной (к примеру "книга" из экселя). Вот работаю я с этой переменной в статичных методах. Потом выхожу оттуда и дальше уже в основном коде...Потом опять захожу по надобности в статичный метод и где-то проверяю на null (ссылка та же, значение по ссылке вроде то же) = всё ок, не null. Но при этом книгу уже закрыл и открыл заново или просто переключился на другую книгу сделав её активной - что получу?
Мусорщик то ничего не собрал - всё статичное
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18355 / 14281 / 5370
Регистрация: 17.03.2014
Сообщений: 28,962
Записей в блоге: 1
21.12.2016, 00:42
skilllab, очевидно проблему получишь. Только static здесь ни при чем. Это вина программиста написавшего такой код.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
21.12.2016, 00:43  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Только static здесь ни при чем.
ну в целом да. В случае экземплярного типа именно такая ошибка вообще не должна возникнуть. Там же всё каждый раз заново.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.12.2016, 00:43

Классы. Свойства. Методы.
Здравствуйте! Помогите пожалуйста. Есть лабораторная работа и я не все понимаю. Значит есть класс Paper в котором 3 открытых ...

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

Статические классы, методы
Помогите, пожалуйста, исправить ошибки: 1) "Input": нельзя обявлять члены экземпляра в статическом классе; 2) в методе для x, y требует...

Классы и объекты ООП и их методы
Необходимо разработать класс на тему "Меню в кафе", а также метод, например, который рассчитывает стоимость что-либо в кафе. Помогите плиз,...

Задачи по C# (классы, интерфейсы и методы)
Добрый вечер, уважаемые программисты! Очень нужна ваша помощь. Великие трудности с данными задачами: Заранее спасибо большое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru