В чем отличие использования Finalize и Dispose?
Метод Finalize уже определен в базовом для всех типов классе Object, однако данный метод нельзя так просто переопределить. И фактическая его реализация происходит через создание деструктора. Вызывается сборщиком мусора, а точный момент вызова неопределен.
Метод Dispose нужен для ручного освобождения ресурсов, через его явный вызов или с помощью using.
Метод Finalize уже определен в базовом для всех типов классе Object, однако данный метод нельзя так просто переопределить. И фактическая его реализация происходит через создание деструктора. Вызывается сборщиком мусора, а точный момент вызова неопределен.
Метод Dispose нужен для ручного освобождения ресурсов, через его явный вызов или с помощью using.
Forwarded from Библиотека нейросетей | ChatGPT, Midjourney, DeepSeek, Sora
Please open Telegram to view this post
VIEW IN TELEGRAM
Как и зачем использовать конструкцию using в C#?
Ключевое слово using упрощает работу с объектами, которые реализуют интерфейс IDisposable.
Интерфейс IDisposable содержит один метод .Dispose(), который используется для освобождения ресурсов, которые захватил объект. При использовании using не обязательно явно вызывать .Dispose() для объекта.
Ключевое слово using упрощает работу с объектами, которые реализуют интерфейс IDisposable.
Интерфейс IDisposable содержит один метод .Dispose(), который используется для освобождения ресурсов, которые захватил объект. При использовании using не обязательно явно вызывать .Dispose() для объекта.
В чем отличие необязательных параметров от именованных?
Необязательные параметры позволяют опускать аргументы функции, в то время как именованные параметры разрешают передавать аргументы по названию параметра.
public void optionalParamFunc(int p1, int p2 = 2, int p3 = 3);
optionalParamFunc(1, p3:10); // это эквивалентно optionalParamFunc(1,2,10);
Необязательные параметры позволяют опускать аргументы функции, в то время как именованные параметры разрешают передавать аргументы по названию параметра.
public void optionalParamFunc(int p1, int p2 = 2, int p3 = 3);
optionalParamFunc(1, p3:10); // это эквивалентно optionalParamFunc(1,2,10);
Напишите программу для сложения всех чётных чисел в массиве
Ответ:
static long TotalAllNum(int[] intArray) {
return intArray.Where(i => i % 2 == 0).Sum(i => (long)i);
}
Ответ:
🦾🧠🏋️Качаем мозги к лету!
Курс «Алгоритмы и структуры данных» для тех, кто хочет научиться работать с алгоритмами, подготовиться к собеседованию крупную IT-компанию и начать брать более сложные проекты.
➡️ Алгоритмы и структуры данных35 990 ₽ 21 594 ₽
⭐️ Переходите и активируйте бесплатные вводные занятия курса — https://proglib.io/w/da6727d1
Вас ждут:
– 150 практических заданий и 47 видеолекций
– бессрочный доступ к обучению
– поддержка преподавателя в чате
А также очень харизматичный спикер из Яндекса 🙌🏻
Курс «Алгоритмы и структуры данных» для тех, кто хочет научиться работать с алгоритмами, подготовиться к собеседованию крупную IT-компанию и начать брать более сложные проекты.
➡️ Алгоритмы и структуры данных
⭐️ Переходите и активируйте бесплатные вводные занятия курса — https://proglib.io/w/da6727d1
Вас ждут:
– 150 практических заданий и 47 видеолекций
– бессрочный доступ к обучению
– поддержка преподавателя в чате
А также очень харизматичный спикер из Яндекса 🙌🏻
Отличия классов String и StringBuilder
Объект класса String представляет собой неизменяемую строку. Когда выполняется какой-нибудь метод класса String, система создает новый объект в памяти с выделением ему достаточного места.
Объект класса StringBuilder представляет собой динамическую строку. При создании строки StringBuilder выделяет памяти больше, чем необходимо этой строке, а при добавлении к ней каких-либо элементов строка не пересоздается заново. В том случае если выделенной памяти не будет хватать для добавления новых элементов, то емкость объекта будет увеличена.
Объект класса String представляет собой неизменяемую строку. Когда выполняется какой-нибудь метод класса String, система создает новый объект в памяти с выделением ему достаточного места.
Объект класса StringBuilder представляет собой динамическую строку. При создании строки StringBuilder выделяет памяти больше, чем необходимо этой строке, а при добавлении к ней каких-либо элементов строка не пересоздается заново. В том случае если выделенной памяти не будет хватать для добавления новых элементов, то емкость объекта будет увеличена.
Какие типы можно использовать в предложении foreach?
Сразу к сути — можно использовать типы, которые реализуют интерфейс IEnumerable или IEnumerable. Либо же любые типы, которые удовлетворяют следующим условиям:
✍🏻 Включают открытый метод GetEnumerator без параметров с классом, структурой или тип интерфейсом в качестве возвращаемого значения;
✍🏻 Тип возвращаемого значения метода GetEnumerator должен содержать открытое свойство Current и открытый метод MoveNext без параметров с типом возвращаемого значения Boolean.
Сразу к сути — можно использовать типы, которые реализуют интерфейс IEnumerable или IEnumerable. Либо же любые типы, которые удовлетворяют следующим условиям:
✍🏻 Включают открытый метод GetEnumerator без параметров с классом, структурой или тип интерфейсом в качестве возвращаемого значения;
✍🏻 Тип возвращаемого значения метода GetEnumerator должен содержать открытое свойство Current и открытый метод MoveNext без параметров с типом возвращаемого значения Boolean.
Forwarded from Библиотека шарписта | C#, F#, .NET, ASP.NET
📖 ТОП-7 книг по C# для начинающих разработчиков в 2024 году
Начинаете изучать C#? Мы подобрали для вас 7 лучших книг, которые помогут освоить язык и стать успешным разработчиком (внутри есть ссылки для скачивания).
🔗 Читать статью
🔗 Зеркало
Начинаете изучать C#? Мы подобрали для вас 7 лучших книг, которые помогут освоить язык и стать успешным разработчиком (внутри есть ссылки для скачивания).
🔗 Читать статью
🔗 Зеркало
Можно ли запретить наследование от какого-то класса?
Да, можно. Для того, чтобы запретить наследоваться от класса необходимо объявить его с модификатором sealed.
Например, если мы не хотим чтобы от класса SomeClass можно было наследоваться, то объявляем его так:
sealed class SomeClass
{
// Объявление класса
}
В качестве альтернативы, можно запретить и создание экземпляров этого класса с помощью ключевого слова static (под капотом, будет использована пара модификаторов: abstract sealed).
static class Helper
{
// допустимы лишь статические методы
}
Да, можно. Для того, чтобы запретить наследоваться от класса необходимо объявить его с модификатором sealed.
Например, если мы не хотим чтобы от класса SomeClass можно было наследоваться, то объявляем его так:
sealed class SomeClass
{
// Объявление класса
}
В качестве альтернативы, можно запретить и создание экземпляров этого класса с помощью ключевого слова static (под капотом, будет использована пара модификаторов: abstract sealed).
static class Helper
{
// допустимы лишь статические методы
}
Разница между LINQ lazy loading и eager loading
В случае lazy loading зависимые таблицы (дочерние объекты) не загружаются автоматически с родительскими, а загрузятся в тот момент, когда они понадобятся. В LINQ по умолчанию используется lazy loading.
В случае eager loading зависимые объекты загружаются автоматически с родительской таблицей. Для того, чтобы использовать eager loading, нужно применить метод Include().
В случае lazy loading зависимые таблицы (дочерние объекты) не загружаются автоматически с родительскими, а загрузятся в тот момент, когда они понадобятся. В LINQ по умолчанию используется lazy loading.
В случае eager loading зависимые объекты загружаются автоматически с родительской таблицей. Для того, чтобы использовать eager loading, нужно применить метод Include().
Различия между интерфейсом и абстрактным классом в .NET
Интерфейс просто объявляет поведение, которым должны обладать реализующие классы. Он объявляет только свойства, методы и события без модификаторов доступа. Все объявленные члены должны быть реализованы.
Абстрактный класс предоставляет частичную реализацию функциональности и некоторые абстрактные/виртуальные члены, которые должны быть реализованы сущностями, которые наследуют класс. Он также объявляет поля.
Интерфейс и абстрактный класс не могут быть инстанцированы.
Интерфейс просто объявляет поведение, которым должны обладать реализующие классы. Он объявляет только свойства, методы и события без модификаторов доступа. Все объявленные члены должны быть реализованы.
Абстрактный класс предоставляет частичную реализацию функциональности и некоторые абстрактные/виртуальные члены, которые должны быть реализованы сущностями, которые наследуют класс. Он также объявляет поля.
Интерфейс и абстрактный класс не могут быть инстанцированы.
В чём разница между System.Array.CopyTo() и System.Array.Clone()?
Метод System.Array.CopyTo() выполняет глубокое копирование, копируя не только элементы самого массива, но и все объекты, на которые указывают ссылки в этих элементах. Это означает, что все связанные объекты также будут скопированы.
В отличие от этого, метод System.Array.Clone() выполняет поверхностное копирование. При этом копируются только сами элементы массива, независимо от их типа (значение или ссылка). При этом объекты, на которые указывают ссылки, не копируются, а копируются только сами ссылки, точно так же, как и в исходном массиве.
Ещё пара отличий между методами:
System.Array.CopyTo() требует наличия выходного массива, тогда как System.Array.Clone() создает новый массив.
System.Array.CopyTo() позволяет указывать индекс элемента, начиная с которого производить копирование.
Метод System.Array.CopyTo() выполняет глубокое копирование, копируя не только элементы самого массива, но и все объекты, на которые указывают ссылки в этих элементах. Это означает, что все связанные объекты также будут скопированы.
В отличие от этого, метод System.Array.Clone() выполняет поверхностное копирование. При этом копируются только сами элементы массива, независимо от их типа (значение или ссылка). При этом объекты, на которые указывают ссылки, не копируются, а копируются только сами ссылки, точно так же, как и в исходном массиве.
Ещё пара отличий между методами:
System.Array.CopyTo() требует наличия выходного массива, тогда как System.Array.Clone() создает новый массив.
System.Array.CopyTo() позволяет указывать индекс элемента, начиная с которого производить копирование.
Где использовать StringBuilder вместо String?
StringBuilder даёт преимущество только при множестве операций на изменение строки. Например при наращивании строки в цикле. Во всех остальных случаях StringBuilder медленнее и требует больше памяти. Кроме того, он не является потокобезопасным, в отличии от String.
StringBuilder даёт преимущество только при множестве операций на изменение строки. Например при наращивании строки в цикле. Во всех остальных случаях StringBuilder медленнее и требует больше памяти. Кроме того, он не является потокобезопасным, в отличии от String.