CHAPTER 18 UNDERSTANDING CIL AND THE ROLE OF DYNAMIC ASSEMBLIES
Of course, when you wish to define a point of field data within a class or structure, you are not
limited to a point of public static literal data. For example, you could update MyBaseClass to support two
points of private, instance-level field data, set to default values:
.class public MyBaseClass
{
.field private string stringField = "hello!"
.field private int32 intField = int32(42)
}
As in C#, class field data will automatically be initialized to an appropriate default value. If you wish
to allow the object user to supply custom values at the time of creation for each of these points of private
field data, you (of course) need to create custom constructors.
Defining Type Constructors in CIL
The CTS supports both instance-level and class-level (static) constructors. In terms of CIL, instance-level
constructors are represented using the .ctor token, while a static-level constructor is expressed via
.cctor (class constructor). Both of these CIL tokens must be qualified using the rtspecialname (return
type special name) and specialname attributes. Simply put, these attributes are used to identify a specific
CIL token that can be treated in unique ways by a given .NET language. For example, in C#, constructors
do not define a return type; however, in terms of CIL, the return value of a constructor is indeed void:
.class public MyBaseClass
{
.field private string stringField
.field private int32 intField
.method public hidebysig specialname rtspecialname
instance void .ctor(string s, int32 i) cil managed
{
// TODO: Add implementation code...
}
}
Note that the .ctor directive has been qualified with the instance attribute (as it is not a static
constructor). The cil managed attributes denote that the scope of this method contains CIL code, rather
than unmanaged code, which may be used during platform invocation requests.
Defining Properties in CIL
Properties and methods also have specific CIL representations. By way of an example, if MyBaseClass
were updated to support a public property named TheString, you would author the following CIL (note
again the use of the specialname attribute):
.class public MyBaseClass
{
...
.method public hidebysig specialname
instance string get_TheString() cil managed
{
// TODO: Add implementation code...
671