C# is pronounced as "C sharp". It is a new programming language that enables programmers in quickly building solutions for the Microsoft .NET platform.
Today, one cannot, just cannot, afford to ignore C#. It is our considered opinion that it holds immense promise and we are going to try our best, through this book, to help you realize its potential. Be assured, we are not going to teach you just another programming language. It is our intention to help you apply C# in practical situations, to actually implement your newly acquired knowledge on the Net.
With this brief introduction, let us embark on a path that will take you to new adventures in the world of Internet. In this chapter, we will get you started with C# by introducing a few very simple programs. For remember, even a journey of a thousand miles must begin with a single step.
We assume that you have no prior knowledge of any programming language. But before we get ensnared in the fascinating world of C#, let's make a directory where we will save all our work. In order to do so, click on Start, Programs, then go to Accessories and select Command Prompt (Windows 2000) or the MS-DOS Prompt as it is called in Windows 98. Once you are at the command prompt create a directory called csharp (md csharp) and change to this directory (cd csharp). Now type the command 'edit a.cs', which will open the MS-DOS editor - the world's simplest editor.
C:\csharp>edit a.cs
Yes, we very well understand how you must be yearning to write your first C# program and get it working. But before we do that, there are certain intricacies that you must understand. What a.cs refers to is called the filename or program name. Here we have named our file or program a.cs. Why a.cs? Well, before we began writing this book, we consulted a renowned astrologer who predicted that if we named our first file a.cs then great luck would be showered on us. Not wanting to quarrel with the stars, we named our file a.cs. But you are free to go ahead and call your file any name you want. But then do so at your own risk! Remember, forewarned is forearmed!
Jokes aside, 'cs' is the extension used for C# files. They say of all the things you wear, your expression is the most important. Notwithstanding this, one does look more dapper in a suit rather than a vapid shirt and trousers. Similarly, though it is not mandatory to provide the extension 'cs', you can make a filename seem more impressive by giving it an extension. To reiterate, you could have given the extension say 'ws' too; it does not matter. But absent minded as we are, it is more prudent to give appropriate extensions while naming files.
As the first step, we will understand the basic structure of a C# program.
a.cs
class zzz
{
}
Here we start with the word class zzz followed by open and close curly braces. A class is nothing but a collection --- a collection of everything that the programming language contains. It is like a packet or a container, which can hold anything. Hence everything in a C# program must be enclosed within a class. We have named our class zzz, again you could have named it anything else but if you would rather follow our naming convention (for reasons well amplified above!), name it zzz.
Now for the part that you've been eagerly waiting for!
In order to execute the program, go to the File menu, and click on Exit. You will get a dialog box asking you whether you want to save the file or not, say yes. Now that we have typed and saved our file we need to execute it. The compiler creates executable code. The command used to call the C# compiler is csc followed by the program name. Since our program name is a.cs, the command csc a.cs will call the compiler. A compiler is a program which understands the C# programming language. Thus the word class is part and parcel of the C# language. Microsoft lets you freely download the C# compiler from their web site : http://msdn.microsoft.com/library/default.asp. Select .Net Framework SDK under .NET Development. Choose the Download option to download the sdk which is around 127 MB large. Install the product on your machine cause if you don’t, none of the following programs will work. Also, Internet Explorer 5.5 and Microsoft Data Access Components(2.7) must be installed prior to installing the sdk
Once done, type the command as follows:
C:\csharp>csc a.cs
You will see the following output on your screen in the dos box.
Microsoft (R) Visual C# Compiler Version 7.00.9254 [CLR version v1.0.2914] Copyright (C) Microsoft Corp 2000-2001. All rights reserved.
error CS5001: Program ‘a.exe’ does not have an entry point defined
Just as the excitement was beginning to grow, our program returns with an error message. Don't worry, occasional failure is the price of improvement.
The error message starts with an error number CS5001 followed by a cryptic message, which we do not understand.
We are aware of the fact that everything has a beginning and an end. Similarly, a C# program also has a start and an end. Ah! Now you realize why the error occurred. We forgot to tell C# where to start executing our program from. This starting point is also called an entry point.
You can specify the entry point by adding static void Main() to your program, just as we have done below.
a.cs
class zzz
{
static void Main()
{
}
}
Compile the above code giving the command as csc a.cs. Voila! Now no errors.
The compiler will now generate an exe file called a.exe. Giving the command dir at the command prompt will prove the same. On keen observation you will notice that among the 2 files listed, there is a file by the name a.exe. Simply type 'a' at the command prompt, your program will now be executed!
C:\csharp>a
The program will run but shows no output on our screen. But, at least we get no errors.
The words, static and void, will be explained to you a little later, in the right perspective. Thus if you had felt the beginnings of a massive headache, you can breathe easy! Anything followed by '(' and ')' brackets is called a function. So, it is obvious that Main is nothing but a function. Here we are creating a function called Main. It is followed by the '{' and '}' curly braces. Note that the letter M in Main is capital. Thus C# requires a function called Main, which is the first function that will be executed. Failure to do so will result in an error. Ergo, whenever you see a word beginning with an open '(' and close bracket ')', C# and most other programming languages call it a function. The { signifies the start of a function and the } signifies the end of the function. The guys who designed the language decided to use {} braces instead of start and end. When you tell people that you are learning a programming language, you are actually learning to use {} braces to specify the beginning and end of a function. These rules have to be remembered by rote. You have no choice.
Now we are ready to add some code in our program. In order to do so, add the line WriteLine("Hell"), just as we have done below.
a.cs
class zzz
{
static void Main()
{
WriteLine("Hell")
}
}
Oops! The astrologer had promised showers of luck! Even a drizzle seems far away! Executing the above program results in the following error:
Compiler Error
a.cs(5,18): error CS1002: ; expected
The error message begins with the file name, a.cs followed by round brackets containing the line number and the column number, where the error occurred. The compiler informs us that it found an error on line number 5 and column number 18 and it expects a ;.
As the cliché goes, when the going gets tough, the tough get going. So we shouldn't lose heart as yet; let's understand why this error occurred.
Look at WriteLine within the brackets; doesn't it ring a bell? Isn't WriteLine a function too? But here we do not have the curly braces following it. This is because here we are not creating a function like we created Main. Then what is it that we are doing? We are calling a function called WriteLine, which has already been created.
The error says ';' expected. Though it is obvious to us that the statement has ended, unfortunately for you and me, C# isn't so smart. It requires a semi-colon to tell it loud and clear that the statement has ended. Merely pressing enter does not suffice. Though not so for other programming languages, in C# it is mandatory to use a semi-colon. Alas! Each programming language has its own rules!
At this juncture, an intelligent question would be - But why semi-colon? Why not any other punctuation mark? We don't know for sure but perhaps the developers of C# were asked to select a character that would indicate the end of a statement. The non-compromising species that we are, they could not arrive at a consensus. Result? Grandma's recipe of eene meene mina mo! When they stopped, their finger was pointing at the semi-colon, hence they selected the same.
Thus rules are rules; as preposterous as they may sound, they must be followed.
Add the semi-colon and execute the program. Also languages like ABAP/4 from SAP ends lines with a dot (full stop). Thus we expect to understand programming in English. Every language expects an end of statement/command terminator. Every language expects a symbol to denote when the user has finished saying something. In C# it is a ; , other languages have their own symbols. Remember that the statement or function WriteLine was written on line number 5 hence the error reported line number 5.
a.cs
class zzz
{
static void Main()
{
WriteLine("Hell");
}
}
Compiler Error
a.cs(5,1): error CS0103: The name 'WriteLine' does not exist in the class or namespace 'zzz'
Another error! We are extremely disappointed, it just doesn't seem our day. However we firmly believe that you may be disappointed if you fail, but are surely doomed if you don't try. And we don't want to be doomed do we? So let's keep our chin up and carry on.
But you know what's most irritatingly bothersome? Why are all error messages so difficult to understand? Well, with the experience that we have gained over the years we have learnt that if error messages could be understood then we wouldn't get them in the first place!
In any case, to be truly candid, the error occurred because we pulled a fast one on you! We are calling a function WriteLine but in fact no such function exists. The accurate name of the function is not WriteLine but System.Console.WriteLine. Microsoft is known to fancy big names and here is one more example. In any case, let's execute the program.
a.cs
class zzz
{
static void Main()
{
System.Console.WriteLine("Hell");
}
}
Output
Hell
Finally, no errors! Surely you feel blessed! It displays the word 'Hell', and we suspect that's exactly what you are going through right now. But if you follow our programs step by step we assure you that heaven is not too far away.
Now remove all the extra spaces and 'enters' from your program, just as we have done below and compile the program again.
a.cs
class zzz {static void Main() {System.Console.WriteLine("Hell");}}
Output
Hell
You will notice that doing so does not give any errors. Just like the previous program, it displays 'Hell'. The C# compiler is not affected by it. But using spaces and 'enters' definitely make your program neater and thereby more readable. The effect is especially appreciated in large programs and more so when someone else has to go through them. Having said that, anyway, the first thing that C# compiler does is removes all the spaces and enters from the program code you have written.
In the next program, we have called WriteLine function twice.
a.cs
class zzz
{
static void Main()
{
System.Console.WriteLine("Hell");
System.Console.WriteLine("Bye");
}
}
Output
Hell
Bye
On executing this program, 'Hell' and 'Bye' are displayed on two separate lines. Here, we are not required to give anything that has the 'enter' effect, WriteLine automatically prints on a new line each time. Which simply means you can call a function as many times as you like.
In the next illustration, let's understand how functions are called and created. Here we are calling a function abc().
a.cs
class zzz
{
static void Main()
{
abc();
}
}
Compiler Error
a.cs(5,1): error CS0103: The name 'abc' does not exist in the class or namespace 'zzz'
On executing this program you will get, what else, but an error. Peter Drucker, the famed management guru had once said that the better a man is, the more mistakes he will make, for the more new things he will try. So there you go - next time you encounter an error, simply tell yourself that you have just become better at whatever you are doing.
In any case, the error says that abc does not exist. Here we are calling a function called abc(), but where is abc() defined or created ? It is not a function that has been provided by C# to us free of charge. It is our own homegrown function that we are calling. The lesson here is that we cannot call a function without first creating it. So, to rectify this error we will first create a function abc. Our next example demonstrates this.
a.cs
class zzz
{
static void Main()
{
abc();
}
static void abc()
{
System.Console.WriteLine ("Hell");
}
}
Output
Hell
In the function abc, we have included only one statement- WriteLine within the curly braces. The '{' and '}' braces indicate the beginning and the end of this function. Alternatively, a function can contain millions of lines of code that will be executed when the function is called. Since everything is contained in a class, our function abc is also created within the class zzz but outside Main. But the function is called from Main. On executing the program, 'Hell' is displayed. This is because we have included the code for 'Hell' to be displayed in the function abc. Thus, when the control reaches the line abc(); it searches for that function and executes the code within that function. We will explain static and void later as promised.
You can call as many functions as you like from your program. But you must remember to separate each one with a semi-colon. The next program illustrates this.
a.cs
class zzz
{
static void Main()
{
abc();
pqr();
abc();
}
static void abc()
{
System.Console.WriteLine ("I am ABC");
}
static void pqr()
{
System.Console.WriteLine ("I am PQR ");
}
}
Output
I am ABC
I am PQR
I am ABC
At first the function abc is called, then pqr and then again we are calling abc. On executing this program 'I am ABC', 'I am PQR' and 'I am ABC' will be displayed. This is because we have included the code for these lines to be displayed in the respective functions.
In the following program we are calling the function pqr from abc and not from Main.
a.cs
class zzz
{
static void Main()
{
abc();
}
static void abc()
{
pqr();
System.Console.WriteLine ("I am ABC");
}
static void pqr()
{
System.Console.WriteLine ("I am PQR ");
}
}
Output
I am PQR
I am ABC
In the function abc, we are first calling pqr and then displaying 'I am ABC' using the WriteLine function. Hence, first 'I am PQR' is displayed and then 'I am ABC'. Thus, this program demonstrates how functions can be called from other functions.
Now that we have created our own functions abc and pqr, we have an intuitive understanding of how C# created the function System.Console.WriteLine. The next program uses the printing or formatting capabilities of the WriteLine function.
a.cs
class zzz
{
static void Main()
{
System.Console.WriteLine("100 {0}",100);
}
}
Output
100 100
The zero in the curly braces means that after the first comma there is some value and that it should display this value. You cannot differentiate between the two 100's. The {0} is replaced with 100, the number, which follows the first comma. If you don't like the number 100, use the number 420 instead. We won't mind - at least it's something that some of you can easily identify with!
The program below is simply an extension of the above.
a.cs
class zzz
{
static void Main()
{
System.Console.WriteLine("100 {0},{1}",100,200);
}
}
Output
100 100,200
Here the {0} is replaced with 100 and {1} is replaced with 200. The comma (,) separates the two numbers. Thus {0} means the first number and {1} means the second. C# likes to count from zero and not one.
a.cs
class zzz
{
static void Main()
{
ii;
ii=20;
System.Console.WriteLine ("{0}",ii);
}
}
Compiler Error
a.cs(5,1): error CS0201: Only assignment, call, increment, decrement, and new expressions can be used as a statement
a.cs(5,1): error CS0103: The name 'ii' does not exist in the class or namespace 'zzz'
a.cs(6,1): error CS0103: The name 'ii' does not exist in the class or namespace 'zzz'
a.cs(7,33): error CS0103: The name 'ii' does not exist in the class or namespace 'zzz'
Experience is knowing a lot more of things you shouldn't. But now that you have decided to embark upon this book, let's see what you should know!! Executing this program results in a large number of errors as shown above. Let's understand the rationale behind it. Here we have included a strange word --- ii. This word ii is being given a value of 20 as ii=20. But C# is a shy program. It does not speak to strangers! Here ii is nothing but a stranger to C#. C# does not know who or what ii is. You can't just write words that you feel good about. So, in order to rectify this error we must tell C# who ii is.
Our next program will demonstrate how this can be done.
a.cs
class zzz
{
static void Main()
{
int ii;
ii=20;
System.Console.WriteLine ("{0}",ii);
}
}
Output
20
Note that in this program we have added the word int before ii. The word int indicates that ii is an integer or a number. Each time we create our own word like ii, C# wants to know what we will store in this word. We will understand this better and in totality in just a little while. Here we are initializing ii to 20 or giving it a value of 20 by writing ii = 20. Why 20? Maybe because we are feeling very youthful today! Following this we have the WriteLine function. Now, it is a known fact that jaggery is a good substitute for sugar. Similarly, in C# you can substitute a number with a word. So, in WriteLine we have used the word ii instead of a number. The word ii gets replaced with the value 20. So, on executing the program, the number 20 is displayed.
You may be wondering as to why should you ever use a word when you can use a number directly. Our next program will enlighten you on this.
a.cs
class zzz
{
static void Main()
{
int ii;
ii=20;
System.Console.WriteLine ("{0}",ii);
ii=30;
System.Console.WriteLine ("{0}",ii);
ii=ii+10;
System.Console.WriteLine ("{0}",ii);
ii=ii+1;
System.Console.WriteLine ("{0}",ii);
ii++;
System.Console.WriteLine ("{0}",ii);
}
}
Output
20
30
40
41
42
The first three lines of this program are identical to those of our previous one. Thus in the first, the WriteLine function will display the number 20. Thereafter, by saying ii=30 we are initializing the word ii to a value 30. In effect, we are changing the value of ii from 20 to 30. So, WriteLine will now display 30.
For conceptual understanding, we earlier introduced ii as a word. However, in the software world, it has another name; it is actually called a variable.
Thus, a variable is a word whose value varies or changes. ii initially had a value 20 that changed to 30.
Coming back to what the word int means- when you say int, int means integer or number. When we say int ii, it means that the variable ii will store a number. ii could also be used to store the letters of the alphabet like the names of people. It could also store a date. But here we wanted ii to store a number. So, we have to tell C# in advance as to what the variable is going to store. Hence we say int ii. C# understands the word int as int is a part of the C# programming language.
The variable ii started with the value 20 and is now holding a value 30. In the next line we have ii=ii+10. The 'equal to' sign makes this statement look complicated. To avoid confusion, always start by looking to the right of the 'equal to' sign. To the right of the equal to sign we have ii+10. Since ii is holding the value 30, ii+10 is read as 30+10, which evaluates to 40. Hence ii=ii+10 will now be read as ii=40. This value 40 is given to the variable on the left-hand side. Now that ii has a value 40, WriteLine will display 40. Similarly, we say ii=ii+1. Here the value of ii is incremented by one. And the new value of ii, which is 41 will be displayed by WriteLine. In the next line we have ii++. Note that ii=ii+1 and ii++ do the same thing. They both increment the value of ii by 1. Hence WriteLine will now print the number 42.
This is a big problem with programming languages. As there are many ways to skin a cat, there are also many ways to increase the value of a variable. So ii = ii + 1 and ii++ do the same thing.
A programmer thus has the choice to use either of the two ways to do the same thing. There you go ---as you can see, first time programmers have unfortunately a lot to learn.
In daily life, a hundred different people can do the same chore in a hundred different ways. Similarly, in programming there is more than one way of doing a particular thing. Programming becomes a problem because of redundancy. Since there are two ways of doing the same thing you have to learn them both and that can be very confusing. Of course, it is at your discretion to choose the method you are comfortable with. Henceforth, even though there may be many other ways of doing a particular thing, we will teach you only one method that we find appropriate.
A variable is a word that stores a value. This value can be changed at will by the programmer. Wherever we can use a number, we can also use a variable.
The next program may seem alien to you. This is because it speaks the truth. If it finds that a condition is true it outputs true and if it finds the condition to be false it outputs false. Very unlike some of you, who would do just the opposite!
a.cs
class zzz
{
static void Main()
{
System.Console.WriteLine ("{0}", 5 > 2);
System.Console.WriteLine ("{0}", 5 < 2);
System.Console.WriteLine ("{0}", 2 < 2);
System.Console.WriteLine ("{0}", 2 <= 2);
System.Console.WriteLine ("{0}", 2 != 2);
System.Console.WriteLine ("{0}", 2 !=3);
}
}
Output
True
False
False
True
False
True
Let's understand this program line by line as usual.
Here the first line says WriteLine("{0}", 5 > 2); Is 5 > 2 ? Yes. So the condition 5 > 2 evaluates to true. Hence the {0} in WriteLine is replaced with True and the WriteLine function displays True. 5 > 2 is called a condition. A condition is like a question which has to result in a yes or no or a true or false. In this case the number 5 is greater than the number 2 and hence the function evaluates to true. C# understands the words true and false.
In the second WriteLine we have the condition 5 < 2. Is 5 < 2? No. So the condition 5 < 2 evaluates to false and hence WriteLine displays False. Similarly, the next condition 2 < 2 is not true and hence False is displayed.
In the next statement we have 2 <= 2. Here the first sign being '<' it is first checked whether 2 < 2? No, 2 is not less than 2. So then the second sign '=' is checked i.e., whether 2 = 2? Yes. So the condition 2 <= 2 evaluates to true and WriteLine displays True. <= is thus two conditions in one .
In the next WriteLine we have the condition 2 != 2. '!=' means 'not equal to'. But 2 is equal to 2, hence the condition evaluates to false and False is displayed. The comparison is false, therefore the condition is false.
In the last statement we have the condition 2 != 3. Is 2 != 3? Yes 2 is not equal to 3, so the condition evaluates to true and True is displayed. This True and False is a special data type in C#. It is called 'Bool' or boolean derived from Boolean algebra.
a.cs
class zzz
{
static void Main()
{
bool ii;
ii=true;
System.Console.WriteLine ("{0}", ii);
ii=false;
System.Console.WriteLine ("{0}", ii);
}
}
Output
True
False
In our previous programs we used the data type int for the variable ii. This meant that ii could store integers or numbers. Similarly, you can now initialize ii to either true or false. This is possible by using the data type bool for ii. A data type means the type of data a variable can hold. Therefore, here we are saying bool ii. In the first case we are initializing ii to true. So in WriteLine, {0} is replaced with true. In the second case ii is initialized to false and {0} is replaced with false.
In a gist, we now know that variables can be either bool or logical or they can contain the words True or False. Also, variables can also contain numbers.
Let's see how C# distinguishes between data types.
a.cs
class zzz
{
static void Main()
{
bool ii; int jj;
ii=10;
jj=false;
}
}
Executing the above program gives the following errors:
Compiler Error
a.cs(6,4): error CS0031: Constant value '10' cannot be converted to a 'bool'
a.cs(7,4): error CS0029: Cannot implicitly convert type 'bool' to 'int'
If you want the rainbow, you gotta put up with some rain. So let’s understand the reason behind the errors. Here C# is internally saying that it distinguishes between data types. In that sense C# is very petty about what values you give to variables. Bool can't mix with int and vice versa. Since ii is a bool you can't initialize it to 10, which is a number. C# is very strict about this. And because jj is an int you can't initialize it to false. So you have to be very careful about how you initialize your variables. After all it doesn't make sense to ask someone who is good at driving to teach computers and vice versa. Everyone has his or her place in life. Similarly, variables also have their place. Hence a variable declared as a bool can only have values true or false. Similarly, int can have only numbers or integers, it cannot take true or false values.
Our next program is similar to one of the previous programs.
a.cs
class zzz
{
static void Main()
{
bool ii;
ii=6 < 7;
System.Console.WriteLine ("{0}", ii);
}
}
Output
True
Here ii is a variable of type bool. In the next statement we have ii = 6 < 7. As you already know, in such a case you should start by looking to the right of the 'equal to sign'. Because 6 is less than 7 the condition evaluates to true and ii will be initialized to true. Hence {0} is replaced with the value of ii, which is true and True is displayed.
C# is called a strongly typed language because you cannot initialize a variable of type int to a variable of type bool. The reason C# is very strict about this is because this system eliminates a large number of sloppy programming errors. Some languages like C on which C# is based on do not care what values you initialize your variables to. C# is stricter than even Java. In some ways, it's like your mother when it comes to telling you what you are doing wrong in life. Thus it is extremely difficult to make dumb errors in C#. Remember when you are writing code in C#, the compiler is always peering down your shoulder making sure you do not get away with any errors.
If Statement
So far the code that we have written is rather useless. This is because it always gets executed. Life is enjoyable only because it is unpredictable. We don't know what tomorrow is going to bring. Variety is the spice of life! Similarly, we would like to write computer programs, which add spice to programming. We want to write programs that behave differently depending upon different situations or circumstances. And this can be achieved with the help of the if statement. So fasten your seatbelts and get set to ride!
The next few programs will demonstrate the usefulness and application of the if statement.
a.cs
class zzz
{
static void Main()
{
if ( false )
System.Console.WriteLine ("Hi");
}
}
Compiler Warning
a.cs(6,1): warning CS0162: Unreachable code detected
In this program we have included the word 'if' followed by false in round brackets. This is the if statement and its syntax. Syntax is the grammar in writing. Thus we have no choice but to abide by the rules. It is called a statement because anything that C# recognizes is called a statement. When you run this program, you realize that there is no output. So this program will simply display nothing. Now you know why we get the above warning as our code will never get executed.
Let's understand the rationale behind it.
The if statement lets you include decision making in your program. It decides whether to execute the next line or not. When the if statement evaluates to false then the next line is ignored. The if statement brings with it the power to decide whether certain code should be executed or not.
The following program will make this concept clearer.
a.cs
class zzz
{
static void Main()
{
if ( false )
System.Console.WriteLine ("Hi");
System.Console.WriteLine ("Bye");
}
}
Output
Bye
The if statement looks at the immediate next line, it doesn't look at the line after that. Since the if statement influences only one line, you will see only Bye displayed and not Hi. Same warning again.
But if you want both the statements to be affected by the if then enclose them within curly braces. This is illustrated below.
a.cs
class zzz
{
static void Main()
{
if ( false )
{
System.Console.WriteLine ("Hi");
System.Console.WriteLine ("Bye");
}
}
}
Here we have included both the lines of code within the braces. Now the if statement will affect both the lines of code. The condition being false, nothing is displayed. Thus, the if statement gives us the option to execute or not to execute a certain piece of code.
If we always use false then the code will never be called. But what did we tell you about conditions? They return either true or false. So, in the next program we have 3 > 8 as the condition. Since 3 is not greater than 8 the condition evaluates to false. Since there are no curly braces, only the next line is affected by the if statement. Hence only Bye is displayed.
a.cs
class zzz
{
static void Main()
{
if ( 3 > 8 )
System.Console.WriteLine ("Hi");
System.Console.WriteLine ("Bye");
}
}
Output
Bye
Let's look at another variation of this program. Now, the interesting part is that wherever you can use a condition you can also use a variable which is of type bool, which we know evaluates to either true or false.
a.cs
class zzz
{
static void Main()
{
bool ii;
ii=true;
if ( ii )
{
System.Console.WriteLine ("Hi");
System.Console.WriteLine ("Bye");
}
}
}
Output
Hi
Bye
Here the variable ii is declared as a bool and then initialized to true. In the next line we have if (ii). The variable ii holds the value true and hence the if condition evaluates to true. The condition being true both Hi and Bye are displayed. Note that here both the statements are included in the curly braces resulting in both the statements being affected by the if statement. Thus the if statement is affecting a block of statements. Declaration is another way of saying that we are creating a variable.
In the following program we have an if with the else. If the if condition evaluates to true then the statement following it is called but if it evaluates to false then the else is called.
a.cs
class zzz
{
static void Main()
{
if ( false )
System.Console.WriteLine ("Hi");
else
System.Console.WriteLine ("Bye");
}
}
Output
Bye
Here, since the condition evaluates to false the else is called and hence Bye is displayed. Thus the additional else statement specifies a statement that is executed when the condition is false. This construction covers all possibilities, as a condition can be either true or false. In an 'if-else' construct one of them have to be executed. Computer programs are said to be made intelligent because of the if statement. The more the use of the if statement, the more intelligent your program becomes. The if statement is one of the main building blocks of any programming language. Thus all programming languages have to have a if statement.
Loops
The if statement is the cornerstone of programming because it lends intelligence and a decision making power to the language. The second important constituent of any programming language is a looping construct. In a program many times you would need to repeat instructions. In C#, the for statement is one form of a loop that lets you repeat statements. However, as we already know, a statement can also be a block of statements, thus it also allows repetition of multiple statements.
Our next program explains the for loop.
a.cs
class zzz
{
static void Main()
{
int ii;
for ( ii = 1; ii <= 5; ii++)
System.Console.WriteLine ("Hi {0}", ii);
}
}
Output
Hi 1
Hi 2
Hi 3
Hi 4
Hi 5
The for has 2 semicolons as part of its syntax or rules. The statement up to the first semicolon is executed only once. For the first time and only the first time ii is initialized to 1. Remember up to the first semicolon the statement is executed only once. The statement enclosed within the first and second semicolon is a condition. The condition checks whether ii <= 5 evaluates to true. Since this condition evaluates to true, the statement within the open and the close braces gets executed. If the condition evaluates to false, the statement is ignored and the loop terminates. The variable ii has a value 1 which is less than 5, so System.Console.WriteLine will be called which displays 'Hi 1' as the value of ii is 1. After the statement gets executed, the last part of the for i.e. from the second semicolon to the closing bracket gets executed. ii++ will increase the value of ii by 1, making it 2. The condition is checked again, is 2 <= 5. The answer here is true, so 'Hi 2' is displayed. And this roller coaster goes on till the condition is false. When ii has the value 6, the condition checked is, is 6 <= 5. The answer being false, the for terminates. This is how the for statement enables the repetition of code.
Our next example will further help to illustrate this.
a.cs
class zzz
{
static void Main()
{
int ii;
for ( ii = 1; ii <= 5; ii++)
System.Console.WriteLine ("Hi {0}", ii);
System.Console.WriteLine ("Hi {0}..", ii);
}
}
Output
Hi 1
Hi 2
Hi 3
Hi 4
Hi 5
Hi 6..
In this program we have two WriteLine statements. The for loop follows the same rules as the if statement. Thus in absence of curly braces the for loop will affect only the immediate next statement. Therefore, the for loop will print numbers from 1 to 5 along with hi. The moment the for loop terminates, ii with the dots will print Hi 6... This goes to prove that when ii has a value six, the for loop will terminate.
The following program demonstrates how the for loop enables repetition of multiple statements.
a.cs
class zzz
{
static void Main()
{
int ii;
for ( ii = 1; ii <= 5; ii++)
{
System.Console.WriteLine ("Hi {0}", ii);
System.Console.WriteLine ("Hi {0}..", ii);
} } }
Output
Hi 1
Hi 1..
Hi 2
Hi 2..
Hi 3
Hi 3..
Hi 4
Hi 4..
Hi 5
Hi 5..
Here, both the WriteLine statements are enclosed within curly braces. Therefore, both the statements are affected by the for loop. Hence, in this case, each number is displayed twice along with Hi, once without the dot and once with the two dots.
Similar to the for loop is the while loop.
a.cs
class zzz
{
static void Main()
{
int ii;
ii=1;
while ( ii <= 5 )
{
System.Console.WriteLine ("Hi {0}", ii);
}
}
}
The while loop takes a condition, hence the variable ii is initialized to 1 before entering the loop. The condition checks whether ii <= 5 evaluates to true. Currently the value of ii is 1. The condition evaluates to true and the statement within the curly braces is executed. System.Console.WriteLine is called with Hi and the value of ii. Note that here we are not changing the value of ii within the loop. Since the value of ii remains 1 the condition always evaluates to true and the loop will go on forever, indefinitely.
We can't have anything go on forever, can we? There has to be a stop to it somewhere! Our next program will resolve this problem.
a.cs
class zzz
{
static void Main()
{
int ii;
ii=1;
while ( ii <= 5 ){
System.Console.WriteLine ("Hi {0}", ii);
ii++;
}
}
}
Output
Hi 1
Hi 2
Hi 3
Hi 4
Hi 5
This program is similar to the previous one. The only change that we have made is that we added the line ii++; thus for the first time Hi 1 is displayed. Then the moment ii++ is encountered the value of ii is incremented by 1, making it 2. Then the condition, 2 <= 5, is checked. The condition being true, once again we enter the loop and Hi 2 is displayed. This will go on until ii becomes 6. Once ii is 6 the condition evaluates to false and the loop terminates.
Your mind may ponder over the question, "Should I use a for or a while?' The for loop is similar to the while loop. To answer your question in the most simple manner "On Mondays, Wednesdays, Fridays use for and on Tuesdays, Thursdays, Saturdays use while. Sundays we assume no one writes code". Alternatively "Toss a coin, heads use while, tails don't use for" ;-)
In other words, it is at your discretion to use the one you are comfortable with. Once again C# offers you multiple ways of doing the same thing.
The Return statement
Let's understand the return statement with our next example.
a.cs
class zzz
{
static void Main()
{
int ii;
ii = abc();
System.Console.WriteLine("hi {0}",ii);
}
static int abc()
{
System.Console.WriteLine("abc");
return 100;
}
}
Output
abc
hi 100
In this program, at first, ii is declared as a variable of type int. Then we start
executing the line ii=abc(); Doesn't the right hand side of the statement ring a bell? Aren't we calling the function abc() ? Hence at this point the control passes to the function abc().
In the function we have the WriteLine statement, which prints 'abc'. Thereafter, we have a return statement. It says return 100. In effect, the function abc() is returning a value 100. Thus the statement ii = abc(); will now be read as ii=100. Now that ii has a value 100, {0} in WriteLine is replaced with 100 and in turn 100 is displayed.
a.cs
class zzz
{
static void Main()
{
int ii;
ii = abc();
System.Console.WriteLine("hi {0}",ii);
}
static void abc()
{
System.Console.WriteLine("abc");
return 100;
}
}
Compiler Error
a.cs(6,6): error CS0029: Cannot implicitly convert type 'void' to 'int'
a.cs(12,1): error CS0127: Since 'zzz.abc()' returns void, a return keyword must not be followed by an object expression
Executing the above program results in errors. Here we have static void abc(). What static means, we will explain a little later. It is with the intention to enable you to learn better, so please bear with us. The word void means nothing. So by saying void abc() we are saying that the function abc() does not return any value. Functions may/maynot return values. Earlier abc returned an int. When a function returns void as in this case, we are saying that abc cannot return a value. But in the function code we have written return 100. Therefore, because of this contradiction we get the error. Note that in the previous program we did not get an error. This was because we had said static int abc(). Here int signifies the return type of the function. Since the function returns a number we used int.
In our next example we have made only one addition i.e. we have added System.Console.WriteLine("Finish"); after the return statement.
a.cs
class zzz
{
static void Main()
{
int ii;
ii = abc();
System.Console.WriteLine("hi {0}",ii);
}
static int abc()
{
System.Console.WriteLine("abc");
return 100;
System.Console.WriteLine("Finish");
}
}
Compiler Warning
a.cs(13,1): warning CS0162: Unreachable code detected
Output
abc
hi 100
On executing this program, you will find that the output is the same as the previous program. To your amazement you do not see the word 'Finish' displayed. No, it is not because C# doesn't like you. The reason is that anything after the return statement is ignored.
Thus, you may have a hundred WriteLine statements after the return statement but they will all be ignored. Simply stated, no lines after return statement will get called. That is why the C# compiler, courteous as it is, gives you a warning and not an error.
More on data types.......
You have already learnt about two data types, int and bool. Our next program introduces a new data type 'string'.
a.cs
class zzz
{
static void Main()
{
string s;
s= "hell";
System.Console.WriteLine(s);
}
}
Output
hell
In this program, the variable s is declared as a string. This implies that s will store mainly letters of the alphabet. Then s is initialized to hell, which is nothing but a collection of the letters of the alphabet. Note that all strings have to be enclosed within double inverted commas. System.Console.WriteLine displays the value of the variable s, which is 'hell'. Earlier we wrote a string in double inverted commas directly. However, this time we are using a variable name instead.
Now we know the first parameter to the WriteLine function is a string. We earlier named our variable ii and now we have called it s. Actually, we name our variables depending upon the time we write our programs. You decide your own rules for naming variables. Anything you enclose in double quotes is called a string. System.Console.WriteLine is smart enough to display strings, bools and int.
Let's look at another variation of the above program.
a.cs
class zzz
{
static void Main()
{
string s;
s= "hell";
System.Console.WriteLine( "{0}", s);
}
}
Output
hell
This program is exactly like the previous one, the only difference being that we have used {0} instead of writing only s. Here the {0} is replaced with the value of s, which is 'hell'. Thus, using the {0} is preferable as it understands a large number of data types and how to display their values.
Consolidating, our next example incorporates all the data types that we have learnt so far.
a.cs
class zzz
{
static void Main()
{
string s;
int ii;
bool jj;
ii=10;
jj=false;
s="hell";
System.Console.WriteLine("{0} {1} {2}", ii, jj, s);
}
}
Output
10 False hell
Here the variable s is declared as a string. Then ii is declared as int and jj is declared as bool. In the next three statements we are initializing each of the variables. ii is initialized to 10, jj is initialized to false and s is initialized to hell. Now, with the help of a single WriteLine statement we are displaying the values of all the variables. {0} is replaced with 10, {1} is replaced with False and {2} is replaced with hell. This goes to prove that all the data types can be displayed together, in a single WriteLine statement. Thus, C# allows all the data types to co-exist in harmony. Now only if the people of our country could do the same!
Passing parameters to functions
By now you are familiar with functions and how functions are called. The next program illustrates how parameters are passed to functions.
a.cs
class zzz {
static void Main()
{
abc(10,false,"hell");
}
static void abc(int i, bool j, string s)
{
System.Console.WriteLine("{0} {1} {2}", i,j,s);
}
}
Output
10 False hell
We have again used the System.Console.WriteLine function to display values of variables or merely display text onto the screen. To have it print something on to the screen, we had to give it the things that we wanted printed. These things are nothing but parameters. We don't pass things to functions; we pass parameters to functions. So far we never created our own functions with parameters.
In this program, we are calling the abc function with three things, with three parameters. The first is a number, the second is a logical value and the third is a string. So, we are passing the values 10, false and hell to the function abc(); These values must be stored somewhere, but where? When we create the function abc we have to state the names of three variables along with their respective data types. This is because the values that we pass will be stored in these variables. Hence we have the variables i, j and s. These are then displayed using WriteLine. Therefore, it will output 10, False and hell. This is how parameters are passed to functions in C#. Remember you decide what names to give to variables. Parameters passed to functions are also variables.
a.cs
class zzz {
static void Main()
{
abc(10,false);
}
static void abc(int i, bool j, string s)
{
System.Console.WriteLine("{0} {1} {2}", i,j,s);
}
}
Compiler Error
a.cs(4,1):error CS1501: No overload for method 'abc' takes '2' arguments
On compiling this program you will encounter the above error. Here we are calling abc with only two parameters, 10 and false. Whereas the function abc is actually created with three parameters. We are passing an erroneous number of parameters, hence the error. Lesson? One must pass the same number of parameters that the function has been created to accept. A mismatch between the number of parameters being passed and those being accepted will definitely assure you of an error. Thus as before, C# does a large number of error checks on your code. For, if it allowed the above function call to go ahead, what would the value of the third parameter s be?
Now change the order of the values that are being passed. Your abc function should look like this- abc("hell",10, false);
a.cs
class zzz
{
static void Main()
{
abc("hell",10,false);
}
static void abc(int i, bool j, string s)
{
System.Console.WriteLine("{0} {1} {2}", i,j,s);
}
}
Compiler Error
a.cs( 5,1): error cs1502: The best overloaded method match for 'zzz.abc(int, bool, string)' has some invalid arguments
a.cs( 5,5 ): error cs1503: Argument '1': cannot convert from 'string' to 'int'
a.cs(5,12): error cs1503: Argument '2': cannot convert from 'int' to 'bool'
a.cs(5,15): error cs1503: Argument '3': cannot convert from 'bool' to 'string'
On executing this program you will be faced with the above errors. These errors have resulted due to a data type mismatch. It is somewhat like putting a round pole in a square peg! How is it going to fit?
While calling the function abc() the first parameter that we are passing is the word "hell". But the function abc() has been created to accept the first parameter as an int. Remember we told you, not so long ago, that C# distinguishes between data types. Thus you can't store a string in a variable of type int. Similarly, the value 10 cannot be stored as a bool and false cannot be stored as a string. Therefore, not only should the number of parameters being passed and accepted be the same but also their data types must match.
Like oil and water do not mix, in the same way you cannot give C# an int when it wants a string. As said earlier, some languages are more forgiving then C# due to which the programmer makes more mistakes in them.
a.cs
class zzz
{
static void Main()
{
abc();
}
}
class yyy
{
static void abc()
{
System.Console.WriteLine("abc");
}
}
Compilation Error
a.cs(5,1): error CS0103: The name 'abc' does not exist in the class or namespace 'zzz'
Seems like we are hooked on to errors!
In this program we have created another class called yyy. We can have as many classes in one .cs file as we like. This program now has two classes, zzz and yyy. The class zzz has a function called Main. Main denotes the starting point of our code and as such is the first function to be called. The class yyy contains a function called abc. Here we are calling the function abc by saying abc(); in class zzz. But class zzz does not have any function by the name abc. Merely giving abc(); encourages C# to assume that abc() exists within the class zzz. But our abc function is contained in yyy. Hence we get an error as we are trying to call a function that exists in another class.
But we are adamant! We want to use the abc function that yyy has. It's human tendency to want things that others have! So, in the next program we are calling the function abc in the class yyy by writing yyy.abc();
a.cs
class zzz
{
static void Main()
{
yyy.abc();
}
}
class yyy
{
static void abc()
{
System.Console.WriteLine("abc");
}
}
Compilation Error
a.cs(5,1): error cs0122: 'yyy.abc() is inaccessible due to its protection level.
When we say yyy.abc(); why the dot? yyy is the name of the class and abc() is the name of the function . Each of these names can be as large as you want, so to separate them a dot is used. Thus when you want to access a function that belongs to another class you can do so by specifying the class name and function name separated by a dot. The dot is like the semicolon. The designers of the language wanted some character as a separator between class name and function name, they chose the dot, they could have also chosen the semicolon again.
You will now realize why we say Console.WriteLine. Obviously, it means that Console is a class and within the class Console there is a function called WriteLine.
But to your dismay, on executing this program you still get an error. Well, few people get what they want, however fewer still want what they get! You may want a particular thing but you will not get it unless the other party gives you the permission to take it, use it or share it. Your only other option is to put up a fight!
We get an error here because we haven't used the word public. The whole idea behind C# is its usability on the net. And the only way you can use it on the net is by having security precautions. So in C# the default rule is - you can't use anything unless explicitly granted permission. Next question. How do you grant the necessary permission?
Being its non-violent self, C# grants permission by using the word public. When we say public, we mean the world at large. So by starting with the word public we are saying that the whole world is now allowed to use this function as we are explicitly granting you rights. If you don't use the word public it will give you an access error.
To rectify the error, add the word public just as we have done below.
a.cs
class zzz
{
static void Main()
{
yyy.abc();
}
}
class yyy
{
public static void abc()
{
System.Console.WriteLine("abc");
}
}
Output
abc
Finally, we have the correct code! See, one of life's greatest ironies is the fact that when you finally master a tough job, you make it look easy!! By using the word public in front of the function abc, we can now call it from zzz by specifying yyy.abc(); Now that the function is called, WriteLine displays 'abc'.
Our next example will enhance your understanding further.
a.cs
class zzz
{
static void Main()
{
yyy.abc();
abc();
zzz.abc();
}
public static void abc()
{
System.Console.WriteLine("abc in zzz");
}
}
class yyy
{
public static void abc()
{
System.Console.WriteLine("abc");
}
}
Output
abc
abc in zzz
abc in zzz
Now we go a step further. In the above program we have two abc functions, one in class zzz and one in class yyy. If you want to call the one in yyy then you say yyy.abc(); but if you want to call the one in zzz then you say zzz.abc() or abc(). The function abc(), by itself, will ask which class is it? Since abc() is in zzz itself, C# assumes it to zzz.abc(); By implication, if the function exists within the same class, it is optional to preface the function with the name of the class. When you execute this program, yyy.abc() will call the abc function in class yyy and WriteLine will display 'abc'. Thereafter, both abc() and zzz.abc() will call the abc function in class zzz. And in each case WriteLine will display 'abc in zzz'. Thus if you do not preface the function name with the name of the class, C# will add the name of the class in which you are calling the function. In our case it is zzz.
No comments:
Post a Comment