Constants
Objectives • Describe ways to create constants – const – readonly – enum 2
Motivation • Idea of constant is useful – makes programs more readable – allows more compile time error checking 3
Const Keyword const used to indicate compile time constant • – applicable to local variables – applicable to fields 4
Const local variable • Local variable can be declared constant – must be initialized inline – value cannot be changed later double Area(double radius) { constant const double pi = 3.14; local variable return pi * radius * radius; } 5
Const field • Field can be declared constant – must be initialized inline – value cannot be changed later public class Math { public const double PI = 3.14159265358979323846; constant public const double E = 2.7182818284590452354; fields ... } 6
Const and static Field cannot be both declared both const and static • – not needed – const field automatically static – saves memory by generating single copy public class Math { public const double PI = 3.14159265358979323846; implicitly public const double E = 2.7182818284590452354; static ... } double radius = 1.5; access using double area = Math.PI * radius * radius; type name 7
Compile time const • const provides restrictive notion of constant – value must be computable at compile time void Process(int width, int height) { error, value must be const int area = width * height; compile time constant ... } 8
Limited const references Value for const reference must be compile time constant • – references can only be null – too limited to be truly useful • Works for strings since compile time literals exist const Person p = null; ok const Person ann = new Person("Ann"); error const string greeting = "hello"; ok 9
No const parameters Parameters cannot be const • – not value type parameters – not reference type parameters – parameter value is not determined at compile time error, const double Average(const int a, const int b) parameters { not supported ... } error, const double Process(const Person p) parameters { not supported ... } 10
Readonly Keyword readonly used to indicate runtime constant • – applicable only to fields 11
Readonly field Field can be declared readonly • – can only be initialized using variable initializer or in constructor – value cannot be changed later – compiler warning if not set – value used for initialization can be determined at runtime class Person { readonly DateTime dob; readonly field public Person(DateTime dob) { this.dob = dob; } ... } 12
Readonly and static Fields often made both readonly and static • – more flexible than const – prevents write access – allows runtime determination of value – saves memory by generating single copy struct Point { public static readonly Point origin = new Point(0, 0); ok ... } 13
Enum Keyword enum used to create new type • – with corresponding set of symbolic constants 14
Enum definition • Can create enumeration value type – use keyword enum – specify type name – give list of named constants define enum enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } 15
Enum use • Can create variables of enum type – use enum name as type name • Can use values listed in enum – values are scoped inside enum – prefix with enum name for access Day d; create variable d = Day.Monday; if (d == Day.Saturday || d == Day.Sunday) Console.WriteLine("weekend"); 16
Enum underlying type • Enum uses an underlying type for representation – default is int – can use any integral type except char represented enum Day using int { represented Sunday, enum ErrorCode : byte using short Monday, { Tuesday, DomainError, Wednesday, RangeError Thursday, } Friday, Saturday } 17
Enum values • Enum constants have values – default is sequential starting at 0 – can explicitly specify any value and others follow in sequence enum Day enum Day { { default specify Sunday, // 0 Sunday = 1, values value Monday, // 1 Monday, // 2 Tuesday, // 2 Tuesday, // 3 Wednesday, // 3 Wednesday, // 4 Thursday, // 4 Thursday = 10, Friday, // 5 Friday, // 11 Saturday // 6 Saturday // 12 } } 18
Enum and casting • Must cast to convert between enum and underlying type – cast needed in either direction – helps reduce chance of assigning invalid value Day d = (Day)3; convert to Day int i = (int)d; convert to int 19
Enum inheritance hierarchy • enum is part of type hierarchy – ultimately descends from Object like all types – automatically derived from the value type Enum – Enum class provides many convenient utility methods Object ValueType Enum user enum 20
Boxing • Enums are value types – boxed when used as object – value copied into box Day d = Day.Monday; object o = d; boxed d Monday ... o Monday 21
Unboxing Can extract enum from box • – cast required – System.InvalidCastException thrown if cast fails Day d = Day.Monday; object o = d; Day e = (Day)o; unbox ... o Monday e Monday 22
Summary • Three different techniques to create constants – const – readonly – enum • static often combined with readonly on field – gives more flexible notion of constant than const keyword 23
Recommend
More recommend