constants. 2 objectives describe ways to create constants –const –readonly –enum
Post on 21-Dec-2015
227 views
TRANSCRIPT
3
Motivation
• Idea of constant is useful– makes programs more readable– allows more compile time error checking
4
Const
• Keyword const used to indicate compile time constant– applicable to local variables– applicable to fields
5
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;}
constantlocal variable
6
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; ...}
constantfields
7
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; ...}
implicitlystatic
double radius = 1.5;
double area = Math.PI * radius * radius; access usingtype name
8
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 becompile time constant
9
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;
const Person ann = new Person("Ann");
ok
error
const string greeting = "hello";ok
10
No const parameters
• Parameters cannot be const– not value type parameters– not reference type parameters– parameter value is not determined at compile time
double Process(const Person p){ ...}
error, constparametersnot supported
double Average(const int a, const int b){ ...}
error, constparametersnot supported
12
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
13
ok
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); ...}
15
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
16
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;
d = Day.Monday;
if (d == Day.Saturday || d == Day.Sunday) Console.WriteLine("weekend");
create variable
17
Enum underlying type
• Enum uses an underlying type for representation– default is int– can use any integral type except char
representedusing int
enum ErrorCode : byte{ DomainError, RangeError }
representedusing short
enum Day{ Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}
18
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}
defaultvalues
enum Day{ Sunday = 1, Monday, // 2 Tuesday, // 3 Wednesday, // 4 Thursday = 10, Friday, // 11 Saturday // 12}
specifyvalue
19
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;
int i = (int)d;
convert to Day
convert to int
20
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
21
Boxing
• Enums are value types– boxed when used as object– value copied into box
Day d = Day.Monday;
object o = d;...
boxed
o Monday
Mondayd
22
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
Mondaye