
The C# Station Tutorial
by Joe Mayo, 01/19/02
Lesson 12: Structs
This lesson teaches C# Structs. Our objectives are as follows:
 | Understand the Purpose of structs. |
 | Implement a struct. |
 | Use a struct. |
A struct allows you to create new value-type objects that are similar
to the built-in types (int, float, bool, etc.). When
would you use a struct instead of a class? Think about how the
built-in types are used. They have values and distinct operations to
manipulate those values. If you have a need to create an object that
behaves in this manner, consider implementing it as a struct. Later
in this article, I'll explain a couple rules for using structs, which
will give you a better idea of when to use them. In the meantime, here's
an example.
Listing 12-1. Example of a struct: StructExample.cs
using System;
struct Point
{
public
int x;
public
int y;
public Point(int
x, int y)
{
this.x = x;
this.y = y;
}
public Point Add(Point pt)
{
Point newPt;
newPt.x = x + pt.x;
newPt.y = y + pt.y;
return newPt;
}
}
///
<summary>
/// Example of declaring and using a
struct
///
</summary>
class StructExample
{
static
void Main(string[]
args)
{
Point pt1 =
new Point(1, 1);
Point pt2 =
new Point(2, 2);
Point pt3;
pt3 = pt1.Add(pt2);
Console.WriteLine("pt3: {0}:{1}",
pt3.x, pt3.y);
}
}
Listing 12-1 shows how to declare and use a struct. It's easy to
tell that a type is a struct because of the keyword "struct" used
in it's definition. The basic layout of a struct is much like a
class, but with differences, which will be explained in following
paragraphs.. The Point struct has a constructor which
initializes it's fields to the x and y values passed in. It
also has a method named Add(), which will accept another Point struct,
add it to this struct, and return a new struct.
Notice that there is a Point struct declared in the Add()
method. It does not need to be instantiated with a new operator,
like a class. When this occurs, the struct is implicitly
instantiated with it's default (or parameterless) constructor. The
parameterless constructor initializes all struct fields to default
values. i.e. integrals are 0, floating points are 0.0, and booleans are
false. It's illegal to define a parameterless constructor for a struct.
Although not required, a struct may be instantiated with a new
operator. In Listing 12-1 the pt1 and pt2 Point structs
are initialized with values by using the constructor defined in the Point
struct. A third Point struct, pt3 is declared
and defaults to using the parameterless (default) constructor, because it
doesn't matter what it's value is at this point. The Add() method
of the pt1 struct is then invoked, passing the pt2
struct as a parameter. The result is assigned to pt3, showing
that a struct may be used just like any other value type. Here's
the output from Listing 12-1:
pt3: 3:3
Another difference between structs and classes is that
structs can not have destructors. Also, structs cannot inherit
another class or struct or be inherited from. However, a
struct may inherit multiple interfaces. An interface is
a C# reference type with members that do not have implementations. Any
class or struct inheriting an interface must implement every
one of that interface's methods. Interfaces are a subject
for a later lesson.
In summary, you now know how to create a struct. You can also
instantiate and use structs. When deciding whether to implement a
type as a struct or class, you should consider how the type will
be used. If you need to define a parameterless constructor, then a
class is your only choice. Also, consider that a struct incurs
less overhead than a class because, being a value type, it is stored on the
stack rather than how a class is stored, on the heap.
Your feedback is very important and I appreciate any constructive
contributions you have. Please feel free to contact me for any questions or
comments you may have about this lesson.
Feedback
Copyright © 2002 C# Station, All Rights Reserved
|