C# C#  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Сложный  · 

Атрибуты и рефлексия

Проверяет атрибуты, метаданные и рефлексию на создании объектов, поиске членов и динамическом вызове. Помимо синтаксиса, рассматриваются стоимость, кэширование, trimming/AOT и безопасность, когда имя типа или метода приходит извне.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 25
Что делает пользовательский атрибут сам по себе?
C#
[Audit]
public void Save()
{
    repository.Commit();
}
Вопрос 2 из 25
Для чего AttributeUsage?
C#
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
sealed class AuditAttribute : Attribute { }
Вопрос 3 из 25
Чем positional argument атрибута отличается от named?
Вопрос 4 из 25
Почему значение аргумента атрибута ограничено?
C#
[Route("/orders")]
public sealed class OrdersEndpoint { }

[Tag(DateTime.Now)]
public sealed class RecentEndpoint { }
Вопрос 5 из 25
Когда AllowMultiple=true оправдан?
Вопрос 6 из 25
Чем typeof(Base) отличается от obj.GetType()?
C#
Base obj = new Derived();
Console.WriteLine(typeof(Base) == obj.GetType());
Вопрос 7 из 25
Что случится при obj.GetType(), если obj null?
C#
object? value = null;
var type = value.GetType();
Вопрос 8 из 25
Как проверить, можно ли присвоить объект типа candidate переменной IService?
C#
if (typeof(IService).IsAssignableFrom(candidateType))
    Register(candidateType);
Вопрос 9 из 25
Что возвращает typeof(List<>).IsGenericTypeDefinition?
Вопрос 10 из 25
Зачем указывать BindingFlags.NonPublic | BindingFlags.Instance?
C#
var field = type.GetField("_state",
    BindingFlags.NonPublic | BindingFlags.Instance);
Вопрос 11 из 25
Что требуется обычному ссылочному типу при вызове Activator.CreateInstance(type) без аргументов?
Вопрос 12 из 25
Какой объект создаст Activator.CreateInstance в этом примере?
C#
var value = Activator.CreateInstance(typeof(List<int>));
Вопрос 13 из 25
Почему Activator не заменяет DI-контейнер?
Вопрос 14 из 25
Как проявится исключение внутри ConstructorInfo.Invoke?
C#
try { ctor.Invoke(args); }
catch (TargetInvocationException ex) when (ex.InnerException is not null)
{
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}
Вопрос 15 из 25
Как ускорить многократное создание одного типа?
C#
var newExpr = Expression.New(ctor);
var factory = Expression.Lambda<Func<object>>(
    Expression.Convert(newExpr, typeof(object))).Compile();
Вопрос 16 из 25
Что обычно дороже обычного виртуального/делегатного вызова?
Вопрос 17 из 25
Что кэшировать при повторной сериализации одного типа?
C#
private static readonly ConcurrentDictionary<Type, PropertyAccessor[]> Cache = new();
var accessors = Cache.GetOrAdd(type, BuildAccessors);
Вопрос 18 из 25
Почему reflection может сломаться после trimming?
Вопрос 19 из 25
Когда source generator лучше reflection?
Вопрос 20 из 25
Почему нельзя разрешать пользователю произвольное имя private-метода для Invoke?
C#
var method = typeof(AdminCommands).GetMethod(
    commandName,
    BindingFlags.Instance | BindingFlags.NonPublic);

method!.Invoke(commands, null);
Вопрос 21 из 25
Какой тест точнее всего проверит запрет нескольких экземпляров атрибута?
Вопрос 22 из 25
Какой интеграционный тест нужен для reflection-плагина?
C#
var path = BuildPluginAssembly();
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(path);
var plugins = discovery.Find(assembly);
Assert.Single(plugins);
Вопрос 23 из 25
Как обнаружить проблему trimming до выпуска?
Вопрос 24 из 25
Что записывать при неудачной активации типа?
C#
log.LogError(ex,
    "Plugin activation failed: {PluginType} from {Assembly} at {Stage}",
    type.FullName, type.Assembly.GetName().Name, "constructor");
Вопрос 25 из 25
Как сравнить reflection и скомпилированный accessor честно?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу