Пример ответа
Коротко: В C# я работаю с широким спектром типов данных, включая встроенные примитивы, пользовательские структуры и ссылочные типы, что позволяет эффективно управлять памятью и логикой приложений.
- int
- long
- float
- double
- decimal
- bool
- char
- string
- object
- dynamic
- enum
- struct
- class
- interface
- delegate
- array
- List<T>
- Dictionary<TKey, TValue>
- Tuple
- Nullable<T>
- var
- record
- Span<T>
- Memory<T>
Ключевые идеи:
- В C# типы данных делятся на значимые (value types) и ссылочные (reference types), что влияет на хранение в памяти и поведение при присваивании.
- Я использую обобщённые типы (generics) для создания гибких и типобезопасных коллекций, таких как List<T> и Dictionary<TKey, TValue>.
- Для работы с современными паттернами применяю record для неизменяемых данных и nullable reference types для предотвращения null-исключений.
Пример: Например, для хранения данных пользователя я могу определить record User(string Name, int Age), а для вычислений использовать decimal для финансовых операций, чтобы избежать ошибок округления.
Пример использования различных типов данных в C# для бэкенд-приложения
csharp
using System;
using System.Collections.Generic;
namespace DataTypesExample
{
// Значимый тип (value type)
public struct Point
{
public int X;
public int Y;
}
// Ссылочный тип (reference type) как record для неизменяемости
public record User(string Name, int Age);
class Program
{
static void Main()
{
// Примитивные типы
int count = 10;
double price = 19.99;
bool isActive = true;
string message = "Hello, C#!";
// Nullable тип
int? nullableInt = null;
if (nullableInt.HasValue)
Console.WriteLine($"Value: {nullableInt.Value}");
// Обобщённая коллекция
List<User> users = new List<User>
{
new User("Alice", 30),
new User("Bob", 25)
};
// Словарь (Dictionary)
Dictionary<string, int> scores = new Dictionary<string, int>
{
["Alice"] = 95,
["Bob"] = 87
};
// Использование struct
Point p = new Point { X = 5, Y = 10 };
Console.WriteLine($"Point: ({p.X}, {p.Y})");
// Динамический тип
dynamic dynamicVar = "I can be anything";
dynamicVar = 42; // Теперь это int
// Вывод
foreach (var user in users)
Console.WriteLine($"User: {user.Name}, Age: {user.Age}");
}
}
}
Вопросы для интервьюера:
- Как вы выбираете между struct и class в C#? — Я использую struct для небольших, неизменяемых данных, где важна производительность, и class для сложных объектов с поведением и наследованием.
- Какие преимущества дают обобщённые типы (generics) в бэкенд-разработке? — Generics обеспечивают типобезопасность, уменьшают дублирование кода и повышают производительность, избегая упаковки/распаковки.
Практический совет (на неделю):
- Для финансовых расчётов всегда используйте decimal вместо float или double, чтобы избежать ошибок с плавающей точкой.
- Применяйте record для DTO и моделей в API, чтобы упростить сравнение и сериализацию данных.
C# Backend
Общий
33%