Csphtp1 08

70
2002 Prentice Hall. All rights reserved. 1 Chapter 8 – Object-Based Programming Outline 8.1 Introduction 8.2 Implementing a Time Abstract Data Type with a Class 8.3 Class Scope 8.4 Controlling Access to Members 8.5 Initializing Class Objects: Constructors 8.6 Using Overloaded Constructors 8.7 Properties 8.8 Composition: Objects as Instance Variables of Other Classes 8.9 Using the this Reference 8.10 Garbage Collection 8.11 static Class Members 8.12 const and readonly Members 8.13 Indexers 8.14 Data Abstraction and Information Hiding 8.15 Software Reusability 8.16 Namespaces and Assemblies 8.17 Class View and Object Browser

description

C# how to programing

Transcript of Csphtp1 08

Page 1: Csphtp1 08

2002 Prentice Hall. All rights reserved.

1

Chapter 8 – Object-Based Programming

Outline8.1 Introduction8.2 Implementing a Time Abstract Data Type with a Class8.3 Class Scope8.4 Controlling Access to Members8.5 Initializing Class Objects: Constructors8.6 Using Overloaded Constructors8.7 Properties8.8 Composition: Objects as Instance Variables of Other Classes8.9 Using the this Reference8.10 Garbage Collection8.11 static Class Members8.12 const and readonly Members8.13 Indexers8.14 Data Abstraction and Information Hiding8.15 Software Reusability8.16 Namespaces and Assemblies8.17 Class View and Object Browser

Page 2: Csphtp1 08

2002 Prentice Hall. All rights reserved.

2

8.1 Introduction

• Object classes encapsulate (wrap together) data and methods

• Objects can hide implementation from other objects (information hiding)

• Methods : units of programming• User-defined type: class written by a programmer• Classes have

– Data members (member variable or instance variables)

– Methods that manipulate the data members

Page 3: Csphtp1 08

2002 Prentice Hall. All rights reserved.

3

8.2 Implementing a Time Abstract Data Type with a Class

• Abstract Data Types – hide implementation from other objects

• The opening left brace ({) and closing right brace (}) delimit the body of a class

• Variables inside the class definition but not a method definition are called instance variables

• Member Access Modifiers– public : member is accessible wherever an instance of the

object exists

– private : members is accessible only inside the class definition

Page 4: Csphtp1 08

2002 Prentice Hall. All rights reserved.

4

8.2 Implementing a Time Abstract Data Type with a Class

• Access methods : read or display data• Predicate methods : test the truth of conditions• Constructor

– Initializes objects of the class

– Can take arguments

– Cannot return values

– There may be more then one constructor per class (overloaded constructors)

• Operator new used to instantiate classes• Use Project < Add Class to add a new class to

your project

Page 5: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline5

Time1.cs

1 // Fig. 8.1: Time1.cs2 // Class Time1 maintains time in 24-hour format.3 4 using System;5 6 // Time1 class definition7 public class Time1 : Object8 {9 private int hour; // 0-2310 private int minute; // 0-5911 private int second; // 0-5912 13 // Time1 constructor initializes instance variables to 14 // zero to set default time to midnight15 public Time1()16 {17 SetTime( 0, 0, 0 );18 }19 20 // Set new time value in 24-hour format. Perform validity21 // checks on the data. Set invalid values to zero.22 public void SetTime( 23 int hourValue, int minuteValue, int secondValue )24 {25 hour = ( hourValue >= 0 && hourValue < 24 ) ? 26 hourValue : 0;27 minute = ( minuteValue >= 0 && minuteValue < 60 ) ?28 minuteValue : 0;29 second = ( secondValue >= 0 && secondValue < 60 ) ? 30 secondValue : 0;31 }32

Private instance variablesDefault constructor

Method SetTime

Validate arguments

Page 6: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline6

Time1.cs

33 // convert time to universal-time (24 hour) format string34 public string ToUniversalString()35 {36 return String.Format( 37 "{0:D2}:{1:D2}:{2:D2}", hour, minute, second );38 }39 40 // convert time to standard-time (12 hour) format string41 public string ToStandardString()42 {43 return String.Format( "{0}:{1:D2}:{2:D2} {3}",44 ( ( hour == 12 || hour == 0 ) ? 12 : hour % 12 ),45 minute, second, ( hour < 12 ? "AM" : "PM" ) );46 } 47 48 } // end class Time1

Output time in universal format

Output time in standard format

Page 7: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline7

TimeTest1.cs

1 // Fig. 8.2: TimeTest1.cs2 // Demonstrating class Time1.3 4 using System;5 using System.Windows.Forms;6 7 // TimeTest1 uses creates and uses a Time1 object8 class TimeTest19 {10 // main entry point for application11 static void Main( string[] args )12 {13 Time1 time = new Time1(); // calls Time1 constructor14 string output;15 16 // assign string representation of time to output17 output = "Initial universal time is: " +18 time.ToUniversalString() +19 "\nInitial standard time is: " +20 time.ToStandardString();21 22 // attempt valid time settings23 time.SetTime( 13, 27, 6 );24 25 // append new string representations of time to output26 output += "\n\nUniversal time after SetTime is: " +27 time.ToUniversalString() +28 "\nStandard time after SetTime is: " +29 time.ToStandardString();30 31 // attempt invalid time settings32 time.SetTime( 99, 99, 99 );33

Call default time constructor

Call method SetTime to set the time with valid arguments

Call method SetTime with invalid arguments

Page 8: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline8

TimeTest1.cs

Program Output

34 output += "\n\nAfter attempting invalid settings: " +35 "\nUniversal time: " + time.ToUniversalString() +36 "\nStandard time: " + time.ToStandardString();37 38 MessageBox.Show( output, "Testing Class Time1" );39 40 } // end method Main41 42 } // end class TimeTest1

Page 9: Csphtp1 08

2002 Prentice Hall. All rights reserved.

9

8.3 Class Scope

• All members are accessible within the class’s methods and can be referenced by name

• Outside a class, members cannot be referenced by name, public members may be referenced using the dot operator (referenceName.memberName )

• Method-scope variables– Only accessible within the methods in which they are

defined

– Hide instance variables• Instance variables may be accessed by using the keyword this

and the dot operator (such as this.hour).

Page 10: Csphtp1 08

2002 Prentice Hall. All rights reserved.

10

8.4 Controlling Access to Members

• Public methods present to the class’s clients a view of the services that the class provides

• Methods should perform only one task– If a method needs to perform another task to calculate its result, it

should use a helper method

– The client should not have access to helper methods, thus they should be declared private

• Properties should be used to provide access to data safely (Section 8.7)– Data members should be declared private, with public properties

that allow safe access to them

• Properties– get accessor : enables clients to read data

– set access : enables clients to modify data

Page 11: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline11

RestrictedAccess.cs

Program Output

1 // Fig. 8.3: RestrictedAccess.cs2 // Demonstrate compiler errors from attempt to access 3 // private class members.4 5 class RestrictedAccess6 {7 // main entry point for application8 static void Main( string[] args )9 {10 Time1 time = new Time1();11 12 time.hour = 7;13 time.minute = 15;14 time.second = 30;15 }16 17 } // end class RestrictedAccess

Attempt to access private members

Page 12: Csphtp1 08

2002 Prentice Hall. All rights reserved.

12

8.5 Initializing Class Objects: Constructors

• Instances of classes are initialized by constructors

• Constructors initialize the instance variables of objects

• Overloaded constructors may be used to provide different ways to initialize objects of a class

• Even if the constructor does not explicitly do so, all data members are initialized– Primitive numeric types are set to 0

– Boolean types are set to false

– Reference types are set to null

• If a class has no constructor, a default constructor is provided– It has no code and takes no parameters

Page 13: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline13

Time2.cs

1 // Fig. 8.4: Time2.cs2 // Class Time2 provides overloaded constructors.3 4 using System;5 6 // Time2 class definition7 public class Time28 {9 private int hour; // 0-2310 private int minute; // 0-5911 private int second; // 0-5912 13 // Time2 constructor initializes instance variables to 14 // zero to set default time to midnight15 public Time2()16 {17 SetTime( 0, 0, 0 );18 }19 20 // Time2 constructor: hour supplied, minute and second21 // defaulted to 022 public Time2( int hour ) 23 { 24 SetTime( hour, 0, 0 ); 25 }26 27 // Time2 constructor: hour and minute supplied, second28 // defaulted to 029 public Time2( int hour, int minute ) 30 { 31 SetTime( hour, minute, 0 );32 }33

Default constructor

Constructor which takes the hour as the input

Constructor which takes the hour and minute as input

Page 14: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline14

Time2.cs

66 // convert time to standard-time (12 hour) format string67 public string ToStandardString()68 {69 return String.Format( "{0}:{1:D2}:{2:D2} {3}",70 ( ( hour == 12 || hour == 0 ) ? 12 : hour % 12 ),71 minute, second, ( hour < 12 ? "AM" : "PM" ) );72 } 73 74 } // end class Time2

Page 15: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline15

TimeTest2.cs

1 // Fig. 8.5: TimeTest2.cs2 // Using overloaded constructors.3 4 using System;5 using System.Windows.Forms;6 7 // TimeTest2 demonstrates constructors of class Time28 class TimeTest29 {10 // main entry point for application11 static void Main( string[] args )12 {13 Time2 time1, time2, time3, time4, time5, time6;14 15 time1 = new Time2(); // 00:00:0016 time2 = new Time2( 2 ); // 02:00:0017 time3 = new Time2( 21, 34 ); // 21:34:0018 time4 = new Time2( 12, 25, 42 ); // 12:25:4219 time5 = new Time2( 27, 74, 99 ); // 00:00:0020 time6 = new Time2( time4 ); // 12:25:4221 22 String output = "Constructed with: " +23 "\ntime1: all arguments defaulted" +24 "\n\t" + time1.ToUniversalString() +25 "\n\t" + time1.ToStandardString();26 27 output += "\ntime2: hour specified; minute and " +28 "second defaulted" +29 "\n\t" + time2.ToUniversalString() +30 "\n\t" + time2.ToStandardString();31 32 output += "\ntime3: hour and minute specified; " +33 "second defaulted" +34 "\n\t" + time3.ToUniversalString() +35 "\n\t" + time3.ToStandardString();

Test the constructors

Page 16: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline16

TimeTest2.cs

Program Output

36 37 output += "\ntime4: hour, minute, and second specified" +38 "\n\t" + time4.ToUniversalString() +39 "\n\t" + time4.ToStandardString();40 41 output += "\ntime5: all invalid values specified" +42 "\n\t" + time5.ToUniversalString() +43 "\n\t" + time5.ToStandardString();44 45 output += "\ntime6: Time2 object time4 specified" +46 "\n\t" + time6.ToUniversalString() +47 "\n\t" + time6.ToStandardString();48 49 MessageBox.Show( output,50 "Demonstrating Overloaded Constructors" );51 52 } // end method Main53 54 } // end class TimeTest2

Page 17: Csphtp1 08

2002 Prentice Hall. All rights reserved.

17

8.7 Properties

• Public properties allow clients to:– Get (obtain the values of) private data

– Set (assign values to) private data

• Get accessor– Controls formatting of data

• Set accessor– Ensure that the new value is appropriate for the data member

Page 18: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline18

Time3.cs

1 // Fig. 8.6: Time3.cs2 // Class Time2 provides overloaded constructors.3 4 using System;5 6 // Time3 class definition7 public class Time38 {9 private int hour; // 0-2310 private int minute; // 0-5911 private int second; // 0-5912 13 // Time3 constructor initializes instance variables to 14 // zero to set default time to midnight15 public Time3()16 {17 SetTime( 0, 0, 0 );18 }19 20 // Time3 constructor: hour supplied, minute and second21 // defaulted to 022 public Time3( int hour ) 23 { 24 SetTime( hour, 0, 0 ); 25 }26 27 // Time3 constructor: hour and minute supplied, second28 // defaulted to 029 public Time3( int hour, int minute ) 30 { 31 SetTime( hour, minute, 0 );32 }33

Page 19: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline19

Time3.cs

34 // Time3 constructor: hour, minute and second supplied35 public Time3( int hour, int minute, int second ) 36 { 37 SetTime( hour, minute, second ); 38 }39 40 // Time3 constructor: initialize using another Time3 object41 public Time3( Time3 time )42 {43 SetTime( time.Hour, time.Minute, time.Second );44 }45 46 // Set new time value in 24-hour format. Perform validity47 // checks on the data. Set invalid values to zero.48 public void SetTime( 49 int hourValue, int minuteValue, int secondValue )50 {51 Hour = hourValue; 52 Minute = minuteValue;53 Second = secondValue;54 }55 56 // property Hour57 public int Hour58 {59 get60 {61 return hour;62 }63 64 set65 {66 hour = ( ( value >= 0 && value < 24 ) ? value : 0 );67 }68

Constructor that takes another Time3 object as an argument. New Time3 object is initialized with the values of the argument.

Property Hour

Page 20: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline20

Time3.cs

69 } // end property Hour70 71 // property Minute72 public int Minute73 {74 get75 {76 return minute;77 }78 79 set80 {81 minute = ( ( value >= 0 && value < 60 ) ? value : 0 );82 }83 84 } // end property Minute85 86 // property Second87 public int Second88 {89 get90 {91 return second;92 }93 94 set95 {96 second = ( ( value >= 0 && value < 60 ) ? value : 0 );97 }98 99 } // end property Second100

Property Minute

Property Second

Page 21: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline21

Time3.cs

101 // convert time to universal-time (24 hour) format string102 public string ToUniversalString()103 {104 return String.Format( 105 "{0:D2}:{1:D2}:{2:D2}", Hour, Minute, Second );106 }107 108 // convert time to standard-time (12 hour) format string109 public string ToStandardString()110 {111 return String.Format( "{0}:{1:D2}:{2:D2} {3}",112 ( ( Hour == 12 || Hour == 0 ) ? 12 : Hour % 12 ),113 Minute, Second, ( Hour < 12 ? "AM" : "PM" ) );114 } 115 116 } // end class Time3

Page 22: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline22

TimeTest3.cs

1 // Fig. 8.7: TimeTest3.cs2 // Demonstrating Time3 properties Hour, Minute and Second.3 4 using System;5 using System.Drawing;6 using System.Collections;7 using System.ComponentModel;8 using System.Windows.Forms;9 using System.Data;10 11 // TimeTest3 class definition12 public class TimeTest3 : System.Windows.Forms.Form13 {14 private System.Windows.Forms.Label hourLabel;15 private System.Windows.Forms.TextBox hourTextBox;16 private System.Windows.Forms.Button hourButton;17 18 private System.Windows.Forms.Label minuteLabel;19 private System.Windows.Forms.TextBox minuteTextBox;20 private System.Windows.Forms.Button minuteButton;21 22 private System.Windows.Forms.Label secondLabel;23 private System.Windows.Forms.TextBox secondTextBox;24 private System.Windows.Forms.Button secondButton;25 26 private System.Windows.Forms.Button addButton;27 28 private System.Windows.Forms.Label displayLabel1;29 private System.Windows.Forms.Label displayLabel2;30 31 // required designer variable32 private System.ComponentModel.Container components = null;33 34 private Time3 time;35

Page 23: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline23

TimeTest3.cs

36 public TimeTest3()37 {38 // Required for Windows Form Designer support39 InitializeComponent();40 41 time = new Time3();42 UpdateDisplay();43 }44 45 // Visual Studio .NET generated code46 47 // main entry point for application48 [STAThread]49 static void Main() 50 {51 Application.Run( new TimeTest3() );52 }53 54 // update display labels55 public void UpdateDisplay()56 {57 displayLabel1.Text = "Hour: " + time.Hour + 58 "; Minute: " + time.Minute +59 "; Second: " + time.Second;60 displayLabel2.Text = "Standard time: " +61 time.ToStandardString() + "\nUniversal time: " +62 time.ToUniversalString();63 }64

Page 24: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline24

TimeTest3.cs

65 // set Hour property when hourButton pressed66 private void hourButton_Click( 67 object sender, System.EventArgs e )68 {69 time.Hour = Int32.Parse( hourTextBox.Text );70 hourTextBox.Text = "";71 UpdateDisplay();72 }73 74 // set Minute property when minuteButton pressed75 private void minuteButton_Click(76 object sender, System.EventArgs e )77 {78 time.Minute = Int32.Parse( minuteTextBox.Text );79 minuteTextBox.Text = "";80 UpdateDisplay();81 }82 83 // set Second property when secondButton pressed84 private void secondButton_Click(85 object sender, System.EventArgs e )86 {87 time.Second = Int32.Parse( secondTextBox.Text );88 secondTextBox.Text = "";89 UpdateDisplay(); 90 }91 92 // add one to Second when addButton pressed93 private void addButton_Click(94 object sender, System.EventArgs e )95 {96 time.Second = ( time.Second + 1 ) % 60;97

Set Hour property of Time3 object

Set Minute property of Time3 object

Set Second property of Time3 object

Add 1 second to Time3 object

Page 25: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline25

TimeTest3.cs

Program Output

98 if ( time.Second == 0 )99 {100 time.Minute = ( time.Minute + 1 ) % 60;101 102 if ( time.Minute == 0 )103 time.Hour = ( time.Hour + 1 ) % 24;104 }105 106 UpdateDisplay();107 }108 109 } // end class TimeTest3

Page 26: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline26

TimeTest3.cs Program Output

Page 27: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline27

TimeTest3.cs Program Output

Page 28: Csphtp1 08

2002 Prentice Hall. All rights reserved.

288.8 Composition: Object References as Instance Variables of Other

Classes• Software Reuse – referencing existing object is

easier and faster then rewriting the objects’ code for new classes

• Use user-defined types as instance variables

Page 29: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline29

Date.cs

1 // Fig. 8.8: Date.cs 2 // Date class definition encapsulates month, day and year.3 4 using System;5 6 // Date class definition7 public class Date 8 {9 private int month; // 1-1210 private int day; // 1-31 based on month11 private int year; // any year12 13 // constructor confirms proper value for month;14 // call method CheckDay to confirm proper15 // value for day16 public Date( int theMonth, int theDay, int theYear )17 {18 // validate month19 if ( theMonth > 0 && theMonth <= 12 ) 20 month = theMonth;21 22 else 23 {24 month = 1;25 Console.WriteLine( 26 "Month {0} invalid. Set to month 1.", theMonth );27 }28 29 year = theYear; // could validate year30 day = CheckDay( theDay ); // validate day31 }32

Constructor that receives the month, day and year arguments. Arguments are validated; if they are not valid, the corresponding member is set to a default value

Page 30: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline30

Date.cs

33 // utility method confirms proper day value34 // based on month and year35 private int CheckDay( int testDay )36 {37 int[] daysPerMonth = 38 { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };39 40 // check if day in range for month41 if ( testDay > 0 && testDay <= daysPerMonth[ month ] )42 return testDay;43 44 // check for leap year45 if ( month == 2 && testDay == 29 &&46 ( year % 400 == 0 || 47 ( year % 4 == 0 && year % 100 != 0 ) ) )48 return testDay;49 50 Console.WriteLine( 51 "Day {0} invalid. Set to day 1.", testDay );52 53 return 1; // leave object in consistent state54 }55 56 // return date string as month/day/year57 public string ToDateString()58 { 59 return month + "/" + day + "/" + year; 60 }61 62 } // end class Date

Validate that the given month can have a given day number

Page 31: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline31

Employee.cs

1 // Fig. 8.9: Employee.cs2 // Employee class definition encapsulates employee's first name,3 // last name, birth date and hire date.4 5 using System;6 7 // Employee class definition8 public class Employee9 {10 private string firstName;11 private string lastName;12 private Date birthDate; 13 private Date hireDate;14 15 // constructor initializes name, birth date and hire date16 public Employee( string first, string last, 17 int birthMonth, int birthDay, int birthYear, 18 int hireMonth, int hireDay, int hireYear )19 {20 firstName = first;21 lastName = last;22 23 // create new Date for Employee birth day24 birthDate = new Date( birthMonth, birthDay, birthYear );25 hireDate = new Date( hireMonth, hireDay, hireYear );26 }27 Constructor that initializes the employee’s

name, birth date and hire date

Two Date objects are members of the Employee class

Page 32: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline32

Employee.cs

28 // convert Employee to String format29 public string ToEmployeeString()30 {31 return lastName + ", " + firstName +32 " Hired: " + hireDate.ToDateString() +33 " Birthday: " + birthDate.ToDateString();34 }35 36 } // end class Employee

Page 33: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline33

CompositionTest.cs

Program Output

1 // Fig. 8.10: CompositionTest.cs2 // Demonstrate an object with member object reference.3 4 using System;5 using System.Windows.Forms;6 7 // Composition class definition8 class CompositionTest9 {10 // main entry point for application11 static void Main( string[] args )12 {13 Employee e = 14 new Employee( "Bob", "Jones", 7, 24, 1949, 3, 12, 1988 );15 16 MessageBox.Show( e.ToEmployeeString(), 17 "Testing Class Employee" );18 19 } // end method Main20 21 } // end class CompositionTest

Page 34: Csphtp1 08

2002 Prentice Hall. All rights reserved.

34

8.9 Using the this reference

• Every object can reference itself by using the keyword this

• Often used to distinguish between a method’s variables and the instance variables of an object

Page 35: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline35

Time4.cs

1 // Fig. 8.11: Time4.cs2 // Class Time2 provides overloaded constructors.3 4 using System;5 6 // Time4 class definition7 public class Time4 8 {9 private int hour; // 0-2310 private int minute; // 0-5911 private int second; // 0-5912 13 // constructor14 public Time4( int hour, int minute, int second ) 15 { 16 this.hour = hour;17 this.minute = minute;18 this.second = second;19 }20 21 // create string using this and implicit references22 public string BuildString()23 {24 return "this.ToStandardString(): " + 25 this.ToStandardString() + 26 "\nToStandardString(): " + ToStandardString();27 }28

The this reference is used to set the class member variables to the constructor arguments

The this reference is used to refer to an instance method

Page 36: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline36

Time4.cs

29 // convert time to standard-time (12 hour) format string30 public string ToStandardString()31 {32 return String.Format( "{0}:{1:D2}:{2:D2} {3}",33 ( ( this.hour == 12 || this.hour == 0 ) ? 12 : 34 this.hour % 12 ), this.minute, this.second,35 ( this.hour < 12 ? "AM" : "PM" ) );36 } 37 38 } // end class Time4 The this reference is used to

access member variables

Page 37: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline37

ThisTest.cs

Program Output

1 // Fig. 8.12: ThisTest.cs2 // Using the this reference.3 4 using System;5 using System.Windows.Forms;6 7 // ThisTest class definition8 class Class19 {10 // main entry point for application11 static void Main( string[] args )12 {13 Time4 time = new Time4( 12, 30, 19 );14 15 MessageBox.Show( time.BuildString(), 16 "Demonstrating the \"this\" Reference" );17 }18 }

Page 38: Csphtp1 08

2002 Prentice Hall. All rights reserved.

38

8.10 Garbage Collection

• Operator new allocates memory• When objects are no longer referenced, the CLR

performs garbage collection• Garbage collection helps avoid memory leaks

(running out of memory because unused memory has not been reclaimed)

• Allocation and deallocation of other resources (database connections, file access, etc.) must be explicitly handled by programmers

Page 39: Csphtp1 08

2002 Prentice Hall. All rights reserved.

39

8.10 Garbage Collection

• Use finalizers in conjunction with the garbage collector to release resources and memory

• Before garbage collector reclaims an object’s memory, it calls the object’s finalizer

• Each class has only one finalizer (also called destructor)

• Name of a destructor is the ~ character, followed by the class name

• Destructors do not receive any arguments

Page 40: Csphtp1 08

2002 Prentice Hall. All rights reserved.

40

8.11 static Class Members

• Every object of a class has its own copy of all instance variables

• Sometimes it is useful if all instances of a class share the same copy of a variable

• Declare variables using keyword static to create only one copy of the variable at a time (shared by all objects of the type)

• Scope may be defined for static variables (public, private, etc.)

Page 41: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline41

Employee.cs

1 // Fig. 8.13: Employee.cs2 // Employee class contains static data and a static method.3 4 using System;5 6 // Employee class definition7 public class Employee8 {9 private string firstName;10 private string lastName;11 private static int count; // Employee objects in memory12 13 // constructor increments static Employee count14 public Employee( string fName, string lName )15 {16 firstName = fName;17 lastName = lName;18 19 ++count;20 21 Console.WriteLine( "Employee object constructor: " +22 firstName + " " + lastName + "; count = " + Count ); 23 }24 25 // destructor decrements static Employee count26 ~Employee()27 {28 --count;29 30 Console.WriteLine( "Employee object destructor: " +31 firstName + " " + lastName + "; count = " + Count );32 }33

Employee destructor

Decrease static member count, to signify that there is one less employee

Update number of Employees

Page 42: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline42

Employee.cs

34 // FirstName property35 public string FirstName36 {37 get38 {39 return firstName;40 }41 }42 43 // LastName property44 public string LastName45 {46 get47 {48 return lastName;49 }50 }51 52 // static Count property53 public static int Count54 {55 get56 {57 return count;58 }59 }60 61 } // end class Employee

Page 43: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline43

StaticTest.cs

1 // Fig. 8.14: StaticTest.cs2 // Demonstrating static class members.3 4 using System;5 6 // StaticTest class definition7 class StaticTest8 {9 // main entry point for application10 static void Main( string[] args )11 {12 Console.WriteLine( "Employees before instantiation: " +13 Employee.Count + "\n" );14 15 // create two Employees16 Employee employee1 = new Employee( "Susan", "Baker" );17 Employee employee2 = new Employee( "Bob", "Jones" );18 19 Console.WriteLine( "\nEmployees after instantiation: " +20 "Employee.Count = " + Employee.Count + "\n" );21 22 // display the Employees 23 Console.WriteLine( "Employee 1: " + 24 employee1.FirstName + " " + employee1.LastName +25 "\nEmployee 2: " + employee2.FirstName +26 " " + employee2.LastName + "\n" );27 28 // mark employee1 and employee1 objects for 29 // garbage collection30 employee1 = null;31 employee2 = null;32 33 // force garbage collection34 System.GC.Collect();35

Create 2 Employee objects

Set Employee objects to null

Force garbage collection

Page 44: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline44

StaticTest.cs

Program Output

36 Console.WriteLine( 37 "\nEmployees after garbage collection: " +38 Employee.Count );39 }40 }

Employees before instantiation: 0 Employee object constructor: Susan Baker; count = 1Employee object constructor: Bob Jones; count = 2 Employees after instantiation: Employee.Count = 2 Employee 1: Susan BakerEmployee 2: Bob Jones Employee object destructor: Bob Jones; count = 1Employee object destructor: Susan Baker; count = 0 Employees after garbage collection: 2

Page 45: Csphtp1 08

2002 Prentice Hall. All rights reserved.

45

8.12 const and readonly Members

• Declare constant members (members whose value will never change) using the keyword const

• const members are implicitly static• const members must be initialized when they are

declared• Use keyword readonly to declare members who

will be initialized in the constructor but not change after that

Page 46: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline46

UsingConstAndReadOnly.cs

1 // Fig. 8.15: UsingConstAndReadOnly.cs2 // Demonstrating constant values with const and readonly.3 4 using System;5 using System.Windows.Forms;6 7 // Constants class definition8 public class Constants9 {10 // PI is constant variable11 public const double PI = 3.14159;12 13 // radius is a constant variable14 // that is uninitialized15 public readonly int radius;16 17 public Constants( int radiusValue )18 {19 radius = radiusValue;20 }21 22 } // end class Constants23 24 // UsingConstAndReadOnly class definition25 public class UsingConstAndReadOnly26 {27 // method Main creates Constants 28 // object and displays it's values29 static void Main( string[] args )30 { 31 Random random = new Random();32 33 Constants constantValues = 34 new Constants( random.Next( 1, 20 ) );35

Constant variable PI

Readonly variable radius; must be initialized in constructor

Initialize readonly member radius

Page 47: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline47

UsingConstAndReadOnly.cs

Program Output

36 MessageBox.Show( "Radius = " + constantValues.radius + 37 "\nCircumference = " + 38 2 * Constants.PI * constantValues.radius,39 "Circumference" );40 41 } // end method Main42 43 } // end class UsingConstAndReadOnly

Page 48: Csphtp1 08

2002 Prentice Hall. All rights reserved.

48

8.13 Indexers

• Sometimes a classes encapsulates data which is like a list of elements

• Indexers are special properties that allow array-style access to the data in the class

• Indexers can be defined to accept both integer and non-integer subscripts

• Defined using the keyword this• When using indexers, programmers use the

bracket ([]) notation, as with arrays, for get and set accessors

Page 49: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline49

IndexerTest.cs

1 // Fig. 8.10: IndexerTest.cs2 // Indexers provide access to an object's members via a 3 // subscript operator.4 5 using System;6 using System.Drawing;7 using System.Collections;8 using System.ComponentModel;9 using System.Windows.Forms;10 using System.Data;11 12 // Box class definition represents a box with length, 13 // width and height dimensions14 public class Box15 {16 private string[] names = { "length", "width", "height" };17 private double[] dimensions = new double[ 3 ];18 19 // constructor20 public Box( double length, double width, double height ) 21 {22 dimensions[ 0 ] = length;23 dimensions[ 1 ] = width;24 dimensions[ 2 ] = height;25 }26 27 // access dimensions by index number28 public double this[ int index ]29 {30 get31 {32 return ( index < 0 || index > dimensions.Length ) ?33 -1 : dimensions[ index ];34 }35

Indexer declaration; indexer receives an integer to specify which dimension is wanted

The get index accessor

If the index requested is out of bounds, return –1; otherwise, return the appropriate element

Page 50: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline50

IndexerTest.cs

36 set37 {38 if ( index >= 0 && index < dimensions.Length )39 dimensions[ index ] = value;40 }41 42 } // end numeric indexer43 44 // access dimensions by their names45 public double this[ string name ]46 {47 get48 {49 // locate element to get50 int i = 0;51 52 while ( i < names.Length && 53 name.ToLower() != names[ i ] )54 i++;55 56 return ( i == names.Length ) ? -1 : dimensions[ i ];57 }58 59 set60 {61 // locate element to set62 int i = 0;63 64 while ( i < names.Length && 65 name.ToLower() != names[ i ] )66 i++;67

The set accessor for the index

Validate that the user wishes to set a valid index in the array and then set it

Indexer that takes the name of the dimension as an argument

Page 51: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline51

IndexerTest.cs

68 if ( i != names.Length )69 dimensions[ i ] = value;70 }71 72 } // end indexer73 74 } // end class Box75 76 // Class IndexerTest77 public class IndexerTest : System.Windows.Forms.Form78 {79 private System.Windows.Forms.Label indexLabel;80 private System.Windows.Forms.Label nameLabel;81 82 private System.Windows.Forms.TextBox indexTextBox;83 private System.Windows.Forms.TextBox valueTextBox;84 85 private System.Windows.Forms.Button nameSetButton;86 private System.Windows.Forms.Button nameGetButton;87 88 private System.Windows.Forms.Button intSetButton;89 private System.Windows.Forms.Button intGetButton;90 91 private System.Windows.Forms.TextBox resultTextBox;92 93 // required designer variable94 private System.ComponentModel.Container components = null;95 96 private Box box;97 98 // constructor99 public IndexerTest()100 {101 // required for Windows Form Designer support102 InitializeComponent();

Page 52: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline52

IndexerTest.cs

103 104 // create block105 box = new Box( 0.0, 0.0, 0.0 );106 }107 108 // Visual Studio .NET generated code109 110 // main entry point for application111 [STAThread]112 static void Main() 113 {114 Application.Run( new IndexerTest() );115 }116 117 // display value at specified index number118 private void ShowValueAtIndex( string prefix, int index )119 {120 resultTextBox.Text = 121 prefix + "box[ " + index + " ] = " + box[ index ];122 }123 124 // display value with specified name125 private void ShowValueAtIndex( string prefix, string name )126 {127 resultTextBox.Text = 128 prefix + "box[ " + name + " ] = " + box[ name ];129 }130 131 // clear indexTextBox and valueTextBox132 private void ClearTextBoxes()133 {134 indexTextBox.Text = "";135 valueTextBox.Text = "";136 }137

Use the get accessor of the indexer

Use the set accessor of the indexer

Page 53: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline53

IndexerTest.cs

138 // get value at specified index139 private void intGetButton_Click( 140 object sender, System.EventArgs e )141 {142 ShowValueAtIndex( 143 "get: ", Int32.Parse( indexTextBox.Text ) );144 ClearTextBoxes();145 }146 147 // set value at specified index148 private void intSetButton_Click(149 object sender, System.EventArgs e )150 {151 int index = Int32.Parse( indexTextBox.Text );152 box[ index ] = Double.Parse( valueTextBox.Text );153 154 ShowValueAtIndex( "set: ", index );155 ClearTextBoxes();156 }157 158 // get value with specified name159 private void nameGetButton_Click( 160 object sender, System.EventArgs e )161 {162 ShowValueAtIndex( "get: ", indexTextBox.Text );163 ClearTextBoxes();164 }165

Use integer indexer to get value

Use integer indexer to set value

Use string indexer to get value

Page 54: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline54

IndexerTest.cs

Program Output

166 // set value with specified name167 private void nameSetButton_Click(168 object sender, System.EventArgs e )169 {170 box[ indexTextBox.Text ] = 171 Double.Parse( valueTextBox.Text );172 173 ShowValueAtIndex( "set: ", indexTextBox.Text );174 ClearTextBoxes();175 }176 177 } // end class IndexerTest

Before setting value by index number

After setting value by index number

Use string indexer to set value

Page 55: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline55

IndexerTest.cs Program Output

Before getting value by dimension name

After getting value by dimension name

Before setting value by dimension name

Page 56: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline56

IndexerTest.cs Program Output

After setting value by dimension name

Before getting value by index number

After getting value by index number

Page 57: Csphtp1 08

2002 Prentice Hall. All rights reserved.

57

8.14 Data Abstraction and Information Hiding

• Classes should hide implementation details• Stacks

– Last-in, first-out (LIFO)

– Items are pushed onto the top of the stack

– Items are popped off the top of the stack

• Queues– Similar to a waiting line

– First-in, first-out (FIFO)

– Items are enqueued (added to the end)

– Items are dequeued (taken off the front)

Page 58: Csphtp1 08

2002 Prentice Hall. All rights reserved.

58

8.15 Software Reusability

• The Framework Class Library (FCL) contains thousands of predefined classes

• The FCL classes should be used whenever possible– No bugs

– Optimized

– Well-documented

• Reusing code facilitates Rapid Application Development (RAD)

Page 59: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline59

TimeLibrary.cs

1 // Fig. 8.17: TimeLibrary.cs2 // Placing class Time3 in an assembly for reuse.3 4 using System;5 6 namespace TimeLibrary7 {8 // Time3 class definition9 public class Time310 {11 private int hour; // 0-2312 private int minute; // 0-5913 private int second; // 0-5914 15 // Time3 constructor initializes instance variables to 16 // zero to set default time to midnight17 public Time3()18 {19 SetTime( 0, 0, 0 );20 }21 22 // Time3 constructor: hour supplied, minute and second23 // defaulted to 024 public Time3( int hour ) 25 { 26 SetTime( hour, 0, 0 ); 27 }28 29 // Time3 constructor: hour and minute supplied, second30 // defaulted to 031 public Time3( int hour, int minute ) 32 { 33 SetTime( hour, minute, 0 );34 }35

Page 60: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline60

TimeLibrary.cs

36 // Time3 constructor: hour, minute and second supplied37 public Time3( int hour, int minute, int second ) 38 { 39 SetTime( hour, minute, second ); 40 }41 42 // Time3 constructor: initialize using another Time3 object43 public Time3( Time3 time )44 {45 SetTime( time.Hour, time.Minute, time.Second );46 }47 48 // Set new time value in 24-hour format. Perform validity49 // checks on the data. Set invalid values to zero.50 public void SetTime( 51 int hourValue, int minuteValue, int secondValue )52 {53 Hour = hourValue; 54 Minute = minuteValue;55 Second = secondValue;56 }57 58 // property Hour59 public int Hour60 {61 get62 {63 return hour;64 }65 66 set67 {68 hour = ( ( value >= 0 && value < 24 ) ? value : 0 );69 }70

Page 61: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline61

TimeLibrary.cs

71 } // end property Hour72 73 // property Minute74 public int Minute75 {76 get77 {78 return minute;79 }80 81 set82 {83 minute = ( ( value >= 0 && value < 60 ) ? value : 0 );84 }85 86 } // end property Minute87 88 // property Second89 public int Second90 {91 get92 {93 return second;94 }95 96 set97 {98 second = ( ( value >= 0 && value < 60 ) ? value : 0 );99 }100 101 } // end property Second102

Page 62: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline62

TimeLibrary.cs

103 // convert time to universal-time (24 hour) format string104 public string ToUniversalString()105 {106 return String.Format( 107 "{0:D2}:{1:D2}:{2:D2}", Hour, Minute, Second );108 }109 110 // convert time to standard-time (12 hour) format string111 public string ToStandardString()112 {113 return String.Format( "{0}:{1:D2}:{2:D2} {3}",114 ( ( Hour == 12 || Hour == 0 ) ? 12 : Hour % 12 ),115 Minute, Second, ( Hour < 12 ? "AM" : "PM" ) );116 } 117 118 } // end class Time3119 }

Page 63: Csphtp1 08

2002 Prentice Hall. All rights reserved.

63

8.16 Namespaces and Assemblies

• Software components should be reusable• Namespaces provide logical grouping of classes• No two classes in the same namespace may have

the same name• Classes in different namespaces may have the

same name• Dynamic Link Libraries (.dll files) allow classes to

be packaged for reuse

Page 64: Csphtp1 08

2002 Prentice Hall. All rights reserved.

64

8.16 Namespaces and Assemblies

Fig. 8.18 Simple Class Library.

Page 65: Csphtp1 08

2002 Prentice Hall.All rights reserved.

Outline65

AssemblyTest.cs

Program Output

1 // Fig. 8.19: AssemblyTest.cs2 // Using class Time3 from assembly TimeLibrary.3 4 using System;5 using TimeLibrary;6 7 // AssemblyTest class definition8 class AssemblyTest9 {10 // main entry point for application11 static void Main( string[] args )12 {13 Time3 time = new Time3( 13, 27, 6 );14 15 Console.WriteLine( 16 "Standard time: {0}\nUniversal time: {1}\n",17 time.ToStandardString(), time.ToUniversalString() );18 }19 }

Standard time: 1:27:06 PMUniversal time: 13:27:06

Reference the TimeLibrary namespace

Use Time3 as usual

Page 66: Csphtp1 08

2002 Prentice Hall. All rights reserved.

66

8.17 Class View and Object Browser

• Class View and Object Browser are features of Visual Studio that facilitate the design of object-oriented applications

• Class View– Displays variables and methods for all classes in a project

– Displays as treeview hierarchical structure

– + at nodes allows nodes to be expanded

– - at nodes allows nodes to be collapsed

– Can be seen by selecting View < Class View

Page 67: Csphtp1 08

2002 Prentice Hall. All rights reserved.

67

8.17 Class View and Object Browser

• Object Browser– Lists all classes in a library

– Helps developers learn about the functionality of a specific class

– To view the Object Browser select any .NET FCL method and select Go To Definition

Page 68: Csphtp1 08

2002 Prentice Hall. All rights reserved.

68

8.17 Class View and Object Browser

Fig. 8.20 Class View of class Time1 (Fig. 8.1) and class TimeTest (Fig. 8.2).

Page 69: Csphtp1 08

2002 Prentice Hall. All rights reserved.

69

8.17 Class View and Object Browser

Fig. 8.21 Object Browser when user selects Object from Time1.cs. (part 1)

Page 70: Csphtp1 08

2002 Prentice Hall. All rights reserved.

70

8.17 Class View and Object Browser

Fig. 8.21 Object Browser when user selects Object from Time1.cs. (part 1)