programming book to help expand use of a language
I'm an experienced developer, but have difficulty in using all the tools in the c# box.

I'm looking for a book that discusses **when** and **why** to use these tools. For example, when to use delegates and when not, when to use inheritance vs composition, what are the implications of using a static constructor, why use a generic, where is it good to have an abstract class inherit from an abstract class, etc, etc. 

After reading a chapter in c# book, I'll understand the content, follow the examples, but these examples are often too simple. For instance, when discussing generics, a FIFO queue is often given as an example, in my years of development I have never had to develop FIFO.

I know this is a bit vague, but I think it's a problem that many developers have.

programming book to help expand use of a language
===

I'm an experienced developer, but have difficulty in using all the tools in the c# box.

I'm looking for a book that discusses **when** and **why** to use these tools. For example, when to use delegates and when not, when to use inheritance vs composition, what are the implications of using a static constructor, why use a generic, where is it good to have an abstract class inherit from an abstract class, etc, etc. 

After reading a chapter in c# book, I'll understand the content, follow the examples, but these examples are often too simple. For instance, when discussing generics, a FIFO queue is often given as an example, in my years of development I have never had to develop FIFO.

I know this is a bit vague, but I think it's a problem that many developers have.
