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 local variable

const double pi = 3.14;

return pi * radius * radius;

}

5

Const field

• Field can be declared constant – must be initialized inline – value cannot be changed later

constant fields

public class Math {

public const double PI = 3.14159265358979323846; public const double E = 2.7182818284590452354; ...

}

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 {

implicitly static

public const double PI = 3.14159265358979323846; public const double E = 2.7182818284590452354; ...

}

double radius = 1.5;

access using type name

double area = Math.PI * radius * radius;

7

Compile time const

• const provides restrictive notion of constant – value must be computable at compile time

error, value must be compile time constant

void Process(int width, int height) {

const int area = width * height; ...

}

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

ok

error

const Person p = null;

ok

const Person ann = new Person("Ann");

const string greeting = "hello";

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 parameters not supported

double Average(const int a, const int b) {

...

error, const parameters not supported

}

double Process(const Person p) {

...

}

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 field

readonly DateTime dob;

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 {

ok

public static readonly Point origin = new Point(0, 0); ...

}

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

create variable

Day d;

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 using int

represented using short

enum Day {

enum ErrorCode : byte {

DomainError, RangeError

}

Sunday, Monday, Tuesday, Wednesday, 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 {

specify value

default values

Sunday, // 0 Monday, // 1 Tuesday, // 2 Wednesday, // 3 Thursday, // 4 Friday, // 5 Saturday // 6

Sunday = 1, Monday, // 2 Tuesday, // 3 Wednesday, // 4 Thursday = 10, Friday, // 11 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

convert to Day

convert to int

Day d = (Day)3;

int i = (int)d;

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

boxed

Day d = Day.Monday;

Monday d object o = d; ...

o Monday

21

Unboxing

• Can extract enum from box

– cast required – System.InvalidCastException thrown if cast fails

unbox

Day d = Day.Monday; object o = d;

Day e = (Day)o; ... o Monday

Monday e

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