按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
problem that we encountered when adding 2 billion and 2 billion。
…………………………………………………………Page 63……………………………………………………………
CH A PT E R 2 ■ L E A R N I N G A B OU T 。 N E T N U M B E R AN D V A L U E T Y P E S 41
Figure 2…13。 How a puter counts to 7
The bad part of an odometer is that you don’t know when the odometer has been wrapped
around。 You could end up with a car whose odometer read 100;000 miles/kilometers; but actu
ally had driven 1。1 million。 Fortunately; knows when the number type has been wrapped
around。 The technical jargon for this situation is overflow or underflow。 Overflow is when the
odometer wraps over in the positive direction (900;000 to 1。1 million); and underflow is when
the odometer wraps around in the negative direction (0 to –100;000)。 Detection of either situa
tion is activated as a project property。 Follow these steps to deactivate overflow/underflow
detection for the Calculator class library:
1。 Right…click the Calculator project in the Calculator solution and select Properties。
2。 Click pile; and then click Advanced pile Options。
3。 Check “Remove integer overflow tests” to remove the test for overflow situations。
4。 Click OK to finish。
Rerun the test console application; and you will get an exception indicating that an over
flow has occurred。
Error found(…294967296) should have been (4000000000)
Having an overflow situation is a problem; and the fact that can catch it is a good
thing。 But at the end of the day; our preferred solution is to be able to add 2 billion plus 2 billion。
After all; Bill Gates would probably prefer having 4 billion in his bank account instead of the
calculated minus value or an error indicating that the bank cannot accept his 4 billion。
…………………………………………………………Page 64……………………………………………………………
42 CH AP T E R 2 ■ L E A R N IN G AB OU T 。 N E T N U M B E R A N D V A L U E T Y P E S
Understanding Numeric and Value Data Types
A data type is a way of describing a piece of data using a metadescription。 For example; if you
have a Double type; you know you will have a double number。 Many data types are available:
Integer; Long; Short; Single; Double; String; Enum; Structure; and so on。 You can even define your
own data types。 Data types are the heart of the CLR and a type…safe programming environment。
Understanding Value and Reference Types
The CLR supports two ways of representing data: value and reference。 The major difference
between a value and reference type is how the information associated with the type is stored。
The problem with value and reference types is that they are a technical invention and can be
confusing。
When the CLR runs an application; a thread is executing the mon Language Infra
structure (CLI)。 Think of a thread as you wandering around a mall buying things。 You are an
individual and can buy things independently of other people。 The store will have many people
looking around and buying different things。 Likewise; a puter has many threads doing
many different independent things。 When you look around in a store; you might bump into
people and cause them to drop things。 While the CLR tries to avoid such problems; if you try
hard enough in your code; you can cause other threads to “drop” things。
When it executes; a thread has a local memory pool called a stack; which is akin to you
carrying a wallet that contains cash and credit cards。 You carry the wallet with you from store
to store; like a thread carries a stack when calling one method to another。 When you enter the
store and want to purchase something; you have two major ways of paying for the item: with
cash or by using a credit/debit card。 However; with a credit/debit card; you can’t pay immedi
ately。 You need a machine that calls a server to verify that your piece of plastic has enough money
to pay for the item。 Paying with cash is much faster than paying with a credit card; because you
don’t need to talk to a remote puter。
Now suppose you and your spouse want to pay for the item。 You could use the same credit
card account; but you have unique credit cards。 But you cannot do the same thing with cash。
If you have a 10 bill; your spouse cannot share the 10 with you。 Your spouse would need a
second 10 bill; and together you would have 20。
The cash and credit card payment methods are analogous to value and reference types。
Cash is a value type; and the credit card is a reference type。 When the CLR executes; the code
dragged from one method call to another method call is the stack that contains a number of
value type variables。 Value types are stored directly on the stack like cash。 Reference types are
stored as pointers to memory on the stack; just like a credit/debit card points to cash some
where else。 The reference pointer points to a piece of memory called the heap。 These concepts
are illustrated in Figure 2…14。
With value types; when one value type is assigned to another; the contents are copied。 If
you modify one of the copies; the original will not be altered。 In contrast; when you change the
value of a reference type; the values of all the pointers to that reference type change。 Going
back to the credit card and cash example; if you have 10 and so does your spouse; then when
you spend 8; it does not affect the 10 that your spouse has; as befits the value type model。
However; if you and your spouse have 10 available with your credit card and you spend 8;
only 2 remain; as you would expect with a reference type。
…………………………………………………………Page 65……………………………………………………………
CH A PT E R 2 ■ L E A R N I N G A B OU T 。 N E T N U M B E R AN D V A L U E T Y P E S 43
The variable total is a value type
and stored on the stack
Stack
1:total = 3
! 〃
# % & '
()* 〃 + &*
; #
; Method call
Stack
empty
There are no parameters
…。/ and no local variables;
; thus the stack is empty
Each called function has a stack
;
that contains the function
arguments and variables declared
in the function
Figure 2…14。 Stacks that are created and the interaction with the heap during CLR execution
There are times when you use value types and times when y