Tonight’s Agenda
C# data types Control structures Methods and event handlers Exceptions and validation Q&A
Built-in Types Integer Types
byte, sbyte, short, ushort, int, uint, long, ulong Floating Point Types
float, double, decimal Character Type
char (2 bytes!) Boolean Type
bool (true or false)
Aliases for .NET data types (Byte, Integer, Decimal, etc.)
Declare and Initialize
<type> <variableName>;int index;float interestRate;
<type> <variableName> = <value>;int index = 0;float interestRate = 0.0005;
Constants
const <type> <variableName> = <value>;
const decimal PI = 3.1415926535897932384626;PI = 3.14; // error!!
Naming Conventions
Camel Notation (camel-case)salesTaxCommon for variables
Pascal Notation (title-case)SalesTaxCommon for type names and constants
C or Python stylesales_tax (variables)SALES_TAX (constants)Not common
Arithmetic Operators
Addition (+) Subtraction (-) Multiplication (*) Division (/) Modulus (%) Increment (++)
value++ or ++value Decrement (--)
value-- or --value
Prefix and Postfix Operators Prefix operators modify a variable before it is evaluated Postfix operators modify a variable after it is evaluated
y = 1; x = y++;
// y = 2
// x = 1 (y was incremented AFTER evaluation)
y = 1; x = ++y;
// y = 2
// x = 2 (y was incremented BEFORE evaluation)
Assignment Operators
Assignment (=) Addition (+=)
x = x + y → x += y Subtraction (-=) Multiplication (*=) Division (/=) Modulus (%=)
Order of Precedence
Increment, decrementPrefix versions
Negation Multiplication, division, modulus Addition, subtraction
Evaluate from left to right Evaluate innermost parentheses first
"Advanced" Math Operations
The Math class provides a set of methods for common math operations
totalDollars = Math.Round(totalDollars, 2); Rounds to nearest whole number
hundred = Math.Pow(10, 2); ten = Math.Sqrt(100); one = Math.Min(1, 2); two = Math.Max(1, 2);
String Declarations// Simple declarationstring text;
// Initial value (double quotes)string text = "Hello!";
// Empty stringstring text = "";
// Unknown value (not an empty string)string text = null;
String Concatenationstring text = "My name is ";text = text + "Neal"text += " Stublen.“
string first = "Neal";string last = "Stublen";string greeting = “Hi, " + first + " " + last;
double grade = 94;string text = "My grade is " + grade + ".";
Special String Characters Escape sequence New line ("\n") Tab ("\t") Return ("\r") Quotation ("\"") Backslash ("\\") filename = "c:\\dev\\projects"; quote = "He said, \"Yes.\""; filename = @"c:\dev\projects"; quote = @"He said, ""Yes.""";
Type Casting
ImplicitLess precise to more precise
byte->short->int->long->double Automatic casting to more precise types
int letter = 'A';int test = 96, hmwrk = 84;double avg = tests * 0.8 + hmwrk * 0.2;
Type Casting
ExplicitMore precise to less precise
int->char, double->float Must be specified to avoid compiler
errors(<type>) <expression>
double total = 4.56;int avg = (int)(total / 10);decimal decValue = (decimal)avg;
What Should Happen?
int i = 379;double d = 4.3;byte b = 2;
double d2 = i * d / b;
int i2 = i * d / b;
Converting Types To Strings Everything has a ToString() method
<value>.ToString();
int i = 5;string s = i.ToString();// s = "5“
double d = 5.3;string s = d.ToString();// s = "5.3"
Converting Strings To Types Use the data type’s Parse() method
<type>.Parse(<string>);○ decimal m = Decimal.Parse("5.3");
Use the Convert classConvert.ToInt32(<value>);
○ int i = Convert.ToInt32("Convert.ToBool(<value>);Convert.ToString(<value>);...
Formatted Strings
Formatting codes can customize the output of ToString()<value>.ToString(<formatString>);amount.ToString("c"); // $43.16rate.ToString("p1"); // 3.4%count.ToString("n0"); // 2,345
See p. 121 for formatting codes
Formatted Strings
String class provides a static Format method{index:formatCode}String.Format("{0:c}", 43.16);
○ // $43.16String.Format("{0:p1}", 0.034);
○ // 3.4%
Formatted Strings
String.Format("Look: {0:c}, {1:p1}",43.16, 0.034);
// Look: $43.16, 3.4% String.Format(
“{0}, your score is {1}.",name, score);
// John, your score is 34.
Variable Scope
Scope limits access and lifetime Class scope Method scope Block scope No officially "global" scope
Enumeration Types
Enumerations define types with a fixed number of values
enum StoplightColors{ Red, Yellow, Green}
Enumeration Type
Numeric values are implied for each enumerated value
enum StoplightColors{ Red = 10, Yellow, Green}
Enumeration Typeenum StoplightColors{ Red = 10}
string color =
StoplightColors.Red.ToString();
// color = "Red", not "10"
"null" Values Identifies an unknown value
string text = null;
int value = null; // error! int? nonValue = null; bool defined = nonValue.HasValue; int value = nonValue.Value;
decimal? price1 = 19.95m; decimal? price2 = null; decimal? total = price1 + price2;
total = null (unknown, which seems intuitive)
Form Enhancements
Display a formatted subtotal as a currency
Round the discount amount to two decimal places
Keep running invoice totals Reset the totals when the
button is clicked Chapter 4 exercises
Common Control Structures Boolean expressions
Evaluate to true or false Conditional statements
Conditional execution Loops
Repeated execution
Boolean Expressions Equality (==)
a == b Inequality (!=)
a != b Greater than (>)
a > b Less than (<)
a < b Greater than or equal (>=)
a >= b Less than (<=)
a <= b
Logical Operators Combine logical operations Conditional-And (&&)
(file != null) && file.IsOpen Conditional-Or (||)
(key == 'q') || (key == 'Q') And (&)
file1.Close() & file2.Close() Or (|)
file1.Close() | file2.Close() Not (!)
!file.Open()
Logical Equivalence
DeMorgan's Theorem
!(a && b) is the equivalent of (!a || !b) !(a || b) is the equivalent of (!a && !b)
if-else Statementsif (color == SignalColors.Red){ Stop();}else if (color == SignalColors.Yellow){ Evaluate();}else{ Drive();}
switch Statementsswitch (color){case SignalColors.Red:
{ Stop(); break; }case SignalColors.Yellow:
{ Evaluate(); break; }default:
{ Drive();
break; }}
switch Statementsswitch (color){case SignalColors.Red:
{ Stop(); break; }case SignalColors.Yellow: // fall through default:
{ Drive();
break; }}
switch Statementsswitch (color){case SignalColors.Red: // fall throughcase SignalColors.Yellow: // fall through default:
{ Drive();
break; }}
while Statements
while (!file.Eof){ file.ReadByte();}
char ch;do{ ch = file.ReadChar();} while (ch != 'q');
for Statements
int factorial = 1;for (int i = 2; i <= value; ++i){ factorial *= i;}
string digits = ""for (char ch = '9'; ch <= '0'; ch-=1){ digits += ch;}
break and continue Statements
break allows is to jump out of a loop before reaching its normal termination condition
continue allows us to jump to the next iteration of a loop
break and continue Statements
string text = "";for (int i = 0; i < 10; i++){ if (i % 2 == 0) continue; if (i > 8) break; text += i.ToString();}
Caution!
int index = 0; while (++index < lastIndex){ TestIndex(index);}
int index = 0; while (index++ < lastIndex){ TestIndex(index);}
Debugging Summary
Stepping through code (over, into, out) Setting breakpoints Conditional breakpoints
Class Methodsclass DiscountCalculator{ private decimal CalcDiscPercent(decimal inAmt) { return (inAmt > 250.0m) ? 0.10m: 0.0m; }
public decimal CalcDiscAmount(decimal inAmt) { decimal percent = CalcDiscPercent(inAmt); return inAmt * percent; }}
Access Modifierclass DiscountCalculator{ private decimal CalcDiscPercent(decimal inAmt) { return (inAmt > 250.0m) ? 0.10m: 0.0m; }
public decimal CalcDiscAmount(decimal inAmt) { decimal percent = CalcDiscPercent(inAmt); return inAmt * percent; }}
Return Typeclass DiscountCalculator{ private decimal CalcDiscPercent(decimal inAmt) { return (inAmt > 250.0m) ? 0.10m: 0.0m; }
public decimal CalcDiscAmount(decimal inAmt) { decimal percent = CalcDiscPercent(inAmt); return inAmt * percent; }}
Method Nameclass DiscountCalculator{ private decimal CalcDiscPercent(decimal inAmt) { return (inAmt > 250.0m) ? 0.10m: 0.0m; }
public decimal CalcDiscAmount(decimal inAmt) { decimal percent = CalcDiscPercent(inAmt); return inAmt * percent; }}
Method Parametersclass DiscountCalculator{ private decimal CalcDiscPercent(decimal inAmt) { return (inAmt > 250.0m) ? 0.10m: 0.0m; }
public decimal CalcDiscAmount(decimal inAmt) { decimal percent = CalcDiscPercent(inAmt); return inAmt * percent; }}
Return Statementsclass DiscountCalculator{ private decimal CalcDiscPercent(decimal inAmt) { return (inAmt > 250.0m) ? 0.10m: 0.0m; }
public decimal CalcDiscAmount(decimal inAmt) { decimal percent = CalcDiscPercent(inAmt); return inAmt * percent; }}
Parameters Summary
Pass zero or more parameters Parameters can be optional Optional parameters are "pre-defined"
using constant values Optional parameters can be passed by
position or name Recommendation: Use
optional parameters
cautiously
Parameters Summary
Parameters are usually passed by value Parameters can be passed by reference Reference parameters can change the
value of the variable that was passed into the method
Event and Delegate Summary
A delegate connects an event to an event handler.
The delegate specifies the handler’s return type and parameters.
Event handlers can be shared with multiple controlsChapter 6, Exercise 1Clear result when any value
changes
Overflow Exception
checked{ byte value = 200; value += 200;
int temp = 5000; byte check = (byte)temp;}
“Catching” an Exception
try{ int dividend = 20; int divisor = 0; int quotient = dividend / divisor; int next = quotient + 1;}catch{}
Responding to Exceptions A simple message box:
MessageBox.Show(message, title); Set control focus:
txtNumber.Focus();
Catching Multiple Exceptions
try {}catch(FormatException e){}catch(OverflowException e){}catch(Exception e){}finally{}
Throwing an Exceptionthrow new Exception(“Really bad error!”);
try{}catch(FormatException e){ throw e;}