Saturday, December 22, 2007

Structures

Structures
Like C and C++, C# includes support for creating structure types. A structure is an aggregate type that combines members of multiple types into a single new type. As with classes, members of a structure are private by default and must be explicitly made public to grant access to clients. A structure is declared using the struct keyword, as shown here:

struct Point
{
public int x;
public int y;
}
Structures and Inheritance
Structures can’t be inherited.

struct Point
{
public int x;
public int y;
}
// Not allowed; can't inherit from a struct.
class ThreeDPoint: Point
{
public int z;
}
This is in contrast to C++, in which there’s very little real difference between a class and a structure. In C#, structures can inherit from interfaces, but they’re not allowed to inherit from classes or other structures.

Allocating Structures
Unlike instances of classes, structures are never heap-allocated; they’re allocated on the stack. Staying out of the heap makes a structure instance much more efficient at runtime than a class instance in some cases. For example, creating large numbers of temporary structures that are used and discarded within a single method call is more efficient than creating objects from the heap. On the other hand, passing a structure as a parameter in a method call requires a copy of the structure to be created, which is less efficient than passing an object reference.

Creating an instance of a structure is just like creating a new class instance, as shown here:

Point pt = new Point();
Always use the dot operator to gain access to members of a structure.

pt.y = 5;

Member Functions
Structures can have member functions in addition to member fields. Structures can also have constructors, but the constructor must have at least one parameter, as shown here:

struct Rect
{
public Rect(Point topLeft, Point bottomRight)
{
top = topLeft.y;
left = topLeft.x;
bottom = bottomRight.y;
right = bottomRight.x;
}
// Assumes a normalized rectangle
public int Area()
{
return (bottom - top)*(right - left);
}
// Rectangle edges
int top, bottom, left, right;
}
Structures aren’t allowed to declare a destructor.

0 comments: