«Если я вызываю Dispose (), вызывает ли он Close ()?»
По идее, так и должно быть. Все классы BCL делают это, но автор библиотеки должен правильно обработать это. Если используемая библиотека выполнена правильно, Dispose () также должен закрыть () [и Close () будет Dispose () - вызовы должны быть взаимозаменяемыми].
"Если я хочу использовать объект (скажем, SqlDataReader), но затем использовать его снова в другом блоке кода, не должен ли я вызвать Dispose ()? Что также означает, что оператор using пропускается."
Правильно. Если вы используете оператор using, он всегда будет вызывать Dispose (). Это закроет устройство чтения данных, прежде чем ваш другой блок сможет его использовать.
"Также, чтобы уточнить, если FileStream оборачивает StreamWriter и я вызываю dispose для FileStream, это вызовет Flush (), Close () и Dispose () (в зависимости от того, вызывает ли Dispose () метод Close ()) в StreamWriter, верно? Аналогично, если я вызову Close для FileStream, это вызовет только Flush () и Close () для FileStream. "
Если вы оборачиваете FileStream вокруг StreamWriter, я настоятельно рекомендую обращаться с ними последовательно. Используйте один оператор using с обоими членами, чтобы они оба удалялись в конце блока. Это самый безопасный, самый чистый подход.
«Является ли проверка IL хорошим способом ответить на эти вопросы о том, что происходит под капотом?»
Это путь, хотя и более сложный. Читайте в MSDN об использовании и потоках, и документация объяснит это в более простых терминах, чем попытка разобрать IL. ИЛ скажет вам ТОЧНО, что произойдет, если вам интересно.