1.. Is there any performance overhead caused by the usage of attributes? Think for a class like:
public class MyClass
{
int Count {get;set;}
Jon Skeet is absolute right and I only want to give one additional notion:
If you have a look at the base class of all attributes, System.Attribute, you'll notice, that most of its members are static. So they exist only once, no matter how many Attribute instances you have.
This is just another point to underline, that Attributes are not too costly...
There's a tiny bit of overhead in terms of space, but not a lot - attributes don't get in the way of normal execution.
No, attributes act on types, not instances, so you won't take up a vast amount of memory by using lots of "big" attributes. (I don't know whether you get one per concrete type for generics, or one per generic type definition - I'd expect the latter...)
No, because of the answer to 1.
Attributes aren't attached to objects - they're attached to types. I don't know the details of exactly where they're stored in memory, but that's an implementation detail anyway.
Attributes are only initialized when you use reflection.