records engineering 1d04, teaching session 11. © copyright 2006 david das, ryan lortie, alan...

89
Records Engineering 1D04, Teaching Session 11

Upload: joanna-copeland

Post on 03-Jan-2016

216 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

Records

Engineering 1D04, Teaching Session 11

Page 2: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 2

Records

So far we've seen a number of different types of variables: Integers (int) Strings (string) Floating Point Numbers (float, double) Boolean Values (bool) Arrays of int, Arrays of double, etc. 2D Arrays of int, 2D Arrays of double, etc.

Page 3: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 3

Records

In many cases, we have a need to represent data more complex than a single number or a text string.

Arrays allow us to put related values of the same type together, but what if the types of the elements are different?

Page 4: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 4

Alice

Eve

Bob

Charlie

A stringAn arraycontaining4 strings

7000

5000

4000

2000

An integerAn arraycontaining4 integers

3

2

1

0

3

2

1

0

High Scores

Recall the high score system. We used two separate arrays to store the

following items:• The top ten scores• The names associated with those scores

Page 5: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 5

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Eve

Bob

Charlie

7000

5000

4000

2000

New score to be inserted here

j

1i

Dave 6000

3

2

1

0

3

2

1

0

3

2

1

0

3

2

1

0

High Scores

Page 6: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 6

Alice

Eve

Bob

Charlie

7000

5000

4000

2000

New score to be inserted here

j

1i

Dave 6000

Before starting, notice thatEve's score is 5000.3

2

1

0

3

2

1

0

High Scores for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Page 7: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 7

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Eve

Bob

Charlie

7000

5000

4000

2000

New score to be inserted here

3j

1i

Dave 6000

3

2

1

0

3

2

1

0

High Scores

Page 8: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 8

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Eve

Bob

Bob

7000

5000

4000

2000

New score to be inserted here

3j

1i

Name moves

Dave 6000

3

2

1

0

3

2

1

0

High Scores

Page 9: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 9

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Eve

Bob

Bob

7000

5000

4000

2000

New score to be inserted here

2j

1i

Name movesbut score does not!

Dave 6000

3

2

1

0

3

2

1

0

High Scores

Page 10: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 10

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Eve

Eve

Bob

7000

5000

4000

2000

New score to be inserted here

2j

1i

Dave 6000

3

2

1

0

3

2

1

0

High Scores

Name movesbut score does not!

Page 11: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 11

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Eve

Eve

Bob

7000

5000

4000

2000

New score to be inserted here

1j

1i

No longer true

Dave 6000

3

2

1

0

3

2

1

0

High Scores

Page 12: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 12

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Eve

Eve

Bob

7000

7000

4000

2000

New score to be inserted here

1j

1i

Dave 6000???

3

2

1

0

3

2

1

0

High Scores No longer true

Page 13: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 13

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Dave

Eve

Bob

7000

7000

4000

2000

New score to be inserted here

1j

1i

Dave 6000

3

2

1

0

3

2

1

0

High Scores

Page 14: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 14

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Dave

Eve

Bob

7000

6000

4000

2000

New score to be inserted here

1j

1i

Dave 6000

3

2

1

0

3

2

1

0

High Scores

Page 15: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 15

Alice

Dave

Eve

Bob

7000

6000

4000

20003

2

1

0

3

2

1

0

High Scores for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Eve's score is now 4000(Bob's former score).

What happened?

Page 16: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 16

for (j = names.Length - 1; j > i; j--) names[j] = names[j-1]; scores[j] = scores[j-1];names[i] = name;scores[i] = score;

Alice

Dave

Eve

Bob

7000

6000

4000

2000

Notice the lack of braces

Only the name gets shiftedinside of the loop.

So the names and scoresbecome mismatched!!

3

2

1

0

3

2

1

0

High Scores

{

}

Page 17: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 17

High Scores

Keeping two separate arrays of associated data is potentially dangerous. We have to ensure that the data in one array is

always synchronised with the data in the other. Keeping the two arrays synchronised requires

additional code. A bug like the one you just saw could easily result

in names matching the wrong scores. If we want to change the number of scores, we

have to change the size of two arrays.

Page 18: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 18

High Scores

We can only use a single array if we can store more complex data in an array. Maybe we could store a string like

• "Alice 7000 points"

It becomes inconvenient to extract the score portion of the string to compare it with other scores when inserting.

We need an easy way to treat multiple pieces of data as a single cohesive object.

Page 19: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 19

Records

A common concept in programming languages is that of records.

A record is several pieces of related data stored together in a single place. name, address and phone number of a

person name and score of someone on a highscore

list title, track, album and artist of a music file

Page 20: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 20

A record, containinga string and an integer.

A stringAlice 7000

An integer

Records

When dealing with records, all of the information in a record moves around together as a single unit.

Consider a record containing a high score and the name of the person it belongs to.

Page 21: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 21

A record, containingname and score.

An array containing4 records.

Alice 7000

Eve 5000

Bob 4000

Charlie 20003

2

1

0

Records

We could then make a single array containing a number of these records.

Our highscore list might then look like this

Page 22: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 22

Records

Because names and scores are bound together in a single package it's not possible for them to fall out of synchronisation with each other.

The single packaging means that both the name and score can be moved with a single statement.

This becomes increasingly useful as the number of items in the record increases from two to many more.

Page 23: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 23

Records

There are clearly many possibilities for combinations of different types of data to store in a record.

Before storing data in a record you need to define its type.

Once you have declared the type, you can create many records of this type (for example, one for each person in the high score list).

Page 24: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 24

Records

When declaring variables in any program you specify two things about each variable. Its type Its name

Examples: int counter;

type is integer, name is "counter".

string password; type is string, name is "password".

Page 25: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 25

Records

When declaring variables in a record you do exactly the same thing.

You must specify the type and the name of each variable in the record. This defines the type of the whole record.

Page 26: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 26

Records

When declaring variables in a record you do exactly the same thing.

You must specify the type and the name of each variable in the record. This defines the type of the whole record.

Assuming a high score entry consists of a string for name and an integer for score, we want: string name; int score;

Page 27: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 27

Records

The idea of a record is to wrap up its components into a single unit.

The string and the integer in the high score entry record exist as a pair.

Page 28: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 28

Records

In C#, the class keyword is used for many things.

In general, the class keyword defines a template for the creation of objects.

A record is a specific sort of object but everything mentioned here about records will be applicable to objects in general.

Page 29: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 29

class HighScoreEntry{ public string name; public int score;}

Records

One purpose of the class keyword is to define a record type.

public indicates we need to access these itemsfrom outside of the class - we still need to discusspublic and private in more detail - stay tuned

Page 30: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 30

new HighScoreEntry();

Records

After declaring a record type with a given name we use the new keyword to create a new instance of it.

new returns a Reference to the new record. The concept of references is very important!

To create a new HighScoreEntry:

Page 31: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 31

new HighScoreEntry();

When the new statement runs a new record instance is created inmemory.

Records

Creating a new record instance

Page 32: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 32

Records

Creating a new record instancenew HighScoreEntry();

When the new statement runs a new record instance is created inmemory.

Page 33: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 33

The new instance has noname. It just “floats” in memory.

Records

Creating a new record instancenew HighScoreEntry();

Page 34: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 34

Records

Creating a new record instance

The new statement,however, returns a reference to the new object.

new HighScoreEntry();

Page 35: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 35

A reference can be thought of as an arrow or a pointer indicating the location of an object.

Records

Creating a new record instancenew HighScoreEntry();

Page 36: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 36

Records

new returns a reference to the new record. We can follow this reference to find the

record. A reference is its own type of value

(typically the memory address of the record).

Page 37: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 37

We can create variables to store references.

This creates a variable called myRef that is capable of storing a reference to a HighScoreEntry record.

This variable can not store references to other types of records.

HighScoreEntry myRef;

Records

Page 38: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 38

HighScoreEntry myRef;myRef = new HighScoreEntry();

Records

Naturally, a reference variable can be used to store the reference that is returned by new.

Page 39: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 39

HighScoreEntry myRef;myRef = new HighScoreEntry();

Just like with any other variabledeclaration a new named box iscreated in memory. This box isable to store HighScoreEntryreferences.

Creating New Records – Demo

myRef

Page 40: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 40

HighScoreEntry myRef;myRef = new HighScoreEntry();

myRefA new HighScoreEntry recordis created (floating in memory,without a name).

Creating New Records – Demo

Page 41: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 41

HighScoreEntry myRef;myRef = new HighScoreEntry();

myRefThe reference returned by newis stored in the box namedmyRef.

Creating New Records – Demo

Page 42: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 42

HighScoreEntry myRef;myRef = new HighScoreEntry();

myRefEven though the record itself isfloating without a name, we canfollow the reference to access it.

Creating New Records – Demo

Page 43: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 43

Records

For records to be useful we need to be able to inspect and modify (access) their contents.

Page 44: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 44

Records

For records to be useful we need to be able to inspect and modify (access) their contents.

For this purpose we use the . (dot) operator.

Page 45: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 45

class HighScoreEntry{ public string name; public int score;}

Records

Recall the format of the record definition.

Page 46: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 46

Our record has two elements

name (a string)score (an integer)

score(integer)

name(string)

Records

Recall the format of the record definition.

class HighScoreEntry{ public string name; public int score;}

Page 47: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 47

Records

Given a reference to a record, we can access each of its individual elements (name or score, for example) by using the dot syntax.

Page 48: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 48

myRef

score(integer)

name(string)

Records

Given our new record from before...

Page 49: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 49

myRef

score(integer)

name(string)

myRef.name = "Alice";myRef.score = 7000;

Records

Given our new record from before...

Page 50: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 50

myRef

Alice

score(integer)

name(string)

Records

Given our new record from before...

myRef.name = "Alice";myRef.score = 7000;

Page 51: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 51

myRef

Alice 7000

score(integer)

name(string)

Records

Given our new record from before...

myRef.name = "Alice";myRef.score = 7000;

Page 52: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 52

myRef

Alice 7000

score(integer)

name(string)

Records

Given our new record from before...

myRef.name = "Alice";myRef.score = 7000;

Page 53: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

A Quick Summary

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 53

Page 54: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 54

A Quick Summary

The class keyword defines the layout of a record type.

The word "class" is used like "category" to define a group of similar objects.

A class is a kind of template for creating new objects of that type.

Objects of a specific type are said to belong to that class.

Page 55: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 55

A Quick Summary

Records are data types that can contain several different elements.

We can make new records (object instances) using the new keyword.

A record is a specific kind of object. A variable (named memory location) can

contain a reference to an object. An object itself has no name.

Page 56: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 56

A Quick Summary

But seriously, what's the deal with references?

Isn't this “new” business just a really strange way of declaring a variable?

Page 57: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

Object References

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 57

Page 58: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 58

int a, b, c;

a = 5;b = a;c = 3;a = 7;c = b + a;

ab

c

Object References

Recall the introduction to variables. Each variable is a specific, named place in

memory where a value is stored.

Page 59: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 59

5int a, b, c;

a = 5;b = a;c = 3;a = 7;c = b + a;

ab

c

Object References

Recall introduction to variables. Each variable is a specific, named place in

memory where a value is stored.

Page 60: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 60

5

5

int a, b, c;

a = 5;b = a;c = 3;a = 7;c = b + a;

ab

c

Object References

Recall introduction to variables. Each variable is a specific, named place in

memory where a value is stored.

Page 61: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 61

5

5

int a, b, c;

a = 5;b = a;c = 3;a = 7;c = b + a;

ab

3c

Object References

Recall introduction to variables. Each variable is a specific, named place in

memory where a value is stored.

Page 62: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 62

7

5

int a, b, c;

a = 5;b = a;c = 3;a = 7;c = b + a;

ab

3c

Object References

Recall introduction to variables. Each variable is a specific, named place in

memory where a value is stored.

Page 63: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 63

7

5

int a, b, c;

a = 5;b = a;c = 3;a = 7;c = b + a;

ab

12c

Object References

Recall introduction to variables. Each variable is a specific, named place in

memory where a value is stored.

Page 64: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 64

HighScoreEntry a, b;

a = new HighScoreEntry();a.score = 5;b = a;b.score = 7;

b

a

Object References

We can draw a similar diagram for reference types.

Page 65: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 65

b

a

Object References

We can draw a similar diagram for reference types.

HighScoreEntry a, b;

a = new HighScoreEntry();a.score = 5;b = a;b.score = 7;

Page 66: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 66

b

a

5

Object References

We can draw a similar diagram for reference types.

HighScoreEntry a, b;

a = new HighScoreEntry();a.score = 5;b = a;b.score = 7;

Page 67: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 67

b

a

5

What happens next?

Object References

We can draw a similar diagram for reference types.

HighScoreEntry a, b;

a = new HighScoreEntry();a.score = 5;b = a;b.score = 7;

Page 68: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 68

b

a

5

Object References

We can draw a similar diagram for reference types.

HighScoreEntry a, b;

a = new HighScoreEntry();a.score = 5;b = a;b.score = 7;

Page 69: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 69

b

a

5

Object References

We can draw a similar diagram for reference types.

HighScoreEntry a, b;

a = new HighScoreEntry();a.score = 5;b = a;b.score = 7;

a and b nowboth refer to the same record!

Page 70: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 70

b

a

7

Object References

We can draw a similar diagram for reference types.

HighScoreEntry a, b;

a = new HighScoreEntry();a.score = 5;b = a;b.score = 7;

a and b really do refer to the same record!

Page 71: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 71

Object References

With references it's possible to have two reference variables referring to the same object.

In the example, a and b both refer to the same object.

Any changes made via a (a.score, a.name) will change b as well. Any change made via b will change a as well.

Page 72: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

Objects – Things to Consider

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 72

Page 73: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 73

Objects – Things to Consider

What happens if we have no references to an object?

Page 74: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 74

a

Objects – Things to Consider

Take this exampleHighScoreEntry a;

a = new HighScoreEntry();a.score = 5;a = new HighScoreEntry();

Page 75: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 75

a

Objects – Things to Consider

Take this exampleHighScoreEntry a;

a = new HighScoreEntry();a.score = 5;a = new HighScoreEntry();

Page 76: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 76

a

5

Objects – Things to Consider

Take this exampleHighScoreEntry a;

a = new HighScoreEntry();a.score = 5;a = new HighScoreEntry();

Page 77: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 77

a

5

Objects – Things to Consider

Take this exampleHighScoreEntry a;

a = new HighScoreEntry();a.score = 5;a = new HighScoreEntry();

Page 78: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 78

a

5

The reference to theold entry is replacedby a reference tothe new entry

Objects – Things to Consider

Take this exampleHighScoreEntry a;

a = new HighScoreEntry();a.score = 5;a = new HighScoreEntry();

Page 79: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 79

a

5

Objects – Things to Consider

Take this exampleHighScoreEntry a;

a = new HighScoreEntry();a.score = 5;a = new HighScoreEntry();

We have no way toreference the entrywith the 5 in it

What happens to it?

Page 80: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 80

Objects – Things to Consider

Left to itself, the object would just sit around consuming memory.

But fortunately, C# has a language feature called Garbage Collection.

When records are no longer accessible they are garbage collected (since nobody will notice that they are missing anyway).

All memory associated with the record is freed for other uses.

Page 81: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 81

a

5

Objects – Things to Consider

Take this exampleHighScoreEntry a;

a = new HighScoreEntry();a.score = 5;a = new HighScoreEntry();

We have no way toreference the entrywith the 5 in it

It gets garbage collected.

Most importantly - we have no way of using the data stored in this record!

Page 82: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 82

High Scores Yet Again void addScore(int newScore, string newName) { int mark; //index of identified element int j; //index used in moving entries down in array HSRecord newRecord;

newRecord = new HSRecord(); newRecord.score = newScore; newRecord.name = newName; if (INhighScore < maxElements) { highScore[INhighScore] = newRecord; INhighScore++; }

mark = 0; while (mark <= INhighScore - 1 && highScore[mark].score >= newScore) mark++;

if (mark <= INhighScore - 1) { for (j = INhighScore - 1; j > mark; j--) { highScore[j] = highScore[j - 1]; } highScore[mark] = newRecord; } }

DECLARATIONS REQUIRED class HSRecord { public string name; public int score; } const int maxElements = 6; HSRecord[] highScore = new HSRecord[maxElements]; int INhighScore = 0; //Num elements in //highScore

Page 83: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 83

High Scores Yet Again

AddScores with objects . . . mark = 0; while (mark <= INhighScore - 1 && highScore[mark].score >= newScore) mark++;

if (mark <= INhighScore - 1) { for (j = INhighScore - 1; j > mark; j--) { highScore[j] = highScore[j - 1]; } highScore[mark] = newRecord; }

moves both scoreand name in asingle instructionnote: it ismoving the references to the score and name!

careful not to “lose”the reference to thenew record

Page 84: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 84

Objects – More Things to Consider

What is contained in a reference that doesn't (yet) point to a valid record?

What happens if you try to access the non-existent record pointed to by such a reference?

Page 85: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 85

Objects – More Things to Consider

New references are initialised to null until you assign a new value to them.

"null" means that the reference variable refers to no object.

Page 86: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 86

MyClass myRef;

myRef = null;myRef.value = 10;

Objects – More Things to Consider

But what happens if you try to access a null reference?

Page 87: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 87

Objects – More Things to Consider

myRef = new myRecord();is missingequivalent tomyRef = null;

compile error

Page 88: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 88

Objects – More Things to Consider

It is not always possible to detect null references at compile time.

After a null reference exception occurs your program crashes and stops running.

Sometimes we won't know if a reference variable is null or not, so how do we handle that?

Page 89: Records Engineering 1D04, Teaching Session 11. © Copyright 2006 David Das, Ryan Lortie, Alan Wassyng1 Records  So far we've seen a number of different

© Copyright 2006 David Das, Ryan Lortie, Alan Wassyng 89

MyClass myRef;

<... myRef might be null ...>

if (myRef != null) myRef.value = 10;

Objects – More Things to Consider

Where necessary, we can avoid crashes by checking our reference variables to ensure that they are non-null before accessing them.