PROPERTY-ENDPROPERTY

Declaring a property

WTSupported in traditional Synergy on Windows
WNSupported in Synergy .NET on Windows
USupported on UNIX
VSupported on OpenVMS
[access] [property_mod ...] PROPERTY name, property_type
  method_def
  .
  .
  .
ENDPROPERTY

or (to declare a simple property)

[access] [property_mod ...] simple_mod PROPERTY name, property_type [,initial_value]

Arguments

access

(optional) One of the following access modifiers:

PUBLIC

Access is not restricted. This is the most accessible option.

PROTECTED

Access is limited to the containing class or types derived from the containing class.

PRIVATE

Access is limited to the containing type. This is the least accessible option. (default)

INTERNAL

Access is limited to the current assembly. (Synergy .NET only)

PROTECTED INTERNAL

Access is limited to the current assembly and types derived from the containing class. (Synergy .NET only)

property_mod

(optional) One or more of the following property modifiers, with the restrictions stated in the Discussion:

ABSTRACT

Must have a method implemented in a derived class of the same signature. Subclasses must implement this method.

SEALED

Cannot be overridden any further by inheriting classes without the NEW modifier.

NEW

Hide an inherited member of the same name.

OVERRIDE

Overrides the parent class’s virtual method that has the same method signature.

STATIC

Accessed without a reference object. The method can be executed even if the class that contains the method hasn’t been instantiated.

VIRTUAL

Can be overridden in a subclass.

name

The name of the property to declare.

property_type

Any valid field type. See Defining a field. The only valid array syntax for a property type is [#]@class.

method_def

The definition of a get or a set accessor method (METHOD GET or METHOD SET). (See METHOD-ENDMETHOD for more information about defining a method.)

simple_mod

One of the following simple property modifiers:

READONLY

Generates a public get accessor only.

READWRITE

Generates a public get accessor and a public set accessor.

SETPROTECTED

Generates a public get accessor and a protected set accessor.

SETPRIVATE

Generates a public get accessor and a private set accessor.

SETINTERNAL

Generates a public get accessor and an internal set accessor.

SETPROTECTEDINTERNAL

Generates a public get accessor and a protected internal set accessor.

initial_values

A literal or compile-time expression that the property value will be set to before the first invocation.

Discussion

A property holds information. It is presented like a variable to a routine using the class in which the property is declared, but a property has code associated with it, like a function.

Note

Although a property appears to look like a field in the code, it isn’t. The compiler translates it into a set of method calls. Because of this, property access is significantly slower than field access, and properties cannot be used in the same places that fields can. For example you can do this:

if (field = 20)

but not this:

if (property = 20)

The access modifier (PUBLIC, PROTECTED, PRIVATE, INTERNAL, or PROTECTED INTERNAL) can appear between the other modifiers; it does not have to come first. See Accessibility for more information about these settings.

By default, properties cannot be overridden unless they are marked as ABSTRACT, OVERRIDE, or VIRTUAL. (ABSTRACT and OVERRIDE properties are also assumed to be virtual and are mutually exclusive.) An ABSTRACT property has no implementation, which means it has a PROC and an END with no intervening statements.

The SEALED modifier can only be specified in conjunction with the OVERRIDE modifier.

If you have any questions about which modifiers can be specified together, see the Exclusivity of METHOD modifiers table.

You can hide a class member in a parent class with an identical signature in an inherited class by specifying a member with the same name, along with the NEW member modifier, within the inheriting class. You can also hide dissimilar members. (For example, a field or a sealed member in the parent can be hidden by a method or field of the same name marked NEW in the child.) The class members can be different kinds (for example, a method and a field).

You can optionally override the property accessibility by declaring an access modifier on the get or set accessor. The modifier on the get or set accessor must be more restrictive than the accessibility of the property itself.

The method_def can be a METHOD GET or METHOD SET definition to get or set the value of the property. (See Examples for an example of each.)

When you declare a set method for a property, an implicit value argument, which has the same type as the property, represents the value to which the property should be set. (Because the keyword value is reserved, it cannot be used as an identifier within a set method.) Parameters are not valid on get or set methods.

To get an accessible property value from an instantiated class, use the following syntax, which causes the property’s declared get method to be executed:

avalue = var1.myproperty

To set an accessible property value from an instantiated class, use the following syntax, which causes the property’s set method to be executed:

var1.myproperty = avalue

Simple properties

You can define a simple, or auto-implemented, property if there’s no need to create a separate field or a get or set method with additional logic. A simple property declaration is more concise, and the compiler automatically creates an implied backing field. To declare a simple property, you must specify the simple_mod parameter, as shown in the second syntax for PROPERTY-ENDPROPERTY.

Note

Simple properties are not supported with unsized descriptor types.

Indexer properties

An indexer is a special property that allows data in a class to be accessed using array syntax. You can declare one or more indexer properties for a class by declaring a property with the name “indexer” followed by one or more array index arguments. (Note that you cannot specify arguments for nonindexer properties.) For example,

class myclass
private record
myarray, [100]i4 ; private field
endrecord
public property indexer, i4
    index1, i4
method get
proc
    mreturn myarray[index1]
endmethod
method set
proc
    myarray[index1] = value
    mreturn
endmethod
endproperty
endclass

The get accessor for an indexer has access to all the arguments of the indexer. The set accessor for an indexer has access to all those same arguments plus the implicit value argument.

See Properties and indexers for more information.

Examples

The example below declares a get accessor method for myproperty that returns the value of the property.

private record
    myfield, i4                         ;A private field
endrecord
public property myproperty, i4
method get
proc
    mreturn myfield
endmethod
endproperty

The following example declares a set accessor method that sets the value of myproperty.

private record
    myfield, i4                         ;A private field
endrecord
public property myproperty, i4
method set
proc
    myfield = value
    mreturn
endmethod
endproperty

The example below declares a simple property named tprop90 that generates public get and set accessors and has an initial value of “goodbye”:

readwrite property tprop90, string, "goodbye"