Наследование и внутреннее представление

Я получил следующий вопрос: class Alpha<X>    where X : class  {} class Bravo<T, U>    where T : class    where U : T  {   Alpha<U> alpha; } При компиляции этого кода выдается ошибка, в которой говорится, что тип U не может использоваться в качестве аргумента типа для Alpha, поскольку U не является…

0

Упаковывать или не упаковывать, вот в чем вопрос

Предположим, что у нас есть неизменяемый значимый тип (value type), который реализует интерфейс IDisposable. Предположим, он представляет собой некоторый дескриптор. struct MyHandle : IDisposable { public MyHandle(int handle) : this() { this.Handle = handle; } public int Handle { get; private set; } public void Dispose() { Somehow.Close(this.Handle); } } Вы можете размышлять следующим образом,…

0

Разоблачение другого мифа о значимых типах

Вот еще один миф о значимых типах, который я иногда слышу: "Очевидно, использование оператора new со ссылочным типом приводит к выделению памяти в куче. Но значимый тип потому и называется значимым, что хранит значение, а не ссылку на него. Таким образом, с помощью оператора new, примененного к значимому типу не выделяется дополнительной памяти. Точнее, используется…

2

Правда о значимых типах

Если вы читаете мой блог какое-то время, то вы должны знать, что меня беспокоит миф о том, что «значимые типы (value types) располагаются в стеке». К сожалению, в нашей собственной документации, так и во многих книгах, существует масса примеров прямо или косвенно поддерживающих этот миф. Я выступаю против него по нескольким причинам: 1. Обычно он…

2

Аномалия инициализации

Дополнение: Я выяснил, что эта проблема значительно более загадочна, чем изначально думал исходя из отчета об ошибке. Я переписал примеры в этой статье, поскольку предыдущие примеры на самом деле не иллюстрировали ошибку. Рассмотрим следующий код: struct S { private string blah; public S(string blah) { this.blah = blah; } public void Frob() { // что…


Всегда пишите спецификацию. Часть 2

Во время просмотра спецификации, даже не глядя на мой код, Крис нашел ошибку и упущение. Упущение состояло в том, что я не сказал, что будет в случае передачи в качестве ref-параметра индекса массива фиксированной длины. Как выяснилось, этот случай сводится к разыменовыванию указателя в тот момент, когда мы достигаем этой точки в коде, поэтому это…


Не всё наследуется от object

Я слышу много мифов о C#. Обычно в мифах есть крупица истины, например «типы-значения всегда размещаются на стеке». Если вы замените «всегда» на «иногда», то некорректное мифическое утверждение станет корректным. Миф, который я слышу особенно часто – «в C# все типы наследуются от object». Неправда! Во-первых, никакие типы-указатели ни унаследованы от object, ни совместимы с…


Null – не то же самое, что Empty

Когда я начал этот блог в 2003 году, один из первых постингов был про отличия между Null, Empty и Nothing в VBScript. Цитата: Предположим, у вас есть база данных с отчетами о продажах, и вы спрашиваете её: «какова сумма всех продаж в августе?» Но один из менеджеров еще не отправил свой отчёт об августовских продажах….