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