Constants Objectives Describe ways to create constants const - - PDF document
Constants Objectives Describe ways to create constants const - - PDF document
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
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) { const double pi = 3.14; return pi * radius * radius; }
constant local variable
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; public const double E = 2.7182818284590452354; ... }
constant 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; public const double E = 2.7182818284590452354; ... }
implicitly static
double radius = 1.5; double area = Math.PI * radius * radius;
access using 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) { const int area = width * height; ... }
error, value must be 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
9
const Person p = null; const Person ann = new Person("Ann");
- k
error
const string greeting = "hello";
- k
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 DateTime dob; public Person(DateTime dob) { this.dob = dob; } ... }
readonly field
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
13 struct Point { public static readonly Point origin = new Point(0, 0); ... }
- k
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
enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }
define enum
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
16
Day d; d = Day.Monday; if (d == Day.Saturday || d == Day.Sunday) Console.WriteLine("weekend");
create variable
Enum underlying type
- Enum uses an underlying type for representation
– default is int – can use any integral type except char
represented using int
enum ErrorCode : byte { DomainError, RangeError }
represented using short
enum Day { 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 { Sunday, // 0 Monday, // 1 Tuesday, // 2 Wednesday, // 3 Thursday, // 4 Friday, // 5 Saturday // 6 } default values enum Day { Sunday = 1, Monday, // 2 Tuesday, // 3 Wednesday, // 4 Thursday = 10, Friday, // 11 Saturday // 12 } specify value
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
19
Day d = (Day)3; int i = (int)d;
convert to Day convert to int
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
ValueType Object Enum user enum
20
Boxing
- Enums are value types
– boxed when used as object – value copied into box
Day d = Day.Monday;
- bject o = d;
...
boxed
- Monday
Monday d
21
Unboxing
- Can extract enum from box
– cast required – System.InvalidCastException thrown if cast fails
Day d = Day.Monday;
- bject o = d;
Day e = (Day)o; ...
unbox
- Monday
Monday e
22
Summary
23
- 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