The C# Station Tutorial
by Joe Mayo, 01/19/02, updated 3/12/03, 2/22/08, and 4/29/08
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);
}
}
Get Setup Instructions For How to Run
this Program
Listing 12-1 shows how to declare and use a struct. It is easy to tell that
a type is a struct because of the keyword struct used in its 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 its 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 its 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 implement multiple
interfaces. An interface is a C# reference type with members that
do not have implementations. Any class or struct implementing an interface
must implement every one of that interface's methods. Interfaces are
a subject for a later lesson.
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, you should consider how the type
will be used. 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.
I invite you to return for Lesson 13: Interfaces.
Your feedback and constructive contributions are welcome. Please feel free
to contact me for feedback or comments you may have about this lesson.
Copyright © 2000-2008 C# Station, All Rights Reserved