| 1 | = Struct Definition = |
| 2 | |
| 3 | Structs are similar to classes but more limited in ways that make them suitable [[BR]] |
| 4 | for representing lightweight value-container-only objects ( like a Point or Rectangle). |
| 5 | |
| 6 | Unlike classes (reference type) they are a value type and they cannot be inherited or inherit[[BR]] |
| 7 | from another class or struct. |
| 8 | |
| 9 | Other differences from classes:[[BR]] |
| 10 | * Within a struct declaration, fields cannot be initialized unless they are declared as const or static. |
| 11 | * A struct may not declare a default constructor (a constructor without parameters) or a destructor. |
| 12 | * Structs can only declare constructors that have parameters. |
| 13 | * Structs are copied on assignment and when passed into methods. [[BR]] |
| 14 | When a struct is assigned to a new variable or passed to a method, all the data is copied, and any modification to the [[BR]] |
| 15 | new copy does not change the data for the original copy. |
| 16 | |
| 17 | However |
| 18 | * A struct can implement interfaces. |
| 19 | * A struct can be used as a nullable type and can be assigned a null value. |
| 20 | |
| 21 | Structures and their contained instance members are public by default though this may be[[BR]] |
| 22 | overridden using the normal [wiki:AccessModifiers access modifiers] syntax. |
| 23 | |
| 24 | Idomatic usage suggests structs should not modify their accessmodifiers for visibility and[[BR]] |
| 25 | should not declare any methods (If this is deemed necessary you should use a class instead).[[BR]] |
| 26 | They should only be used as publicly accessible value containers. |
| 27 | |
| 28 | The syntax/grammar for declaring structures is similar to that of classes [[BR]] |
| 29 | (barring the '''struct''' keyword and lack of the '''inherits''' clause) |
| 30 | |
| 31 | == Grammar == |
| 32 | {{{ |
| 33 | struct <StructureName> |
| 34 | [is <AccessModifiers>] |
| 35 | [has <Attributes>] |
| 36 | [where <GenericParam> must be <GenericConstraints>] |
| 37 | [implements <InterfaceName> [, <InterfaceName>]...] |
| 38 | [<DocString>] |
| 39 | [ |
| 40 | [<Variables>] |
| 41 | [<Constants>] |
| 42 | [<Properties>] |
| 43 | [<Methods> |
| 44 | [<Enums>] |
| 45 | [<Sigs>] |
| 46 | [<Invariants>] |
| 47 | [<Tests>] |
| 48 | [<SharedClause>] |
| 49 | ]... |
| 50 | |
| 51 | # empty (placeholder) structure |
| 52 | struct <StructureName> |
| 53 | [is <AccessModifiers>] |
| 54 | [has <Attributes>] |
| 55 | [where <GenericParam> must be <GenericConstraints>] |
| 56 | [implements <InterfaceName> [, <InterfaceName>]...] |
| 57 | [<DocString>] |
| 58 | pass |
| 59 | }}} |
| 60 | |
| 61 | == Platform == |
| 62 | |
| 63 | in .Net, all structs inherit directly from System.!ValueType, which inherits from System.Object. |
| 64 | |
| 65 | == Examples == |
| 66 | {{{ |
| 67 | # a simple Point-like struct |
| 68 | struct CoOrds |
| 69 | var x as int |
| 70 | var y as int |
| 71 | |
| 72 | cue init(p1 as int, p2 as int) |
| 73 | .x = p1 |
| 74 | .y = p2 |
| 75 | |
| 76 | |
| 77 | #// Declare and initialize struct objects. |
| 78 | class TestCoOrds |
| 79 | def main is shared |
| 80 | # Initialize: |
| 81 | coords1 = CoOrds() |
| 82 | coords2 = CoOrds(10, 10) |
| 83 | |
| 84 | # Display results: |
| 85 | print 'CoOrds 1: ' stop |
| 86 | print 'x = [coords1.x], y = [coords1.y]' |
| 87 | |
| 88 | print 'CoOrds 2: ' stop |
| 89 | print 'x = [coords2.x], y = [coords2.y]' |
| 90 | |
| 91 | assert coords1.x == 0 and coords1.y == 0 |
| 92 | assert coords2.x == 10 and coords2.y == 10 |
| 93 | |
| 94 | /# Output: |
| 95 | CoOrds 1: x = 0, y = 0 |
| 96 | CoOrds 2: x = 10, y = 10 |
| 97 | #/ |
| 98 | |
| 99 | |
| 100 | }}} |
| 101 | |
| 102 | == Notes == |
| 103 | |
| 104 | == See Also == |
| 105 | [http://msdn.microsoft.com/en-us/library/ah19swz4.aspx struct(C# Reference)] |
| 106 | |
| 107 | [http://msdn.microsoft.com/en-us/library/saxz13w4.aspx Structs(C# Programming Guide)] |
| 108 | |
| 109 | [http://msdn.microsoft.com/en-us/library/0taef578.aspx Using Structs( C# Programming Guide)] |
| 110 | |
| 111 | |
| 112 | [wiki:LanguageTopics Back to LanguageTopics] |