4 Answers
4

The C# compiler automatically tries appending the suffix Attribute when you're using an attribute (which is obvious syntactically). It just makes things easier. From the C# 5 spec section 17.2 (Attribute Specification):

By convention, attribute classes are named with a suffix of Attribute. An attribute-name of the form type-name may either include or omit this suffix. If an attribute class is found both with and without this suffix, an ambiguity is present, and a compile-time error results. If the attribute-name is spelled such that its right-most identifier is a verbatim identifier (§2.4.2), then only an attribute without a suffix is matched, thus enabling such an ambiguity to be resolved.

You should be able to use your [Jeffthroize] example - it's hard to tell why you can't in your specific situation, without seeing the code and the error message.

By convention, the name of the attribute class ends with the word
Attribute. While not required, this convention is recommended for
readability. When the attribute is applied, the inclusion of the word
Attribute is optional.

Well, simply saying, it is accepted, because the compiler was written in such way.

There's a requirement that all Attributes must derive from the Attribute class. Therefore it's can be assumed that everything in brackets [] is an 'Attribute'.

There's a programmers' custom that things XXXX are often being named XxxxThing, PersonView, LoginController, ReadOnlyAttribute. It gives you a bit better look on the code when you are looking at files. However, when you deal only with controllers, only with views, or only with attributes, it's tiresome to have to always say XxxxAttribute, YyyyAttribute.

Since you know that all things written in [] are of the Attribute class, it's not really necessary to write the Attribute word contained in the class name. It adds nothing. You know it's an attribute because it's in the [].

It's just a handy shortcut provided by the language/compiler, for your convenience only, and only available in this place in the code. If you search with Reflection for that attribute classes, or if you try to Activator.Create<> or even typeof() it, you still need the full name.

And about the problem with custom attribute:

make sure you've got your usings right

make sure you have added the reference

make sure you have recompiled all assemblies

ensure that typeof(JeffthrotizeAttribute) does not complain aobut unknown type. If so - get to the first three points

if the compiler still complains about [Jeffthrotize] than most probably you've got the flags wrong. Remember that attributes need to have AttributeUsage specified correctly. If you specify AttributeTargets.Method, then you will not be able to put that attribute on a whole class. You can combine the attribute-usages with | operator, like any flag: AttributeTargets.Method|AttributeTargets.Class, etc.

See http://msdn.microsoft.com/pl-pl/library/system.attributetargets.aspx for full list.