Your Ad Here

Monday, 14 December 2009

C# Introduction

Introduction:


Welcome to the C# Station Tutorial.  This is a set of lessons
suited for beginning to intermediate programmers or anyone who would like to
gain familiarity with the C# programming language.  These lessons will
help you get a quick head-start with C# programming. 


To get started, you will need a compiler and an editor. There are
several options for obtaining a compiler to write C# programs. 

A free option is to download the
.NET Frameworks SDK
and use
Notepad.  Of course there are many editor and IDE options available,
section to select the option that's right for you. Most of the examples in
these tutorials run as console programs.  Microsoft
Visual Studio .NET
is also available in multiple versions as well as a free download for
Visual Studio Express tools,
including Visual C# Express.

This tutorial is a work in progress.  It's quality is a product
of volunteer reviews and valuable feedback received from many readers. 
Please visit periodically for the latest updates and new lessons.




References:


title="The C# Language Reference" target="_blank">C# Language Reference, Anders
Hejlsberg and Scott Wiltamuth


ECMA
C# and Common Language Infrastructure Standards


Lessons:






























































































Lesson 01: Getting Started
Lesson 02: Expressions, Types, and Variables
Lesson 03: Control Statements - Selection
Lesson 04: Control Statements - Loops
Lesson 05: Methods
Lesson 06: Namespaces
Lesson 07: Introduction to Classes
Lesson 08: Class Inheritance
Lesson 09: Polymorphism
Lesson 10: Properties
Lesson 11: Indexers
Lesson 12: Structs
Lesson 13: Interfaces
Lesson 14: Introduction to Delegates and Events
Lesson 15: Introduction to Exception Handling
Lesson 16: Using Attributes
Lesson 17: Enums
Lesson 18: Overloading Operators
Lesson 19: Encapsulation
Lesson 20: Introduction to Generic Collections
Lesson 21: Anonymous Methods
Lesson 22: Topics on C# Type
Lesson 23: Working with Nullable Types

Lesson 1: Getting Started with C#


This lesson will get you started with C# by introducing a few very simple programs.
Here are the objectives of this lesson:


  • Understand the basic structure of a C# program.
  • Obtain a basic familiarization of what a "Namespace" is.
  • Obtain a basic understanding of what a Class is.
  • Learn what a Main method does.
  • Learn how to obtain command-line input.
  • Learn about console input/output (I/O).


A Simple C# Program



There are basic elements that all C# executable programs have and that's what we'll
concentrate on for this first lesson, starting off with a simple C# program. After
reviewing the code in Listing 1-1, I'll explain
the basic concepts that will follow for all C# programs we will write throughout this tutorial. Please see Listing 1-1
to view this first program. 

Warning: C# is case-sensitive.

Listing 1-1. A Simple Welcome Program: Welcome.cs



// Namespace Declaration size="2">

using
System;



// Program start class

class WelcomeCSS

{

   
// Main begins program execution.

    size="2">
static size="2">void Main()

    {

     color="#008000" size="2">   
// Write to console

       
Console.WriteLine("Welcome to the C# Station Tutorial!"); 

    }

}




The program in Listing 1-1 has 4 primary elements, a namespace declaration, a class,
a Main method, and a program statement. It can be compiled with the
following command line:

 csc.exe Welcome.cs



This produces a file named Welcome.exe, which can then be executed. Other
programs can be compiled similarly by substituting their file name instead of Welcome.cs.
For more help about command line options, type "csc -help" on the command line.
The file name and the class name can be totally different.


Note for VS.NET Users: The screen will run and close quickly when launching this
program from Visual Studio .NET. To prevent this, add the following code as the
last line in the Main method:



// keep screen from going away

// when run from VS.NET


Console.ReadLine();



Note: The command-line is a window that allows you to run commands and programs
by typing the text in manually. It is often refered to as the DOS prompt, which
was the operating system people used years ago, before Windows. The .NET Framework
SDK, which is free, uses mostly command line tools. Therefore, I wrote this tutorial
so that anyone would be able to use it. Do a search through Windows Explorer for
"csc.exe", which is the C# compiler. When you know its location, add that location
to your Windows path. If you can't figure out how to add something to your path,
get a friend to help you. With all the different versions of Windows available,
I don't have the time in this tutorial, which is about C# language programming,
to show you how to use your operating system. Then open the command window by going
to the Windows Start menu, selecting Run, and typing cmd.exe.


The first thing you should be aware of is that C# is case-sensitive. The word "Main"
is not the same as its lower case spelling, "main". They are different identifiers.
If you are coming from a language that is not case sensitive, this will trip you
up several times until you become accustomed to it.


The namespace declaration, using System;, indicates that you are referencing
the System namespace. Namespaces contain groups of code that can be called
upon by C# programs. With the using System; declaration, you are telling
your program that it can reference the code in the System namespace without
pre-pending the word System to every reference. I'll discuss this in more
detail in Lesson 06: Namespaces, which is dedicated
specifically to namespaces.


The class declaration, class WelcomeCSS, contains the data and
method definitions that your program uses to execute. A class is one of
a few different types of elements your program can use to describe objects, such
as structs, interfaces , delegates, and enums,
which will be discussed in more
detail in
Lesson 12: Structs
, Lesson 13: Interfaces,
Lesson 14: Delegates
, and Lesson 17: Enums,
respectively. This particular class has no
data, but it does have one method. This method defines the behavior of this class
(or what it is capable of doing). I'll discuss classes more in
Lesson 07: Introduction to Classes
. We'll be covering a lot of information
about classes throughout this tutorial.


The one method within the WelcomeCSS class tells what this class
will do when executed. The method name, Main, is reserved for the starting
point of a program. Main is often called the "entry point" and if you ever
receive a compiler error message saying that it can't find the entry point, it means
that you tried to compile an executable program without a Main method.


A static
modifier precedes the word Main, meaning that this method works in this specific class only, rather
than an instance of the class. This is necessary, because when a program
begins, no object instances exist. I'll tell you more about classes, objects, and
instances in Lesson 07: Introduction to Classes.


Every method must have a return type. In this case it is void, which means
that Main does not return a value. Every method also has a parameter list
following its name with zero or more parameters between parenthesis. For simplicity,
we did not add parameters to Main. Later in this lesson you'll see what
type of parameter the Main method can have. You'll learn more about methods
in Lesson 05: Methods.


The Main method specifies its behavior with the Console.WriteLine(...)
statement. Console is a class in the System namespace.
WriteLine(...) is a method in the Console class. We use the ".",
dot, operator to separate subordinate program elements. Note that we could also
write this statement as System.Console.WriteLine(...). This follows the
pattern "namespace.class.method" as a fully qualified statement. Had we left out
the using System declaration at the top of the program, it would have been
mandatory for us to use the fully qualified form System.Console.WriteLine(...).
This statement is what causes the string, "Welcome to the C# Station Tutorial!"
to print on the console screen.


Observe that comments are marked with "//". These are single line comments, meaning
that they are valid until the end-of-line. If you wish to span multiple lines with
a comment, begin with "/*" and end with "*/". Everything in between is part of the
comment. Comments are ignored
when your program compiles. They are there to document what your program
does in plain English (or the native language you speak with every day).


All statements end with a ";", semi-colon. Classes and methods begin with "{", left
curly brace, and end with a "}", right curly brace. Any statements within and including
"{" and "}" define a block. Blocks define scope (or lifetime and visibility) of
program elements.


Accepting Command-Line Input



In the previous example, you simply ran the program and it produced output. 
However, many programs are written to accept command-line input. This makes it easier
to write automated scripts that can invoke your program and pass information to
it. If you look at many of the programs, including Windows OS utilities, that you
use everyday; most of them have some type of command-line interface.  For example,
if you type Notepad.exe MyFile.txt (assuming the file exists), then the
Notepad
program will open your MyFile.txt file so you can begin editing it. You can make
your programs accept command-line input also, as shown in Listing 1-2, which shows
a program that accepts
a name from the command line and writes it to the console.

Note: When running the NamedWelcome.exe application in Listing 1-2, you
must supply a command-line argument.  For example, type the name of the
program, followed by your name: NamedWelcome YourName.  This is the purpose of Listing 1-2 - to show
you how to handle command-line input. Therefore, you must provide an argument on
the command-line for the program to work.  If you are running Visual
Studio, right-click on the project in Solution Explorer, select Properties,
click the Debug tab, locate Start Options, and type YourName into Command
line arguments. If you forget to to enter YourName on the command-line or
enter it into the project properties, as I just explained, you will receive an
exception that says "Index was outside the bounds of the array." To keep the
program simple and concentrate only on the subject of handling command-line
input, I didn't add exception handling. Besides, I haven't taught you how to add
exception handling to your program yet - but I will. In
Lesson 15: Introduction to Exception Handling
, you'll learn more about exceptions and
how to handle them properly.
Listing 1-2. Getting Command-Line Input: NamedWelcome.cs




// Namespace Declaration size="2">

using
System;



// Program start class

class NamedWelcome

{

   
// Main begins program execution.

    size="2">
static size="2">void Main(string size="2">[] args)

    {

       
// Write to console

       
Console.WriteLine("Hello, {0}!", args[0]);

        Console.WriteLine("Welcome to the C#
Station Tutorial!"); 

    }

}






In Listing 1-2, you'll notice an entry in the Main method's parameter list.
The parameter name is args, which you'll use to refer to the parameter
later in your program. The string[] expression defines the type of parameter
that args is. The string type holds characters. These characters
could form a single word, or multiple words. The "[]", square brackets denote an
Array, which is like a list. Therefore, the type of the args parameter,
is a list of words from the command-line.  Anytime you add string[] args
to the parameter list of the Main method, the C# compiler emits code that
parses command-line arguments and loads the command-line arguments into args. By
reading args, you have access to all arguments, minus the application
name, that were typed on the command-line.

You'll also notice an additional Console.WriteLine(...) statement within
the Main method. The argument list within this statement is different than
before. It has a formatted string with a "{0}" parameter embedded in it.
The first parameter in a formatted string begins at number 0, the second is 1, and
so on. The "{0}" parameter means that the next argument following the end
quote will determine what goes in that position. Hold that thought, and now we'll
look at the next argument following the end quote.


The args[0] argument refers to the first string in the args
array. The first element of an Array is number 0, the second is number 1, and so
on. For example, if I typed NamedWelcome Joe on the command-line, the value of
args[0] would be "Joe".
This is a little tricky because you know that you typed NamedWelcome.exe on the
command-line, but C# doesn't include the executable application name in the args
list - only the first parameter after the executable application.

Returning to the embedded "{0}" parameter in the formatted string:
Since args[0] is the first argument, after the formatted string, of the
Console.WriteLine() statement, its value will be placed into the first
embedded parameter of the formatted string. When this command is executed, the value
of args[0], which is "Joe" will replace "{0}" in the formatted
string. Upon execution of the command-line with "NamedWelcome Joe", the output will
be as follows:

    Hello, Joe!
Welcome to the C# Station Tutorial!

Interacting via the Command-Line



Besides command-line input, another way to provide input to a program is via the Console. Typically, it works
like this: You prompt the user for some input, they type something in and press
the Enter key, and you read their input and take some action. Listing
1-3 shows how to obtain interactive input from the user.

Listing 1-3. Getting Interactive Input: InteractiveWelcome.cs



// Namespace Declaration

using System;




// Program start class

class InteractiveWelcome

{

   
// Main begins program execution.

    size="2"> public
static size="2">void Main()

    {

       
// Write to console/get input

       
Console.Write("What is your name?: ");

        Console.Write("Hello, {0}! ", Console.ReadLine());

        Console.WriteLine("Welcome to the C#
Station Tutorial!"); 

    }

}





In Listing 1-3, the Main method doesn't have any parameters -- mostly because
it isn't necessary this time. Notice also that I prefixed the Main method
declaration with the public keyword. The public keyword means that
any class outside of this one can access that class member. For Main, it
doesn't matter because your code would never call Main, but as you go
through this tutorial, you'll see how you can create classes with members that
must be public so they can be used. The default access is private,
which means that only members inside of the same class can access it. Keywords
such as public and private are referred to as access modifiers.
Lesson 19 discusses access
modifiers in more depth.

There are three statements inside of Main and the first
two are different from the third. They are Console.Write(...) instead of
Console.WriteLine(...). The difference is that the Console.Write(...)
statement writes to the console and stops on the same line, but the Console.WriteLine(...)
goes to the next line after writing to the console.


The first statement simply writes "What is your name?: " to the console.

The second statement doesn't write anything until its arguments are properly evaluated.
The first argument after the formatted string is Console.ReadLine()
This causes the program to wait for user input at the console. After the user types
input, their name in this case, they must press the Enter key. The return value
from this method replaces the "{0}" parameter of the formatted string and
is written to the console. This line could have also been written like this:

string name = Console.ReadLine();


Console.Write("Hello, {0}! ", name);


The last statement writes to the console as described earlier. Upon execution
of the command-line with "InteractiveWelcome", the output will be as follows:



>What is your Name?  <type your name here> [Enter Key]

>Hello, <your name here>!  Welcome to the C# Station Tutorial!




Summary



Now you know the basic structure of a C# program. using statements let
you reference a namespace and allow code to have shorter and more readable notation.
The Main method is the entry point to start a C# program. You can capture
command-line input when an application is run by reading items from a string[]
(string array) parameter to your Main method. Interactive I/O can be performed with
the ReadLine, Write and WriteLine methods of the Console
class.

This is just the beginning, the first of many lessons. I invite you back to take
Lesson 2:  Expressions, Types, and Variables.



Your feedback and constructive contributions are welcome.  Please feel free
to contact me for feedback or comments you may have about this lesson.

Lesson 2: Operators, Types, and Variables

Lesson 2: Operators, Types, and Variables



This lesson introduces C# operators, types, and variables. Its goal is to meet the
following objectives:



  • Understand what a variable is.
  • Familiarization with C# built-in types.
  • Get an introduction to C# operators.
  • Learn how to use Arrays.



Variables and Types



"Variables" are simply storage locations for data. You can place data into them
and retrieve their contents as part of a C# expression. The interpretation of the
data in a variable is controlled through "Types".



C# is a "Strongly Typed" language. Thus all operations on variables are performed
with consideration of what the variable's "Type" is. There are rules that define
what operations are legal in order to maintain the integrity of the data you put
in a variable.



The C# simple types consist of the Boolean type and three numeric types - Integrals,
Floating Point, Decimal, and String. The term "Integrals", which is defined in
the C# Programming Language Specification, refers to the classification
of types that include sbyte, byte, short, ushort, int, uint, long, ulong, and char.
More details are available in the Integral Types section later in this lesson. The
term "Floating Point" refers to the float and double types, which are discussed,
along with the decimal type, in more detail in the Floating Point and Decimal Types
section later in this lesson. The string type represents a string of characters
and is discussed in The String Type section, later in this lesson. The next section
introduces the boolean type.


The Boolean Type



Boolean types are declared using the keyword, bool. They have two values:
true or false. In other languages, such as C and C++, boolean
conditions can be satisfied where 0 means false and anything else means true. However,
in C# the only values that satisfy a boolean condition is true and false,
which are official keywords. Listing 2-1 shows one of many ways that boolean types
can be used in a program.


Listing 2-1. Displaying Boolean Values: Boolean.cs



using System; size="2">



class
Booleans

{

   
public size="2">static void size="2"> Main()

    {

       
bool content =
true;

       
bool noContent =
false;




        Console.WriteLine("It is {0} that C#
Station provides C# programming language content.", content);

        Console.WriteLine("The statement above
is not {0}.", noContent);

    }

}





In Listing 2-1, the boolean values are written to the console as a part of a sentence.
The only legal values for the bool type are either true or false,
as shown by the assignment of true to content and false
to noContent. When run, this program produces the following output:


    It is True that C# Station provides C# programming language content.
The statement above is not False.

Integral Types



In C#, an integral is a category of types. For anyone confused because the word
Integral sounds like a mathematical term, from the perspective of C#
programming, these are actually defined as Integral types in the C# programming
language specification. They are whole numbers, either signed
or unsigned, and the char type. The char type is a Unicode character, as defined
by the Unicode Standard. For more information, visit href="http://www.unicode.org/" target="_blank">The Unicode Home Page. table
2-1 shows the integral types, their size, and range.


Table 2-1. The Size and Range of C# Integral Types





















































Type

Size (in bits)

Range

sbyte

8

-128 to 127

byte

8

0 to 255

short

16

-32768 to 32767

ushort

16

0 to 65535

int

32

-2147483648 to 2147483647

uint

32

0 to 4294967295

long

64

-9223372036854775808 to 9223372036854775807

ulong

64

0 to 18446744073709551615

char

16

0 to 65535


Integral types are well suited for those operations involving whole number calculations.
The char type is the exception, representing a single Unicode character.
As you can see from the table above, you have a wide range of options to choose
from, depending on your requirements.


Floating Point and Decimal Types



A C# floating point type is either a float or double. They are used any time you
need to represent a real number, as defined by IEEE 754. For more information on
IEEE 754, visit the href="http://www.ieee.org/" target="_blank">IEEE Web Site. Decimal
types should be used when representing financial or money values. table 2-2 shows
the floating point and decimal types, their size, precision, and range.


Table 2-2. The Floating Point and Decimal Types with Size, precision, and Range



























Type

Size (in bits)

precision

Range

float

32

7 digits

1.5 x 10-45 to 3.4 x 1038

double

64

15-16 digits

5.0 x 10-324 to 1.7 x 10308

decimal

128

28-29 decimal places

1.0 x 10-28 to 7.9 x 1028


Floating point types are used when you need to perform operations requiring fractional
representations. However, for financial calculations, the decimal type
is the best choice because you can avoid rounding errors.


The string Type



A string is a sequence of text characters. You typically create a string with a string
literal, enclosed in quotes: "This is an example of a string." You've seen strings
being used in Lesson 1, where we used the Console.WriteLine method to
send output to the console.



Some characters aren't printable, but you still need to use them in strings. Therefore,
C# has a special syntax where characters can be escaped to represent non-printable
characters. For example, it is common to use newlines in text, which is represented
by the '\n' char. The backslash, '\', represents the escape. When preceded by the
escape character, the 'n' is no longer interpreted as an alphabetical character,
but now represents a newline.



You may be now wondering how you could represent a backslash character in your code.
We have to escape that too by typing two backslashes, as in '\\'. table 2-3 shows
a list of common escape sequences.


Table 2-3. C# Character Escape Sequences



















































Escape Sequence

Meaning

\'

Single Quote

\"

Double Quote

\\

Backslash

\0

Null, not the same as the C# null value

\a

Bell

\b

Backspace

\f

form Feed

\n

Newline

\r

Carriage Return

\t

Horizontal Tab

\v

Vertical Tab


Another useful feature of C# strings is the verbatim literal, which is a string
with a @ symbol prefix, as in @"Some string". Verbatim literals make escape
sequences translate as normal characters to enhance readability. To appreciate the
value of verbatim literals, consider a path statement such as "c:\\topdir\\subdir\\subdir\\myapp.exe".
As you can see, the backslashes are escaped, causing the string to be less readable.
You can improve the string with a verbatim literal, like this: @"c:\topdir\subdir\subdir\myapp.exe".



That is fine, but now you have the problem where quoting text is not as easy. In
that case, you would specify double double quotes. For example, the string "copy
\"c:\\source file name with spaces.txt\" c:\\newfilename.txt"
would be
written as the verbatim literal @"copy ""c:\source file name with spaces.txt""
c:\newfilename.txt"
.



C# Operators



Results are computed by building expressions.  These expressions are built
by combining variables and operators together into statements.  The following
table describes the allowable operators, their precedence, and associativity.


Table 2-4. Operators with their precedence and Associativity



















































































Category (by precedence)

Operator(s)

Associativity

Primary

x.y  f(x)  a[x]  x++  x--  new  typeof 
default  checked  unchecked delegate

left

Unary

+  -  !  ~  ++x  --x  (T)x

left

Multiplicative

*  /  %

left

Additive

+  -

left

Shift

<<  >>

left

Relational

<  >  <=  >=  is
as

left

Equality

==  !=

right

Logical AND

&

left

Logical XOR

^

left

Logical OR

|

left

Conditional AND

&&

left

Conditional OR

||

left

Null Coalescing

??

left

Ternary

?:

right

Assignment

=  *=  /=  %=  +=  -=  <<=  >>= 
&=  ^=  |=  =>

right


Left associativity means that operations are evaluated from left to right. Right
associativity mean all operations occur from right to left, such as assignment operators
where everything to the right is evaluated before the result is placed into the
variable on the left.



Most operators are either unary or binary. Unary operators form expressions on a
single variable, but binary operators form expressions with two variables. Listing
2-2 demonstrates how unary operators are used.


Listing 2-2. Unary Operators: Unary.cs



using System;



class Unary

{

   
public size="2">static void size="2"> Main()

    {

       
int unary = 0;

       
int preIncrement;

       
int preDecrement;

       
int postIncrement;

       
int postDecrement;

       
int positive;

       
int negative;

       
sbyte bitNot;

       
bool logNot;



        preIncrement = ++unary;

        Console.WriteLine("pre-Increment: {0}",
preIncrement);



        preDecrement = --unary;

        Console.WriteLine("pre-Decrement: {0}",
preDecrement);



        postDecrement = unary--;

        Console.WriteLine("Post-Decrement: {0}",
postDecrement);



        postIncrement = unary++;

        Console.WriteLine("Post-Increment: {0}",
postIncrement);



        Console.WriteLine("Final Value of Unary:
{0}", unary);



        positive = -postIncrement;

        Console.WriteLine("Positive: {0}", positive);



        negative = +postIncrement;

        Console.WriteLine("Negative: {0}", negative);



        bitNot = 0;

        bitNot = (
size="2">sbyte)(~bitNot);

        Console.WriteLine("Bitwise Not: {0}",
bitNot);



        logNot =
size="2">false;

        logNot = !logNot;

        Console.WriteLine("Logical Not: {0}",
logNot);

    }

}





When evaluating expressions, post-increment (x++) and post-decrement (x--) operators
return their current value and then apply the operators. However, when using pre-increment
(++x) and pre-decrement (--x) operators, the operator is applied to the variable
prior to returning the final value.



In Listing 2-2, the unary variable is initialized to zero. When the pre-increment
(++x) operator is used, unary is incremented to 1 and the value 1 is assigned
to the preIncrement variable. The pre-decrement (--x) operator turns unary
back to a 0 and then assigns the value to the preDecrement variable.



When the post-decrement (x--) operator is used, the value of unary, 0,
is placed into the postDecrement variable and then unary is decremented
to -1. Next the post-increment (x++) operator moves the current value of unary,
-1, to the postIncrement variable and then increments unary to
0.



The variable bitNot is initialized to 0 and the bitwise not (~) operator
is applied. The bitwise not (~) operator flips the bits in the variable. In this
case, the binary representation of 0, "00000000", was transformed into -1, "11111111".



While the (~) operator works by flipping bits, the logical negation
operator (!) is a logical operator that works on bool values,
changing true to false or false to true. In the case
of the logNot variable in Listing 2-2, the value is initialized to
false
, and the next line applies the logical negation operator, (!),
which returns true and reassigns the new value, true, to logNot.
Essentially, it is toggling the value of the bool variable, logNot.



The setting of positive is a little tricky. At the time that it is set,
the postIncrement variable is equal to -1. Applying the minus (-)
operator to a negative number results in a positive number, meaning that
postitive
will equal 1, instead of -1. The minus operator (-), which
is not the
same as the pre-decrement operator (--), doesn't change the value of
postInc - it just applies a sign
negation. The plus operator (+) doesn't affect the value of a number,
assigning negative with the same value as postIncrement, -1.



Notice the expression (sbyte)(~bitNot). Any operation performed on types
sbyte, byte, short, or ushort return int
values. To assign the result into the bitNot variable we had to use a cast,
(Type), operator, where Type is the type you wish to convert to (in this case - sbyte).
The cast operator is shown as the Unary operator, (T)x, in table 2-4. Cast operators
must be performed explicity when you go from a larger type to a smaller type because
of the potential for lost data. Generally speaking, assigning a smaller type to
a larger type is no problem, since the larger type has room to hold the entire value.
Also be aware of the dangers of casting between signed and unsigned types. You want
to be sure to preserve the integrity of your data. Many basic programming texts
contain good descriptions of bit representations of variables and the dangers of
explicit casting.



Here's the output from the Listing 2-2:


     pre-Increment: 1
pre-Decrement 0
Post-Decrement: 0
Post-Increment: -1
Final Value of Unary: 0
Positive: 1
Negative: -1
Bitwise Not: -1
Logical Not: true


In addition to unary operators, C# has binary operators that form expressions of
two variables. Listing 2-3 shows how to use the binary operators.


Listing 2-3. Binary Operators: Binary.cs



using System;



class Binary

{

   
public size="2">static void size="2"> Main()

    {

       
int x, y, result;

       
float floatresult;



        x = 7;

        y = 5;



        result = x+y;

        Console.WriteLine("x+y: {0}", result);



        result = x-y;

        Console.WriteLine("x-y: {0}", result);



        result = x*y;

        Console.WriteLine("x*y: {0}", result);



        result = x/y;

        Console.WriteLine("x/y: {0}", result);



        floatresult = (
size="2">float)x/(float size="2">)y;

        Console.WriteLine("x/y: {0}", floatresult);



        result = x%y;

        Console.WriteLine("x%y: {0}", result);



        result += x;

        Console.WriteLine("result+=x: {0}", result);

    }

}


And here's the output:


    x+y: 12 
x-y: 2
x*y: 35
x/y: 1
x/y: 1.4
x%y: 2
result+=x: 9



Listing 2-3 shows several examples of binary operators. As you might expect, the
results of addition (+), subtraction (-), multiplication (*), and division (/) produce
the expected mathematical results.



The floatresult variable is a floating point type. We explicitly cast the
integer variables x and y to calculate a floating point value.



There is also an example of the remainder(%) operator. It performs a division operation
on two values and returns the remainder.



The last statement shows another form of the assignment with operation (+=) operator.
Any time you use the assignment with operation operator, it is the same as applying
the binary operator to both the left hand and right hand sides of the operator and
putting the results into the left hand side. The example could have been written
as result = result + x; and returned the same value.


The Array Type



Another data type is the Array, which can be thought of as a container that has
a list of storage locations for a specified type. When declaring an Array, specify
the type, name, dimensions, and size.


Listing 2-4. Array Operations: Array.cs



using System;



class Array

{

   
public size="2">static void size="2"> Main()

    {

       
int[] myInts = { 5, 10,
15 };

       
bool[][] myBools =
new size="2">bool[2][];

        myBools[0] =
size="2">new bool size="2">[2];

        myBools[1] = size="2">new bool size="2">[1];

       
double[,] myDoubles =
new size="2">double[2, 2];

       
string[] myStrings =
new size="2">string[3];



        Console.WriteLine("myInts[0]: {0}, myInts[1]:
{1}, myInts[2]: {2}", myInts[0], myInts[1], myInts[2]);



        myBools[0][0] =
size="2">true;

        myBools[0][1] =

false;

        myBools[1][0] =
size="2">true;

        Console.WriteLine("myBools[0][0]: {0},
myBools[1][0]: {1}", myBools[0][0], myBools[1][0]);



        myDoubles[0, 0] = 3.147;

        myDoubles[0, 1] = 7.157;

        myDoubles[1, 1] = 2.117;

        myDoubles[1, 0] = 56.00138917;

        Console.WriteLine("myDoubles[0, 0]: {0},
myDoubles[1, 0]: {1}", myDoubles[0, 0], myDoubles[1, 0]);



        myStrings[0] = "Joe";

        myStrings[1] = "Matt";

        myStrings[2] = "Robert";

        Console.WriteLine("myStrings[0]: {0},
myStrings[1]: {1}, myStrings[2]: {2}", myStrings[0], myStrings[1], myStrings[2]);



    }

}




And here's the output:


     myInts[0]: 5, myInts[1]: 10, myInts[2]: 15
myBools[0][0]: true, myBools[1][0]: true
myDoubles[0, 0]: 3.147, myDoubles[1, 0]: 56.00138917
myStrings[0]: Joe, myStrings[1]: Matt, myStrings[2]: Robert



Listing 2-4 shows different implementations of Arrays. The first example is the
myInts Array, which is a single-dimension array. It is initialized at declaration time with explicit values.



Next is a jagged array, myBools. It is essentially an array of arrays. We needed to use the
new operator to instantiate the size of the primary array and then use
the new operator again for each sub-array.



The third example is a two dimensional array, myDoubles. Arrays can be multi-dimensional, with
each dimension separated by a comma. It must also be instantiated with the new
operator.



One of the differences between jagged arrays, myBools[][], and
multi-dimension arrays, myDoubles[,], is that a multi-dimension array
will allocate memory for every element of each dimension, whereas a jagged array
will only allocate memory for the size of each array in each dimension that you
define. Most of the time, you'll be using multi-dimension arrays, if you need
multiple dimensions, and will only use jagged arrays in very special
circumstances when you are able to save significant memory by explicitly
specifying the sizes of the arrays in each dimension.



Finally, we have the single-dimensional array of string types,
myStrings
.



In each case, you can see that array elements are accessed by identifying the integer
index for the item you wish to refer to. Arrays sizes can be any int type
value. Their indexes begin at 0.




Summary



A variable is an identifier with a type that holds a value of that type. Simple
types include the integrals, floating points, decimal, and bool. C# has several
mathematical and logical operators that participate in forming expressions. C# also
offers the single dimension, multi-dimension and jagged array types.



In this lesson you learned how to write simple statements and code a program that
works linearly from start to finish. However, this is not as useful as it can be
because you need to be able to make decisions and execute different blocks of code
depending on different conditions. I invite you to return for
Lesson 3: Control Statements - Selection
, where you can learn how to branch
your logic for more powerful decision making.




Your feedback and constructive contributions are welcome.  Please feel free
to contact me for feedback or comments you may have about this lesson.

Lesson 3: Control Statements - Selection


In the last couple of lessons, every program you saw contained a limited amount
of sequential steps and then stopped. There were no decisions you could make with
the input and the only constraint was to follow straight through to the end. The
information in this lesson will help you branch into separate logical sequences
based on decisions you make. More specifically, the goals of this lesson are as
follows:



  • Learn the if statements.

  • Learn the switch statement.

  • Learn how break is used in switch statements.

  • Understand proper use of the goto statement.



The if Statement



An if statement allows you to take different paths of logic, depending
on a given condition. When the condition evaluates to a boolean true, a
block of code for that true condition will execute. You have the option of a single
if statement, multiple else if statements, and an optional else
statement. Listing 3-1 shows how each of these types of if statements work.


Listing 3-1. forms of the if statement: IfSelection.cs



using System;



class IfSelect

{

   
public size="2">static void size="2"> Main()

    {

       
string myInput;

       
int myInt;




        Console.Write("Please enter a number:
");

        myInput = Console.ReadLine();

        myInt = Int32.Parse(myInput);





       
// Single Decision and Action with braces

    size="2">     if size="2"> (myInt > 0)

        {

            Console.WriteLine("Your
number {0} is greater than zero.", myInt);

        }




       
// Single Decision and Action without brackets

    size="2">     if size="2"> (myInt < 0) 

            Console.WriteLine("Your
number {0} is less than zero.", myInt);




       
// Either/Or Decision

    size="2">     if size="2"> (myInt != 0)

        {

            Console.WriteLine("Your
number {0} is not equal to zero.", myInt);

        }

       
else

       {

            Console.WriteLine("Your
number {0} is equal to zero.", myInt);

        }





       
// Multiple Case Decision

    size="2">     if size="2"> (myInt < 0 || myInt == 0)

        {

            Console.WriteLine("Your
number {0} is less than or equal to zero.", myInt);

        }

       
else size="2">if (myInt > 0 && myInt <= 10)

        {

            Console.WriteLine("Your
number {0} is in the range from 1 to 10.", myInt);

        }

       
else
if (myInt > 10 && myInt
<= 20)

        {

            Console.WriteLine("Your
number {0} is in the range from 11 to 20.", myInt);

        }

       
else size="2">if (myInt > 20 && myInt <= 30)

        {

            Console.WriteLine("Your
number {0} is in the range from 21 to 30.", myInt);

        }

       
else

       {

            Console.WriteLine("Your
number {0} is greater than 30.", myInt);

        }

    }

}





The statements in Listing 3-1 use the same input variable, myInt as a part
of their evaluations. This is another way of obtaining interactive input from the
user. Here's the pertinent code:



        Console.Write("Please enter
a number: ");

        myInput = Console.ReadLine();

        myInt = Int32.Parse(myInput);



We first print the line "Please enter a number: " to the console. The Console.ReadLine()
statement causes the program to wait for input from the user, who types a number
and then presses Enter. This number is returned in the form of a string into the
myInput variable, which is a string type. Since we must evaluate the user's
input in the form of an int, myInput must be converted. This is done with
the command Int32.Parse(myInput). (Int32 and similar types
will be covered in another lesson on advanced types) The result is placed into the
myInt variable, which is an int type.



Now that we have a variable in the type we wanted, we will evaluate it with if
statements. The first statement is of the form if (boolean expression) { statements
}
, as shown below:



       
// Single Decision and Action with braces

    size="2">     if size="2"> (myInt > 0)

        {

            Console.WriteLine("Your
number {0} is greater than zero.", myInt);

        }



You must begin with the keyword if. Next is the boolean expression between
parenthesis. This boolean expression must evaluate to a true or false
value. In this case, we are checking the user's input to see if it is greater than
(>) 0. If this expression evaluates to true, we execute the statements
within the curly braces. (We refer to the structure with curly braces as a "block")
There could be one or more statements within this block. If the boolean expression
evaluates to false, we ignore the statements inside the block and continue
program execution with the next statement after the block.



Note: In other languages, such as C and C++, conditions can be evaluated
where a result of 0 is false and any other number is true. In C#, the condition
must evaluate to a boolean value of either true or false. If you need to simulate
a numeric condition with C#, you can do so by writing it as (myInt != 0), which
means that the expression evaluate to true if myInt is not 0.



The second if statement is much like the first, except it does not have
a block, as shown here:



       
// Single Decision and Action without braces

    size="2">     if size="2"> (myInt < 0) 

            Console.WriteLine("Your
number {0} is less than zero.", myInt);



If its boolean expression evaluates to true, the first statement after
the boolean expression will be executed. When the boolean expression evaluates to
false, the first statement after the boolean expression will be skipped
and the next program statement will be executed. This form of if statement
is adequate when you only have a single statement to execute. If you want to execute
two or more statements when the boolean expression evaluates to true, you
must enclose them in a block.



Most of the time, you'll want to make an either/or kind of decision. This is called
an if/else statement. The third if statement in Listing 3-1 presents this
idea, as shown below:



       
// Either/Or Decision

    size="2">     if size="2"> (myInt != 0)

        {

            Console.WriteLine("Your
number {0} is not equal to zero.", myInt);

        }

       
else

       {

            Console.WriteLine("Your
number {0} is equal to zero.", myInt);

        }



When the boolean expression evaluates to true, the statement(s) in the
block immediately following the if statement are executed. However, when
the boolean expression evaluates to false, the statements in the block
following the else keyword are executed.



When you have multiple expressions to evaluate, you can use the if/else if/else
form of the if statement. We show this form in the fourth if statement
of Listing 3-1, and repeated below:



       
// Multiple Case Decision

    size="2">     if size="2"> (myInt < 0 || myInt == 0)

        {

            Console.WriteLine("Your
number {0} is less than or equal to zero.", myInt);

        }

       
else size="2">if (myInt > 0 && myInt <= 10)

        {

            Console.WriteLine("Your
number {0} is in the range from 1 to 10.", myInt);

        }

       
else
if (myInt > 10 && myInt
<= 20)

        {

            Console.WriteLine("Your
number {0} is in the range from 11 to 20.", myInt);

        }

       
else size="2">if (myInt > 20 && myInt <= 30)

        {

            Console.WriteLine("Your
number {0} is in the range from 21 to 30.", myInt);

        }

       
else

       {

            Console.WriteLine("Your
number {0} is greater than 30.", myInt);

        }



This example begins with the if keyword, again executing the following
block if the boolean expression evaluates to true. However, this time you
can evaluate multiple subsequent conditions with the else if keyword combination.
the else if statement also takes a boolean expression, just like the if
statement. The rules are the same, when the boolean expression for the else if
statement evaluates to true, the block immediately following the
boolean expression is executed. When none of the other if or else if boolean expressions evaluate
to true, the block following the else keyword will be executed.
Only one section of an if/else if/else statement will be executed.



One difference in the last statement from the others is the boolean expressions.
The boolean expression, (myInt < 0 || myInt == 0), contains the conditional
OR (||) operator. In both the regular OR (|) operator and the conditional OR (||)
operator, the boolean expression will evaluate to true if either of the
two sub-expressions on either side of the operator evaluate to true. The
primary difference between the two OR forms are that the regular OR operator will
evaluate both sub-expressions every time. However, the conditional OR will evaluate
the second sub-expression only if the first sub-expression evaluates to false.



The boolean expression, (myInt > 0 && myInt <= 10), contains
the conditional AND operator.  Both the regular AND (&) operator and the
conditional AND (&&) operator will return true when both of the
sub-expressions on either side of the operator evaluate to true
The difference between the two is that the regular AND operator will evaluate both
expressions every time. However, the conditional AND operator will evaluate the
second sub-expression only when the first sub-expression evaluates to true.



The conditional operators (&& and ||) are commonly called short-circuit
operators because they do not always evaluate the entire expression. Thus, they
are also used to produce more efficient code by ignoring unnecessary logic.



The switch Statement



Another form of selection statement is the switch statement, which executes
a set of logic depending on the value of a given parameter. The types of the values
a switch statement operates on can be booleans, enums, integral types, and strings.
Lesson 2: Operators, Types, and Variables discussed
the bool type, integral types and strings and Lesson 17: Enums will teach you what an enum type is. Listing 3-2 shows how to use the switch
statement with both int and string types.


Listing 3-2. Switch Statements: SwitchSelection.cs


using System;



class SwitchSelect

{

   
public size="2">static void size="2"> Main()

    {

       
string myInput;

       
int myInt;



        begin:



        Console.Write("Please enter a number
between 1 and 3: ");

        myInput = Console.ReadLine();

        myInt = Int32.Parse(myInput);



       
// switch with integer type

    size="2">     switch size="2"> (myInt)

        {

           
case 1:

               
Console.WriteLine("Your number is {0}.", myInt);

               
break;

           
case 2:

               
Console.WriteLine("Your number is {0}.", myInt);

               
break;

           
case 3:

               
Console.WriteLine("Your number is {0}.", myInt);

               
break;

           
default:

               
Console.WriteLine("Your number {0} is not between 1 and 3.", myInt);

               
break;

        }



        decide:



        Console.Write("Type \"continue\" to go
on or \"quit\" to stop: ");

        myInput = Console.ReadLine();



       
// switch with string type

    size="2">     switch size="2"> (myInput)

        {

           
case "continue":

               
goto begin;

           
case "quit":

               
Console.WriteLine("Bye.");

               
break;

           
default:

               
Console.WriteLine("Your input {0} is incorrect.", myInput);

               
goto decide;

        }

    }

}




Note: Listing 3-2 will throw an exception if you enter any value other
than an int. i.e. the letter 'a' would be an error. You can visit
Lesson 15: Introduction to Exception Handling to
learn more about how to anticipate and handle these type of problems.



Listing 3-2 shows a couple of switch statements. The switch statement
begins with the switch keyword followed by the switch expression.
In the first switch statement in listing 3-2, the switch expression
evaluates to an int type, as follows:



       
// switch with integer type

    size="2">     switch size="2"> (myInt)

        {

           
case 1:

               
Console.WriteLine("Your number is {0}.", myInt);

               
break;

           
case 2:

               
Console.WriteLine("Your number is {0}.", myInt);

               
break;

           
case 3:

               
Console.WriteLine("Your number is {0}.", myInt);

               
break;

           
default:

               
Console.WriteLine("Your number {0} is not between 1 and 3.", myInt);

               
break;

        }



The switch block follows the switch expression, where one or more
choices are evaluated for a possible match with the switch expression.
Each choice is labeled with the case keyword, followed by an example that
is of the same type as the switch expression and followed by a colon (:).
In the example we have case 1:, case 2:, and case 3:.
When the result evaluated in the switch expression matches one of these
choices, the statements immediately following the matching choice are executed,
up to and including a branching statement, which could be either a break,
continue, goto , return, or throw statement.
table 3-1 summarizes the branching statements.


Table 3-1. C# Branching Statements



























Branching statement

Description

break

Leaves the switch block

continue

Leaves the switch block, skips remaining logic in enclosing loop, and goes back
to loop condition to determine if loop should be executed again from the beginning.
Works only if switch statement is in a loop as described in
Lesson 04: Control Statements - Loops.

goto

Leaves the switch block and jumps directly to a label of the form "<labelname>:"

return

Leaves the current method. Methods are described in more detail in
Lesson 05: Methods

throw

Throws an exception, as discussed in Lesson 15: Introduction
to Exception Handling.


You may also include a default choice following all other choices. If none
of the other choices match, then the default choice is taken and its statements
are executed. Although use of the default label is optional, I highly recommend
that you always include it. This will help catch unforeseen circumstances and make
your programs more reliable.



Each case label must end with a branching statement, as described in table
3-1, which is normally the break statement. The break statement
will cause the program to exit the switch statement and begin execution
with the next statement after the switch block. There are two exceptions
to this: adjacent case statements with no code in between or using a goto
statement. Here's an example that shows how to combine case statements:



       
switch (myInt)

        {

           
case 1:

           
case 2:

           
case 3:

               
Console.WriteLine("Your number is {0}.", myInt);

               
break;

           
default:

               
Console.WriteLine("Your number {0} is not between 1 and 3.", myInt);

               
break;

        }



By placing case statements together, with no code in-between, you create
a single case for multiple values. A case without any code will automatically fall
through to the next case. The example above shows how the three cases for myInt
equal to 1, 2, or 3, where case 1 and case 2 will fall through
and execute code for case 3.



A case statement can only be an exact match and you can't use logical
conditions. If you need to use logical conditions, you can use an if/else
if/else
statement.



Another way to control the flow of logic in a switch statement is by using
the goto statement. You can either jump to another case statement, or jump
out of the switch statement. The second switch statement in Listing 3-2
shows the use of the goto statement, as shown below:



       
// switch with string type

    size="2">     switch size="2"> (myInput)

        {

           
case "continue":

               
goto begin;

           
case "quit":

               
Console.WriteLine("Bye.");

               
break;

           
default:

               
Console.WriteLine("Your input {0} is incorrect.", myInput);

               
goto decide;

        }



Note: in the current example, "continue", is a case of the switch statement
-- not the keyword.



The goto statement causes program execution to jump to the label following
the goto keyword. During execution, if the user types in "continue", the
switch statement matches this input (a string type) with the case
"continue":
label and executes the "goto begin:" instruction.
The program will then leave the switch statement and start executing the
first program statement following the begin: label. This is effectively
a loop, allowing you to execute the same code multiple times. The loop will end
when the user types the string "quit". This will be evaluated with the
case "quit": choice, which will print "Bye." to the console, break out
of the switch statement and end the program.



Warning: You should not create loops like this. It is *bad* programming style. The
only reason it is here is because I wanted to show you the syntax of the goto
statement. Instead, use one of the structured looping statements, described in Lesson 04: Control Statements - Loops.



When neither the "continue" nor "quit" strings are entered, the "default:"
case will be entered. It will print an error message to the console and
then execute the goto decide: command. This will cause program execution
to jump to the first statement following the decide: label, which will
ask the user if they want to continue or quit. This is effectively another loop.



Clearly, the goto statement is powerful and can, under controlled circumstances,
be useful. However, I must caution you strongly on its use. The goto statement
has great potential for misuse. You could possibly create a very difficult program
to debug and maintain. Imagine the spaghetti code that could be created by random
goto statements throughout a program. In the next lesson, I'll show you
a better way to create loops in your program.




Summary



The if statement can be written in multiple ways to implement different
branches of logic. The switch statement allows a choice among a set of
bool, enum, integral, or string types. You use break,
continue, goto, return, or throw statements
to leave a case statement. Be sure to avoid the goto statement in your
code unless you have an extremely good reason for using it.



In addition to branching based on a condition, it is useful to be able to execute
a block of statements multiple times. A goto statement is not proper or
adequate for such logic. Therefore, I invite you to return for
Lesson 4: Control Statements - Loops
. This will be a continuation of the
same topic.




Your feedback and constructive contributions are welcome.  Please feel free
to contact me for feedback or comments you may have about this lesson.

Your Ad Here