struct character of these types, which is part of .NET, is fully preserved. As in all .NET languages types in Oxygene have a visibility. In Oxygene the default visibility is assembly, which is equivalent to the internal visibility in C#. The other possible type visibility is public. type MyClass = public class end; The visibility can be set for every type defined (classes, interfaces, records, ...). An alias name can be defined for types, which can be used locally or in other Oxygene assemblies. type IntList = public List<Integer>; //visible in other Oxygene-assemblies SecretEnumerable = IEnumerable<String>; //not visible in other assemblies Public type aliases won't be visible for other languages. Records Records are what .NET structs are called in Oxygene. They are declared just like classes, but with the record keyword: type MyRecord = record method Foo; end; As they're just .NET structs, records can have fields, methods and properties, but do not have inheritance and cannot implement interfaces. Interfaces Interfaces are a very important concept in the .NET world, the framework itself makes heavy use of them. Interfaces are the specification of a small set of methods, properties and events a class has to implement when implementing the interface. For example, the interface IEnumerable<T> specifies the GetEnumerator method which is used to iterate over sequences. Interfaces are declared just like classes: type MyInterface = public interface method MakeItSo : IEnumerable; property Bar : String read write; end; Please notice, that for properties the getter and setter are not explicitly specified. Delegates Delegates define signatures for methods, so that these methods can be passed in parameters (e.g. callbacks) or stored in variables, etc. They're the type-safe NET equivalent to function pointers. They're also used in events. When assigning a method to a delegate, one has to use the @ operator, so the compiler knows, that one doesn't want to call the method but just assign it. Oxygene can create anonymous delegates; for example methods can be passed to the Invoke method of a control without declaring the delegate: method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs); begin Invoke(@DoSomething); end; An anonymous delegate with the signature of the method DoSomething will be created by the compiler. Oxygene supports polymorphic delegates, which means, that delegates which have parameters of descending types are assignment compatible. Assume two classes MyClass and MyClassEx = class(MyClass), then in the following code BlubbEx is assignment compatible to Blubb. type delegate