Каково минимальное знание CLR, программист .NET должен быть хорошим программистом?

Когда мы говорим о мире .NET, CLR - это то, от чего зависит все, что мы делаем. Каково минимальное знание CLR, программист .NET должен быть хорошим программистом? Можете ли вы дать мне один/много, которые, по вашему мнению, являются/являются наиболее важными темами: GC?, AppDomain?, Threads?, Processes?, Assemblies/Fusion?

Я очень буду признателен, если вы разместите ссылки на статьи, блоги, книги или другое по теме, где можно найти дополнительную информацию.

Обновление: я заметил из некоторых комментариев, что мой вопрос не ясен для некоторых. Когда я говорю CLR, я не имею в виду .NET Framework. Это НЕ о том, чтобы запомнить библиотеки .NET, а скорее понять, как работает среда исполнения (в которой живут эти библиотеки во время выполнения).

Мой вопрос был непосредственно вдохновлен Джоном Роббинсом, автором книги "Отладка приложений для Microsoft®.NET" (которую я рекомендую), и коллега здесь привел Джеффри Рихтера в Wintellect. В одной из вводных глав он говорит, что "... любой .NET-программист должен знать, что такое зондирование и как сборки загружаются во время выполнения". Вы думаете, что есть другие подобные вещи?

Последнее обновление: прочитав первые 5 глав "CLR через С#", я должен сказать всем, кто это читает. Если вы еще не готовы, прочитайте эту книгу!

Ответы

Ответ 1

Большинство из них намного глубже, чем то, что многие разработчики падают в моем опыте. Большинство непонятых (и важных) аспектов в моем опыте:

  • Типы значений по сравнению с ссылочными типами
  • Переменные против объектов
  • Передать по ссылке vs pass по значению
  • Делегаты и события
  • Отличие между языком, временем выполнения и структурой
  • Бокс
  • Сбор мусора

На фронте "переменные против объектов" представлены три описания кода

string x = "hello";
  • (Очень плохо) x - строка с 5 буквами
  • (Чуть лучше) x - ссылка на строку с 5 буквами
  • (Правильно) Значение x является ссылкой на строку с 5 буквами

Очевидно, что первые два в порядке "случайного" разговора, но только если все участники понимают реальную ситуацию.

Ответ 2

Обновлено: чтение соответствующих частей книги CLR через С# Джеффри Рихтера.. эта книга может быть хорошей ссылкой..

Ответ 3

Отличный программист не может быть измерен количеством вещей, которые он знает о CLR. Уверен, это хорошее начало, но он также должен знать OOP/D/A и многие другие вещи, такие как шаблоны проектирования, лучшие практики, концепции O/RM и т.д.

Факт: я бы сказал, что "отличный программист .Net" не обязательно должен много знать о CLR, если у него есть большие знания об общей теории и концепциях программирования...

Я предпочел бы нанять "отличного разработчика Java" с большими знаниями и опытом в Java для .NET-заданий, а затем "мастером" в .NET, у которого мало опыта и считает, что O/RM является биржевым тикером и хранимыми процедурами являются отличным способом "абстрагироваться от базы данных"...

Я видел, как профессиональные учителя в .Net полностью терпят неудачу в выполнении действительно простых вещей, не нарушая их спины из-за отсутствия "общих знаний", в то время как они в то же время "знают все", что нужно знать о .Net и CLR...

Ответ 4

Должны знать о управлении памятью, делегатах

Ответ 5

Ответ на Jon, кажется, довольно полный для меня (плюс делегаты), но я думаю, что принципиально отделяет хорошего программиста от среднего, отвечающего на вопросы, а не на то, как. Замечательно знать, как работают сборки мусора и как используются типы значений и ссылочные типы, но это целый другой уровень, чтобы понять, когда использовать тип значения по сравнению с ссылочным типом. Это различие между разговором на языке и выражением речи на языке (все это о том, как мы применяем знания, которые у нас есть, и как мы достигаем этих решений).

Ответ 6

Джон ответил хорошо. Все это довольно простые, но важные области, о которых многие разработчики не очень хорошо понимают. Я думаю, что знание различия между значениями и ссылочными типами связано с базовым пониманием того, как ведет себя GC в .NET, но, что более важно, важно хорошее понимание шаблона Dispose.

Остальные области, о которых вы упоминаете, являются либо очень глубокими знаниями о самой CLR, либо более продвинутых концепциях, которые пока не широко используются (пока). [.NET 4.0 начнет изменять некоторые из них с введением параллельных расширений и MEF.]

Ответ 7

Одна вещь, которая может быть очень сложной, - это отсроченное исполнение и подобные.

Как вы объясните, как работает метод, возвращающий IEnumerable? Что действительно делает делегат? такие вещи.