Method definitions are composed of a name, a method signature, and optionally an implementation of the method. The method signature defines the calling convention, type of the parameters to the method, and the return type of the method (see Method Signatures). The implementation is the code to execute when the method is invoked. A value type or object type can define only one method of a given name and signature. However, a derived object type may have methods that are of the same name and signature as its base object type. See Method Inheritance and Hiding, Overriding, and Layout.
The name of the method is scoped to the type (see Assemblies and Scoping section). Methods can be given accessibility attributes (see Accessibility of Members). Methods can only be invoked with arguments that are assignment compatible with the parameters types of the method signature. The return value of the method must also be assignment compatible with the location in which it is stored.
Methods can be marked as static, indicating that the method is not an operation on values of the type but rather an operation associated with the type as a whole. Methods not marked as static define the valid operations on a value of a type. When a non-static method is invoked, a particular value of the type, referred to as this or the this pointer, is passed as an implicit parameter.
A method definition that does not include a method implementation must be marked as abstract, unless the method definition is part of an interface definition. All non-static methods of an interface definition are abstract. Abstract method definitions are only allowed in object types that are marked as abstract.
A non-static method definition in an object type may be marked as virtual, indicating that an alternate implementation may be provided in derived types. All method definitions in interface definitions must be virtual methods. Virtual method can be marked as final, indicating that derived object types are not allowed to override the method implementation.