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.
⌨️ Полный курс по C#
Большой плейлист для изучения C#, состоящий из средних и коротких по длительности роликов. Как и полагается всем подобным курсам, автор подробно разбирает все аспекты программирования на C# для новичков.
Вы узнаете, как установить и настроить Visual Studio, разберётесь с основным синтаксисом языка и даже сможете написать свою собственную программу спустя какое-то время.
1. Введение — [9:33]
2. Установка Visual Studio — [8:42]
3. Структура проекта — [17:42]
4. Типы данных — [13:58]
5. Переменные в C# — [20:54]
Перейти к плейлисту
Большой плейлист для изучения C#, состоящий из средних и коротких по длительности роликов. Как и полагается всем подобным курсам, автор подробно разбирает все аспекты программирования на C# для новичков.
Вы узнаете, как установить и настроить Visual Studio, разберётесь с основным синтаксисом языка и даже сможете написать свою собственную программу спустя какое-то время.
1. Введение — [9:33]
2. Установка Visual Studio — [8:42]
3. Структура проекта — [17:42]
4. Типы данных — [13:58]
5. Переменные в C# — [20:54]
Перейти к плейлисту
Потокобезопасен ли List?
Нет, List не потокобезопасен.
Самый простой способ сделать его таким — это блокировать доступ к базовым коллекциям (читать и писать) с помощью lock.
Нет, List не потокобезопасен.
Самый простой способ сделать его таким — это блокировать доступ к базовым коллекциям (читать и писать) с помощью lock.
Что такое Boxing и Unboxing?
Упаковка представляет собой процесс неявный преобразования типа значения (хранящегося в стеке) в тип object. Когда тип значения упаковывается средой CLR, она создает оболочку значения внутри System.Object и сохраняет ее в управляемой куче.
Обратная операция распаковки осуществляется явным преобразованием object в тип значения. Если упакованный объект не соответствует требуемому типу, то выбрасывается исключение InvalidCastException.
Упаковка представляет собой процесс неявный преобразования типа значения (хранящегося в стеке) в тип object. Когда тип значения упаковывается средой CLR, она создает оболочку значения внутри System.Object и сохраняет ее в управляемой куче.
Обратная операция распаковки осуществляется явным преобразованием object в тип значения. Если упакованный объект не соответствует требуемому типу, то выбрасывается исключение InvalidCastException.
Когда следует использовать .NET Web Forms вместо ASP.NET MVC?
.NET Framework традиционно был основан на веб-формах, представляя собой попытку создания веб-служб с использованием инструментов Microsoft Visual Studio Tools, чтобы избежать необходимости изучения новых языков сценариев. Веб-формы позволяли разработчикам создавать быстрые и простые приложения, а некоторые устаревшие системы продолжали использовать этот подход.
Однако с появлением ASP.NET MVC стандартом становится использование этой архитектуры среди современных разработчиков. На собеседовании по .NET кандидаты должны уметь выделить преимущества модели-представления-контроллера (MVC). Основным преимуществом MVC является возможность разделения приложения на отдельные модели, представления и контроллеры, что значительно облегчает их тестирование во время разработки.
.NET Framework традиционно был основан на веб-формах, представляя собой попытку создания веб-служб с использованием инструментов Microsoft Visual Studio Tools, чтобы избежать необходимости изучения новых языков сценариев. Веб-формы позволяли разработчикам создавать быстрые и простые приложения, а некоторые устаревшие системы продолжали использовать этот подход.
Однако с появлением ASP.NET MVC стандартом становится использование этой архитектуры среди современных разработчиков. На собеседовании по .NET кандидаты должны уметь выделить преимущества модели-представления-контроллера (MVC). Основным преимуществом MVC является возможность разделения приложения на отдельные модели, представления и контроллеры, что значительно облегчает их тестирование во время разработки.
В чем разница между .NET и Laravel?
Большинство специалистов в области веб-разработки имеют представление о различных фреймворках, таких как Laravel, и могут провести сравнение между этими платформами и .NET. Обсуждение этих различий может помочь понять интересы кандидатов и их взгляд на роль разработчика .NET. Например, они могут обратить внимание на:
✍🏻 Языки (например, поддержка C # в .NET по сравнению с поддержкой PHP в Laravel)
✍🏻 Безопасность
✍🏻 Интеграция .NET с Visual Studio
✍🏻 Сторонние библиотеки
✍🏻 Поддержка сообщества разработчиков ПО с открытым исходным кодом
Большинство специалистов в области веб-разработки имеют представление о различных фреймворках, таких как Laravel, и могут провести сравнение между этими платформами и .NET. Обсуждение этих различий может помочь понять интересы кандидатов и их взгляд на роль разработчика .NET. Например, они могут обратить внимание на:
✍🏻 Языки (например, поддержка C # в .NET по сравнению с поддержкой PHP в Laravel)
✍🏻 Безопасность
✍🏻 Интеграция .NET с Visual Studio
✍🏻 Сторонние библиотеки
✍🏻 Поддержка сообщества разработчиков ПО с открытым исходным кодом
Что такое рефлексия в С#?
Это процесс описания метаданных типов, методов и полей в коде. Пространство имен System.Reflection позволяет получать данные о загруженных сборках, элементах внутри них, таких как классы, методы и типы значений.
Это процесс описания метаданных типов, методов и полей в коде. Пространство имен System.Reflection позволяет получать данные о загруженных сборках, элементах внутри них, таких как классы, методы и типы значений.
Что такое данные JSON и как разработчики .NET могут работать с JSON?
JSON (JavaScript Object Notation) позволяет разработчикам упорядочивать и хранить данные для легкого доступа и чтения. Для разработчиков JSON является важным инструментом, так как позволяет управлять JSON-потоками с других сайтов и загружать их быстрее и проще, чем через каналы SML / RSS. Json.NET предоставляет возможность разработчикам .NET определять классы, которые могут анализировать объекты и массивы из текста JSON. Также Json.NET можно использовать для сериализации типов значений в текстовый формат JSON. Json.NET совместим с .NET2, .NET3 и .NET4.
JSON (JavaScript Object Notation) позволяет разработчикам упорядочивать и хранить данные для легкого доступа и чтения. Для разработчиков JSON является важным инструментом, так как позволяет управлять JSON-потоками с других сайтов и загружать их быстрее и проще, чем через каналы SML / RSS. Json.NET предоставляет возможность разработчикам .NET определять классы, которые могут анализировать объекты и массивы из текста JSON. Также Json.NET можно использовать для сериализации типов значений в текстовый формат JSON. Json.NET совместим с .NET2, .NET3 и .NET4.
Что выведет в консоль следующая программа и почему?
Ответ:
Программа не скомпилируется, поскольку переменная name, к которой мы хотим обратиться в методе Main, не имеет модификаторов. Следовательно, по умолчанию она имеет модификатор доступа private. Поэтому вне класса Person к этой переменной мы обратиться не можем.
Ответ:
Программа не скомпилируется, поскольку переменная name, к которой мы хотим обратиться в методе Main, не имеет модификаторов. Следовательно, по умолчанию она имеет модификатор доступа private. Поэтому вне класса Person к этой переменной мы обратиться не можем.
Как вы подходите к оптимизации производительности в Unity для мобильных устройств, учитывая ограничения аппаратного обеспечения и разнообразие экосистемы устройств?
Для оптимизации производительности в Unity для мобильных устройств, важно сосредоточиться на следующих аспектах:
Оптимизация ресурсов: Сжатие текстур и мешей, использование LOD (Level of Detail) для уменьшения детализации объектов на расстоянии и оптимизация ассетов для уменьшения загрузки на GPU.
Эффективное использование освещения: Использование статического и запекаемого освещения вместо динамического, что снижает нагрузку на процессор.
Оптимизация скриптов: Минимизация использования операций Update() и FixedUpdate(), оптимизация алгоритмов и структур данных.
Пакетная обработка и куллинг: Использование пакетной обработки для уменьшения количества draw calls и эффективный куллинг для исключения не видимых объектов из рендеринга.
Тестирование и профилирование: Регулярное использование профилировщика Unity для выявления и устранения узких мест производительности.
Адаптация к различным устройствам: Создание различных профилей графических настроек для адаптации к разным классам устройств, учитывая их аппаратные возможности.
Для оптимизации производительности в Unity для мобильных устройств, важно сосредоточиться на следующих аспектах:
Оптимизация ресурсов: Сжатие текстур и мешей, использование LOD (Level of Detail) для уменьшения детализации объектов на расстоянии и оптимизация ассетов для уменьшения загрузки на GPU.
Эффективное использование освещения: Использование статического и запекаемого освещения вместо динамического, что снижает нагрузку на процессор.
Оптимизация скриптов: Минимизация использования операций Update() и FixedUpdate(), оптимизация алгоритмов и структур данных.
Пакетная обработка и куллинг: Использование пакетной обработки для уменьшения количества draw calls и эффективный куллинг для исключения не видимых объектов из рендеринга.
Тестирование и профилирование: Регулярное использование профилировщика Unity для выявления и устранения узких мест производительности.
Адаптация к различным устройствам: Создание различных профилей графических настроек для адаптации к разным классам устройств, учитывая их аппаратные возможности.
Объясните разницу между стеком и очередью
Этот вопрос на собеседовании по .NET направлен на оценку базовых знаний кандидатов о работе с коллекциями. В эту категорию входят стеки, очереди, хеш-таблицы, пакеты, словари и списки. Стек используется для отслеживания и обработки значений по принципу LIFO (Last-In, First-Out), где последний добавленный элемент будет первым удаленным.
С другой стороны, очередь оперирует элементами по принципу FIFO (First-In, First-Out), где первый добавленный элемент будет первым удаленным. В очереди элементы добавляются с задней стороны и удаляются с передней стороны.
Этот вопрос на собеседовании по .NET направлен на оценку базовых знаний кандидатов о работе с коллекциями. В эту категорию входят стеки, очереди, хеш-таблицы, пакеты, словари и списки. Стек используется для отслеживания и обработки значений по принципу LIFO (Last-In, First-Out), где последний добавленный элемент будет первым удаленным.
С другой стороны, очередь оперирует элементами по принципу FIFO (First-In, First-Out), где первый добавленный элемент будет первым удаленным. В очереди элементы добавляются с задней стороны и удаляются с передней стороны.