Creating and Destroying
Objects
Overview
 Using Constructors
 Initializing Data
 Objects and Memory
 Resource Management
Using Constructors
 Creating Objects
 Using the Default Constructor
 Overriding the Default Constructor
 Overloading Constructors
Creating Objects
 Step 1: Allocating memory
 Use new keyword to allocate memory from the heap
 Step 2: Initializing the object by using a constructor
 Use the name of the class followed by parentheses
Date when = new Date( );
Using the Default Constructor
 Features of a default constructor
 Public accessibility
 Same name as the class
 No return type—not even void
 Expects no arguments
 Initializes all fields to zero, false or null
 Constructor syntax
class Date { public Date( ) { ... } }
Overriding the Default
Constructor
 The default constructor might be inappropriate
 If so, do not use it; write your own!
class Date
{
public Date( )
{
ccyy = 1970;
mm = 1;
dd = 1;
}
private int ccyy, mm, dd;
}
Overloading Constructors
 Constructors are methods and can be overloaded
 Same scope, same name, different parameters
 Allows objects to be initialized in different ways
 WARNING
 If you write a constructor for a class, the compiler does not
create a default constructor
class Date
{
public Date( ) { ... }
public Date(int year, int month, int day) { ... }
...
}
Initializing Data
 Using Initializer Lists
 Declaring Readonly Variables and Constants
 Initializing Readonly Fields
 Declaring a Constructor for a Struct
 Using Private Constructors
 Using Static Constructors
Using Initializer Lists
 Overloaded constructors might contain duplicate code
 Refactor by making constructors call each other
 Use the this keyword in an initializer list
class Date
{
...
public Date( ) : this(1970, 1, 1) { }
public Date(int year, int month, int day) { ... }
}
 Value of constant field is
obtained at compile time
 Value of readonly
field is obtained at
run time
Declaring Readonly Variables and
Constants
Initializing Readonly Fields
 Readonly fields must be initialized
 Implicitly to zero, false or null
 Explicitly at their declaration in a variable initializer
 Explicitly inside an instance constructor
class SourceFile
{
private readonly ArrayList lines;
}
Declaring a Constructor for a
Struct
 The compiler
 Always generates a default constructor. Default constructors
automatically initialize all fields to zero.
 The programmer
 Can declare constructors with one or more arguments.
Declared constructors do not automatically initialize fields to
zero.
 Can never declare a default constructor.
 Can never declare a protected constructor.
Using Private Constructors
 A private constructor prevents unwanted objects from
being created
 Instance methods cannot be called
 Static methods can be called
 A useful way of implementing procedural functions
public class Math
{
public static double Cos(double x) { ... }
public static double Sin(double x) { ... }
private Math( ) { }
}
Using Static Constructors
 Purpose
 Called by the class loader at run time
 Can be used to initialize static fields
 Guaranteed to be called before instance constructor
 Restrictions
 Cannot be called
 Cannot have an access modifier
 Must be parameterless
Objects and Memory
 Object Lifetime
 Objects and Scope
 Garbage Collection
Object Lifetime
 Creating objects
 You allocate memory by using new
 You initialize an object in that memory by using a
constructor
 Using objects
 You call methods
 Destroying objects
 The object is converted back into memory
 The memory is de-allocated
Objects and Scope
 The lifetime of a local value is tied to the scope in which
it is declared
 Short lifetime (typically)
 Deterministic creation and destruction
 The lifetime of a dynamic object is not tied to its scope
 A longer lifetime
 A non-deterministic destruction
Garbage Collection
 You cannot explicitly destroy objects
 C# does not have an opposite of new (such as delete)
 This is because an explicit delete function is a prime source
of errors in other languages
 Garbage collection destroys objects for you
 It finds unreachable objects and destroys them for you
 It finalizes them back to raw unused heap memory
 It typically does this when memory becomes low
Resource Management
 Object Cleanup
 Writing Destructors
 Warnings About Destructor Timing
 IDisposable Interface and Dispose Method
 The using Statement in C#
Object Cleanup
 The final actions of different objects will be different
 They cannot be determined by garbage collection.
 Objects in .NET Framework have a Finalize method.
 If present, garbage collection will call destructor before
reclaiming the raw memory.
 In C#, implement a destructor to write cleanup code. You
cannot call or override Object.Finalize.
Writing Destructors
 A destructor is the mechanism for cleanup
 It has its own syntax:
 - No access modifier
 - No return type, not even void
 - Same name as name of class with leading ~
 - No parameters
class SourceFile
{
~SourceFile( ) { ... }
}
Warnings About Destructor
Timing
 The order and timing of destruction is undefined
 Not necessarily the reverse of construction
 Destructors are guaranteed to be called
 Cannot rely on timing
 Avoid destructors if possible
 Performance costs
 Complexity
 Delay of memory resource release
IDisposable Interface and Dispose
Method
 To reclaim a resource:
 Inherit from IDisposable Interface and implement Dispose
method that releases resources
 Call GC.SuppressFinalize method
 Ensure that calling Dispose more than once is benign
 Ensure that you do not try to use a reclaimed resource
The using Statement in C#
 Syntax
 Dispose is automatically called at the end of the using
block
using (Resource r1 = new Resource( ))
{
r1.Method( );
}
Review
 Using Constructors
 Initializing Data
 Objects and Memory
 Resource Management

Module 10 : creating and destroying objects

  • 1.
  • 2.
    Overview  Using Constructors Initializing Data  Objects and Memory  Resource Management
  • 3.
    Using Constructors  CreatingObjects  Using the Default Constructor  Overriding the Default Constructor  Overloading Constructors
  • 4.
    Creating Objects  Step1: Allocating memory  Use new keyword to allocate memory from the heap  Step 2: Initializing the object by using a constructor  Use the name of the class followed by parentheses Date when = new Date( );
  • 5.
    Using the DefaultConstructor  Features of a default constructor  Public accessibility  Same name as the class  No return type—not even void  Expects no arguments  Initializes all fields to zero, false or null  Constructor syntax class Date { public Date( ) { ... } }
  • 6.
    Overriding the Default Constructor The default constructor might be inappropriate  If so, do not use it; write your own! class Date { public Date( ) { ccyy = 1970; mm = 1; dd = 1; } private int ccyy, mm, dd; }
  • 7.
    Overloading Constructors  Constructorsare methods and can be overloaded  Same scope, same name, different parameters  Allows objects to be initialized in different ways  WARNING  If you write a constructor for a class, the compiler does not create a default constructor class Date { public Date( ) { ... } public Date(int year, int month, int day) { ... } ... }
  • 8.
    Initializing Data  UsingInitializer Lists  Declaring Readonly Variables and Constants  Initializing Readonly Fields  Declaring a Constructor for a Struct  Using Private Constructors  Using Static Constructors
  • 9.
    Using Initializer Lists Overloaded constructors might contain duplicate code  Refactor by making constructors call each other  Use the this keyword in an initializer list class Date { ... public Date( ) : this(1970, 1, 1) { } public Date(int year, int month, int day) { ... } }
  • 10.
     Value ofconstant field is obtained at compile time  Value of readonly field is obtained at run time Declaring Readonly Variables and Constants
  • 11.
    Initializing Readonly Fields Readonly fields must be initialized  Implicitly to zero, false or null  Explicitly at their declaration in a variable initializer  Explicitly inside an instance constructor class SourceFile { private readonly ArrayList lines; }
  • 12.
    Declaring a Constructorfor a Struct  The compiler  Always generates a default constructor. Default constructors automatically initialize all fields to zero.  The programmer  Can declare constructors with one or more arguments. Declared constructors do not automatically initialize fields to zero.  Can never declare a default constructor.  Can never declare a protected constructor.
  • 13.
    Using Private Constructors A private constructor prevents unwanted objects from being created  Instance methods cannot be called  Static methods can be called  A useful way of implementing procedural functions public class Math { public static double Cos(double x) { ... } public static double Sin(double x) { ... } private Math( ) { } }
  • 14.
    Using Static Constructors Purpose  Called by the class loader at run time  Can be used to initialize static fields  Guaranteed to be called before instance constructor  Restrictions  Cannot be called  Cannot have an access modifier  Must be parameterless
  • 15.
    Objects and Memory Object Lifetime  Objects and Scope  Garbage Collection
  • 16.
    Object Lifetime  Creatingobjects  You allocate memory by using new  You initialize an object in that memory by using a constructor  Using objects  You call methods  Destroying objects  The object is converted back into memory  The memory is de-allocated
  • 17.
    Objects and Scope The lifetime of a local value is tied to the scope in which it is declared  Short lifetime (typically)  Deterministic creation and destruction  The lifetime of a dynamic object is not tied to its scope  A longer lifetime  A non-deterministic destruction
  • 18.
    Garbage Collection  Youcannot explicitly destroy objects  C# does not have an opposite of new (such as delete)  This is because an explicit delete function is a prime source of errors in other languages  Garbage collection destroys objects for you  It finds unreachable objects and destroys them for you  It finalizes them back to raw unused heap memory  It typically does this when memory becomes low
  • 19.
    Resource Management  ObjectCleanup  Writing Destructors  Warnings About Destructor Timing  IDisposable Interface and Dispose Method  The using Statement in C#
  • 20.
    Object Cleanup  Thefinal actions of different objects will be different  They cannot be determined by garbage collection.  Objects in .NET Framework have a Finalize method.  If present, garbage collection will call destructor before reclaiming the raw memory.  In C#, implement a destructor to write cleanup code. You cannot call or override Object.Finalize.
  • 21.
    Writing Destructors  Adestructor is the mechanism for cleanup  It has its own syntax:  - No access modifier  - No return type, not even void  - Same name as name of class with leading ~  - No parameters class SourceFile { ~SourceFile( ) { ... } }
  • 22.
    Warnings About Destructor Timing The order and timing of destruction is undefined  Not necessarily the reverse of construction  Destructors are guaranteed to be called  Cannot rely on timing  Avoid destructors if possible  Performance costs  Complexity  Delay of memory resource release
  • 23.
    IDisposable Interface andDispose Method  To reclaim a resource:  Inherit from IDisposable Interface and implement Dispose method that releases resources  Call GC.SuppressFinalize method  Ensure that calling Dispose more than once is benign  Ensure that you do not try to use a reclaimed resource
  • 24.
    The using Statementin C#  Syntax  Dispose is automatically called at the end of the using block using (Resource r1 = new Resource( )) { r1.Method( ); }
  • 25.
    Review  Using Constructors Initializing Data  Objects and Memory  Resource Management