Ответы на вопросы для собеседования о C# и .NET
Какие типы данных есть в C#?
bool
(System.Boolean): true/false.
byte
(System.Byte): целое число от 0 до 255, занимает 1 байт.
sbyte
(System.SByte): целое число от -128 до 127, занимает 1 байт.
short
(System.Int16): целое число от -32768 до 32767, занимает 2 байта.
ushort
(System.UInt16): целое число от 0 до 65535, занимает 2 байта.
int
(System.Int32): целое число от -2147483648 до 2147483647, занимает 4 байта.
uint
(System.UInt32): целое число от 0 до 4294967295, занимает 4 байта.
long
(System.Int64): целое число от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, занимает 8 байт.
ulong
(System.UInt64): целое число от 0 до 18 446 744 073 709 551 615, занимает 8 байт.
float
(System.Single): число с плавающей точкой от -3.4*1038 до 3.4*1038, занимает 4 байта.
double
(System.Double): число с плавающей точкой от ±5.0*10-324 до ±1.7*10308, занимает 8 байта.
decimal
(System.Decimal): десятичное дробное число. Если употребляется без десятичной запятой, имеет значение от ±1.0*10-28 до ±7.9228*1028, может хранить 28 знаков после запятой, занимает 16 байт.
char
(System.Char): одиночный символ в кодировке Unicode, занимает 2 байта.
string
(System.String): набор символов Unicode.
object
(System.Object): значение любого типа данных, занимает 4 байта на 32-разрядной платформе и 8 байт на 64-разрядной платформе.
Что такое System.Object?
Все классы в .NET, даже те, которые мы сами создаем, а также базовые типы, такие как System.Int32
, являются неявно производными от класса System.Object
. Даже если мы не указываем класс System.Object
в качестве базового, по умолчанию он всё равно стоит на вершине иерархии наследования. Поэтому все типы и классы могут реализовать те методы, которые определены в System.Object
, а именно:
1. ToString
служит для получения строкового представления данного объекта.
2. GetHashCode
позволяет возвратить некоторое числовое значение, которое будет соответствовать данному объекту или его хэш-код.
3. GetType
позволяет получить тип данного объекта.
4. Equals
позволяет сравнить два объекта на равенство.
Какие операции со строками вы знаете?
1. Конкатенация - string.Concat(s1, s2)
2. Сравнение - string.Compare(s1, s2)
3. Поиск в строке - s1.IndexOf(char)
4. Разбитие/разделение - s1.Split(new char[] { char })
5. Обрезка - s1.Trim()
или s1..Trim(new char[] { char1, char2 })
6. Вставка - s1.Insert(index, substring)
7. Удаление части строки - s1.Remove(index, count)
8. Замена - s1.Replace(a, b)
9. Смена регистра - s1.ToLower()
и s1.ToUpper()
Какие модификаторы доступа есть в C#?
Все типы и члены типов имеют уровень доступности. Он определяет возможность их использования из другого кода в вашей или в других сборках. Сборка — это .dll или .exe, созданные путем компиляции одного или нескольких CS-файлов в одной компиляции. Следующие модификаторы доступа позволяют указать доступность типа или члена при объявлении:
public
: доступ к типу или члену возможен из любого другого кода в той же сборке или другой сборке, ссылающейся на него. Уровень доступности общедоступных элементов типа определяется уровнем доступности самого типа.
private
: доступ к типу или члену возможен только из кода в том же объекте class
или struct
.
protected
: доступ к типу или члену возможен только из кода в том же объекте class
, либо в class
, производном от этого class
.
internal
: доступ к типу или члену возможен из любого кода в той же сборке, но не из другой сборки. Другими словами, internal
доступ к типам или членам можно получить из кода, который является частью той же компиляции.
protected internal
: доступ к типу или члену возможен из любого кода в той сборке, где он был объявлен, или из производного class
в другой сборке.
private protected
: доступ к типу или элементу возможен из типов, производных от объекта class
и объявляемых в сборке, содержащей этот объект.
В чём разница между const и readonly?
Значение const
фиксируется на этапе компиляции и не может быть изменено во время исполнения кода.
Значение readonly
фиксируется на этапе исполнения в конструкторе класса. Из конструктора может меняться и многократно.
Поддерживает ли C# множественное наследование?
С# поддерживает множественное наследование в виде наследования от класса и нескольких интерфейсов, или просто от нескольких интерфейсов. Но не поддерживает наследование от нескольких классов.
Как запретить наследование от класса?
Для этого служит ключевое слово sealed
.
Можно ли разрешить наследование класса, но запретить перекрытие метода?
Да. Указываем класс как public
, а метод как sealed
.
Разница между управляемым и неуправляемым кодом?
Управляемый код – это код, созданный компилятором .NET. Он не зависит от архитектуры целевой машины, поскольку выполняется CLR (Common Language Runtime), а не самой операционной системой. CLR и управляемый код предлагают разработчикам несколько преимуществ, таких как сборка мусора, проверка типов и обработка исключений. С другой стороны, неуправляемый код напрямую компилируется в родной машинный код и зависит от архитектуры целевой машины. Он выполняется непосредственно операционной системой. В неуправляемом коде разработчик должен убедиться, что он вручную решает вопросы использования и выделения памяти (особенно из-за утечек памяти), безопасности типов и исключений. В .NET компилятор Visual Basic и C# создает управляемый код. Чтобы получить неуправляемый код, приложение должно быть написано на C или C++.