DELEGATE-ENDDELEGATE

Declare a delegate

 

 

 

NSupported in Synergy .NET
[access] DELEGATE name[<T[(constraints)], ...>], delegate_type
  parameter_def
  .
  .
  .
ENDDELEGATE

access

(optional) One of the following access modifiers:

PUBLIC

Access is not restricted. This is the most accessible option. (default)

INTERNAL

Access is limited to the current assembly.

PROTECTED

Access is limited to the containing type or types derived from the containing type. (nested delegates only)

PRIVATE

Access is limited to the containing type. This is the least accessible option. (nested delegates only)

name

The name of the delegate to declare.

T

A generic type parameter, which indicates the delegate is a generic type and which acts as a placeholder for which an actual type will be substituted when the member is used. Note that you can use any unused letter (not just T). See Generic types (.NET) for more information.

constraints

One or more of the following constraints:

Multiple constraints must be separated by commas. See Constraints for more information.

delegate_type

Any data type that can be used as a return value for .NET. See the Where Data Types Can Be Used table.

parameter_def

The definition of a parameter that is unique within this method. Each parameter definition has the syntax that’s described in Defining a parameter.

A delegate enables you to pass a routine (method, subroutine, or function) as a parameter value. A delegate can be used as a type wherever a type can be used within the class (for example, local variable and field types).

If you use the ^FUNCPTR data reference operation to assign a subroutine or function to a delegate, you can use DELEGATE to pass that routine as a parameter value. By default,

delegate Func<string,int> 

passes the parameter as BYVAL, while a subroutine or function with a string parameter and no modifiers passes it as BYREF, so function parameters require an explicit BYVAL declaration.

The example below defines a delegate class member named mydelegate that defines a method prototype, and the mymethod method uses mydelegate as a parameter value. Mymethod is called, passing in the subthis method as the parameter value for p1. Within mymethod, subthis is called with a parameter value of 5. Subthis returns 5*2, which equals 10.

class class1
    public delegate mydelegate, i4
        p1, i4
    enddelegate
    public method mymethod, i4
        p1, @mydelegate
    record
        v1, i4
    proc
        v1 = p1(5)  ;call the delegate passing in a 5
        mreturn v1
    endmethod
    public method subthis, i4
        p1, i4
    proc
        mreturn p1 * 2
    endmethod
endclass
c1, @class1
md, @class1.mydelegate
v1, i4
c1 = new class1()
md = new class1.mydelegate(c1.subthis)
v1 = c1.mymethod(md)