Pull to refresh

Ответы на «Вопросы по .Net»

Reading time2 min
Views1.1K
В своём посте ПОСТ я задал несколько вопросов по .NET и clr и пообещал на них ответить. Отвечаю:

1) Когда при создании экземпляра типа не будет вызываться конструктор?
Мне известно 2 случая: при десереализации объекта и при копировании объекта с помощью метода MemberwiseClone объекта Object

2) Как интерпретирует компилятор c# модификатор static перед классом (в IL коде)?
в IL коде будет примерно следущее:
class public abstract auto ansi sealed beforefieldinit.
кроме того, компилятор так же не создаст в классе метод конструктора

3) Какой модификатор доступа к полям и методам не реализует c#, но реализует IL код?
family and assembly — доступен только методам в определяющем типе (и вложенным в него типам) и производных типах в определяющей сборке

4) А знаете ли вы как в C# объявить Union (сымитировать)? Т.е. сделать так, чтобы несколько полей начинались по одному смещению в памяти.
[StructLayout(LayoutKind.Explicit)]
internal struct SomeValType {
[FieldOffset(O)] Byte b; // Поля b и х перекрываются
[FieldOffset(O)] Int16 x; // в экземплярах этого класса.
}


5) Задумывались ли вы почему для значимых типов (struct) нельзя определить конструктор без параметров (в C#)? А можно ли это обойти? :)
C# не позволяет определять для значимых типов конструкторы без параметров, чтобы не вводить разработчиков в заблуждение относительно того, какой конструктор вызывается (тот котороый инициализирует всё нулями, или наш)
На IL в отличие от c# можно определить такой конструктор. (как он будет работать — это уже другой вопрос)

6) Если мы поставили клиенту код где в типе были определены поля, клиент написал на основе нашего кода свой код, затем мы поставили клиенту новую версию нашего кода где поля заменены на свойства, то что может сломаться в коде у клиента?
Конечно же, в первую очередь, перестанут компилироваться все методы, где параметрами были поля (а ныне свойства) с out или ref… Кроме того —
свойство может быть только для чтения,
метод свойства может привести к исключению,
метод свойства может выполняться долго,
при вызове несколько ряд подряд свойство может возвращать разные значения (4Ex.:DateTime.Now)
кроме того, если Вы использовали reflection то при биндинге тоже будет ексепшн.

7) Все обработчики событий должны возвращать void… Следует ли майкрософт своему требованию в библиотеке FCL? :))
Действительно, такое требование заложено в механизм событий. Это обязательно, т.к. когда возникает событие может сработать несколько методов обратного вызова и будет невозможно получить у них возвращаемое значение.
Microsoft, как всегда, в своём духе — своим же рекомендациям не следует — пример обработчик событий ResolveEventHandler, возвращающий объект типа Assembly. (пруф линк: ТЫЦ)

P.S. Вопросы и ответы подготовлены по книге CLR via C# Джеффри Рихтера…
Tags:
Hubs:
Total votes 23: ↑16 and ↓7+9
Comments13

Articles