开发者

ConditionalAttribute and other special classes

The ConditionalAttribute can be used to remove calls to a marked method depending on the compiler symbols defined. I'm assuming we could not create this class ourselves since the compiler must be looking for it specifically.

I was wondering what other classes there are that the compiler, or language uses that we开发者_JS百科 could not code ourselves.


in addition to those mentioned;

AttributeUsageAttribute

has special compiler support, since it restricts (at compile) how you can apply attributes

ObsoleteAttribute

is also used by the compiler to warn or error about usage.

I suspect though, that technically you could write all of these yourself - as long as you write your own core libarary and System.dll ;p The compiler is generally looking for a pattern/signature, since it must cater for different runtimes - and indeed you don't have to use the MS core libraries. The behaviour, however, is defined by the compiler, not the class - so you can't make it do anything different.


  • The compiler looks for [ExtensionAttribute] to indicate extension methods (and classes containing extension methods).

  • [DynamicAttribute] is used to indicate that a member should be treated as type dynamic (even though the member type itself will just be object)

  • [InternalsVisibleTo] allows one assembly to access the internal members of another.

Basically look through the System.Runtime.CompilerServices namespace, and examine the attributes in there... many of them will be handled specially by a compiler, even if it's not the C# compiler (e.g. DateTimeConstantAttribute isn't used by the C# compiler as far as I'm aware, but DecimalConstantAttribute is. It's possible that the C# compiler will consume constant DateTime values even though it won't produce them...)


[SerializableAttribute] springs to mind. The compiler handles this differently to other attributes, I believe it's translated to a specific instruction in IL..

EDIT Looking at the IL for ArgumentException as an example, the class definition looks like this:

.class public auto ansi serializable beforefieldinit ArgumentException

Note the *'serializable' modifier. Usually with an attribute you would expect to see something like the following, but it is not there:

.custom instance void System.SerializableAttribute::.ctor() = (
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜