Tuesday, September 21, 2010

Main() method in C#

  • The Main method is the entry point of your program, where the program control starts and ends.


class TestClass
{ static void Main(string[] args)
{ // Display the number of command line arguments:
System.Console.WriteLine(args.Length);
}
}
  • It is declared inside a class or struct. It must be static and it should not be public. (In the example above it receives the default access of private.)

  • It can either have a void or int return type.

  • The Main method can be declared with or without parameters.

  • Parameters can be read as zero-indexed command line arguments.

Source:msdn

Exception Handling in C#


Exception handling is an in built mechanism in .NET framework to detect and handle run time errors. The .NET framework contains lots of standard exceptions. The exceptions are anomalies that occur during the execution of a program. They can be because of user, logic or system errors. If a user (programmer) do not provide a mechanism to handle these anomalies, the .NET run time environment provide a default mechanism, which terminates the program execution.


C# provides three keywords try, catch and finally to do exception handling. The try encloses the statements that might throw an exception whereas catch handles an exception if one exists. The finally can be used for doing any clean up process.

The general form try-catch-finally in C# is shown below

try
{
// Statement which can cause an exception.
}
catch(Type x)
{
// Statements for handling the exception
}
finally
{
//Any cleanup code
}

If any exception occurs inside the try block, the control transfers to the appropriate catch block and later to the finally block.

But in C#, both catch and finally blocks are optional(one of them must be present with try). The try block can exist either with one or more catch blocks or a finally block or with both catch and finally blocks.

If there is no exception occurred inside the try block, the control directly transfers to finally block. We can say that the statements inside the finally block is executed always. Note that it is an error to transfer control out of a finally block by using break, continue, return or goto.

In C#, exceptions are nothing but objects of the type Exception. The 'Exception' is the ultimate base class for any exceptions in C#. The C# itself provides couple of standard exceptions. Or even the user can create their own exception classes, provided that this should inherit from either Exception class or one of the standard derived classes of Exception class like DivideByZeroExcpetion ot ArgumentException etc.

Uncaught Exceptions

The following program will compile but will show an error during execution. The division by zero is a runtime anomaly and program terminates with an error message. Any uncaught exceptions in the current context propagate to a higher context and looks for an appropriate catch block to handle it. If it can't find any suitable catch blocks, the default mechanism of the .NET runtime will terminate the execution of the entire program.

//C#: Exception Handling
//Author: rajeshvs@msn.com
using System;
class MyClient
{
public static void Main()
{
int x = 0;
int div = 100/x;
Console.WriteLine(div);
}
}

The modified form of the above program with exception handling mechanism is as follows. Here we are using the object of the standard exception class DivideByZeroException to handle the exception caused by division by zero.

//C#: Exception Handling
using System;
class MyClient
{
public static void Main()
{
int x = 0;
int div = 0;
try
{
div = 100/x;
Console.WriteLine("This line in not executed");
}
catch(DivideByZeroException de)
{
Console.WriteLine("Exception occured");
}
Console.WriteLine("Result is {0}",div);
}
}

In the above case the program do not terminate unexpectedly. Instead the program control passes from the point where exception occurred inside the try block to the catch blocks. If it finds any suitable catch block, executes the statements inside that catch and continues with the normal execution of the program statements.
If a finally block is present, the code inside the finally block will get also be executed.

//C#: Exception Handling
using System;
class MyClient
{
public static void Main()
{
int x = 0;
int div = 0;
try
{
div = 100/x;
Console.WriteLine("Not executed line");
}
catch(DivideByZeroException de)
{
Console.WriteLine("Exception occured");
}
finally
{
Console.WriteLine("Finally Block");
}
Console.WriteLine("Result is {0}",div);
}
}

Remember that in C#, the catch block is optional. The following program is perfectly legal in C#.

//C#: Exception Handling
using System;
class MyClient
{
public static void Main()
{
int x = 0;
int div = 0;
try
{
div = 100/x;
Console.WriteLine("Not executed line");
}
finally
{
Console.WriteLine("Finally Block");
}
Console.WriteLine("Result is {0}",div);
}
}

But in this case, since there is no exception handling catch block, the execution will get terminated. But before the termination of the program statements inside the finally block will get executed. In C#, a try block must be followed by either a catch or finally block.

Multiple Catch Blocks

A try block can throw multiple exceptions, which can handle by using multiple catch blocks. Remember that more specialized catch block should come before a generalized one. Otherwise the compiler will show a compilation error.

//C#: Exception Handling: Multiple catch
using System;
class MyClient
{
public static void Main()
{
int x = 0;
int div = 0;
try
{
div = 100/x;
Console.WriteLine("Not executed line");
}
catch(DivideByZeroException de)
{
Console.WriteLine("DivideByZeroException" );
}
catch(Exception ee)
{
Console.WriteLine("Exception" );
}
finally
{
Console.WriteLine("Finally Block");
}
Console.WriteLine("Result is {0}",div);
}
}

Catching all Exceptions

By providing a catch block without a brackets or arguments, we can catch all exceptions occurred inside a try block. Even we can use a catch block with an Exception type parameter to catch all exceptions happened inside the try block since in C#, all exceptions are directly or indirectly inherited from the Exception class.

//C#: Exception Handling: Handling all exceptions
using System;
class MyClient
{
public static void Main()
{
int x = 0;
int div = 0;
try
{
div = 100/x;
Console.WriteLine("Not executed line");
}
catch
{
Console.WriteLine("oException" );
}
Console.WriteLine("Result is {0}",div);
}
}

The following program handles all exception with Exception object.

//C#: Exception Handling: Handling all exceptions
using System;
class MyClient
{
public static void Main()
{
int x = 0;
int div = 0;
try
{
div = 100/x;
Console.WriteLine("Not executed line");
}
catch(Exception e)
{
Console.WriteLine("oException" );
}
Console.WriteLine("Result is {0}",div);
}
}

Throwing an Exception

In C#, it is possible to throw an exception programmatically. The throw keyword is used for this purpose. The general form of throwing an exception is as follows.

throw exception_obj;

For example the following statement throw an ArgumentException explicitly.

throw new ArgumentException("Exception");

//C#: Exception Handling:
using System;
class MyClient
{
public static void Main()
{
try
{
throw new DivideByZeroException("Invalid Division");
}
catch(DivideByZeroException e)
{
Console.WriteLine("Exception" );
}
Console.WriteLine("LAST STATEMENT");
}
}

Re-throwing an Exception

The exceptions, which we caught inside a catch block, can re-throw to a higher context by using the keyword throw inside the catch block. The following program shows how to do this.

//C#: Exception Handling: Handling all exceptions
using System;
class MyClass
{
public void Method()
{
try
{
int x = 0;
int sum = 100/x;
}
catch(DivideByZeroException e)
{
throw;
}
}
}
class MyClient
{
public static void Main()
{
MyClass mc = new MyClass();
try
{
mc.Method();
}
catch(Exception e)
{
Console.WriteLine("Exception caught here" );
}
Console.WriteLine("LAST STATEMENT");
}
}

Standard Exceptions

There are two types of exceptions: exceptions generated by an executing program and exceptions generated by the common language runtime. System.Exception is the base class for all exceptions in C#. Several exception classes inherit from this class including ApplicationException and SystemException. These two classes form the basis for most other runtime exceptions. Other exceptions that derive directly from System.Exception include IOException, WebException etc.

The common language runtime throws SystemException. The ApplicationException is thrown by a user program rather than the runtime. The SystemException includes the ExecutionEngineException, StaclOverFlowException etc. It is not recommended that we catch SystemExceptions nor is it good programming practice to throw SystemExceptions in our applications.


  • System.OutOfMemoryException
  • System.NullReferenceException
  • Syste.InvalidCastException
  • Syste.ArrayTypeMismatchException
  • System.IndexOutOfRangeException
  • System.ArithmeticException
  • System.DevideByZeroException
  • System.OverFlowException
User-defined Exceptions

In C#, it is possible to create our own exception class. But Exception must be the ultimate base class for all exceptions in C#. So the user-defined exception classes must inherit from either Exception class or one of its standard derived classes.

//C#: Exception Handling: User defined exceptions
using System;
class MyException : Exception
{
public MyException(string str)
{
Console.WriteLine("User defined exception");
}
}
class MyClient
{
public static void Main()
{
try
{
throw new MyException("RAJESH");
}
catch(Exception e)
{
Console.WriteLine("Exception caught here" + e.ToString());
}
Console.WriteLine("LAST STATEMENT");
}
}

Note: Article taken from www.c-charpcorner.com All credits goes to author Rajesh VS.

Monday, September 20, 2010

Indexers & Properties

Indexers And Properties In C#

System.Collections ( Array List )

ArrayList

The ArrayList class is a dynamic array of heterogeneous objects. In an ArrayList, however, we can have different type of objects; these in turn would be stored as object type only.

We can have an ArrayList object that stores integer, float, string, etc., but all these objects would only be stored as object type.

An ArrayList uses its indexes to refer to a particular object stored in its collection.

The Count property gives the total number of items stored in the ArrayList object.

The Capacity property gets or sets the number of items that the ArrayList object can contain.

Objects are added using the Add() method of the ArrayList and removed using its Remove() method.

( heterogeneous - Consisting of elements that are not of the same kind )

An example of usage of an ArrayList is given below.

int a =4;

double b =5.6;

ArrayList ObjArrLst = new ArrayList();

ObjArrLst.Add("Cricket");

ObjArrLst.Add(a);

ObjArrLst.Add(b);

It is to be noted here that the initial capacity of an ArrayList is 16, which is increased once the 17th item is stored onto it. This repeated memory allocation and copying of the items can be quite expensive in some situations.

For performance reasons we can set the initial capacity of the object of an ArrayList by using the Capacity property of the ArrayList class. This is shown in the example below.

int a =4;

double b =5.6;

ArrayList ObjArrLst = new ArrayList();

ObjArrLst.Capacity =3;

ObjArrLst.Add("Cricket");

ObjArrLst.Add(a);

ObjArrLst.Add(b);

Other methods available with Array List Class are

ClearRemoves all elements from the ArrayList.
Public methodCloneCreates a shallow copy of the ArrayList.
Public methodContainsDetermines whether an element is in the ArrayList.

InsertInserts an element into the ArrayList at the specified index.

RemoveRemoves the first occurrence of a specific object from the ArrayList.
Public methodRemoveAtRemoves the element at the specified index of the ArrayList.

ReverseReverses the order of the elements in the entire ArrayList.

SortSorts the elements in the entire ArrayList.

ToArrayCopies the elements of the ArrayList to a new Object array.

TrimToSizeSets the capacity to the actual number of elements in the ArrayList.

Sunday, September 19, 2010

Constructor

Constructor is a method in a Class which is executed or Called as soon as an object is created for that Class.

In VB.NET, Constructor always named as 'New' and is a sub procedure.
In C#, Constructor name is same as Class Name and does'nt have a return type not even void.

Constructor with no parameters is called Default Constructor and the one with parameters is called Parametrized Constructor.

Copy Constructor is used to copy data members of the existing object to new object data members.





In VB.NET,

Public Sub New() 'Default Constructor

End Sub

public Sub New(ByVal id as integer, ByVal Name as string)
Me.New() 'Calling Default Constructor first..
'this is Parametrized Constructor..
End Sub

In C#,

Public Class Account
{
Public Account() //Construtor name same as class name...
{
//Default Constructor..
}

Public Account(int id, String name) : this()
{
//Parameterized Constructor...
}
}


From the above table, it is clear that constructors can be overloaded.

Saturday, September 18, 2010

Singleton Class

A Class that can be instantiated only once is called Singleton Class. i.e We can create only one object for a Singleton class.

Constructor in a Singleton Class has to be made private so that object cannot be created outside the class.

public Class SingleTonDemo
{
private SingleTonDemo // Note that Constructor is made Private.
{
}
public Static SingleTonDemo Obj;
public int a;
//create a property which gives the only created object..
public Static SingleTonDemo GetOnlyObject
{
if(Obj==null)
{
Obj = new SingleTonDemo();
return Obj;
}
}
} //end of the class

SingleTonDemo Ref1;
SingleTonDemo Ref2;

Ref1=SingleTonDemo.GetOnlyObject;
Ref2=SingleTonDemo.GetOnlyObject;

Ref1.a=10;

Console.Writeline(Ref2.a);

//Output 10...since the both Ref1 and Ref2 referencing to the same object.


http://msdn.microsoft.com/en-us/library/ff650316.aspx

Static Class and Static/Shared members

Statc ( C# ) / Shared ( VB.NET )

Static Class :

A static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated. In other words, you cannot use the new keyword to create a variable of the class type. Because there is no instance variable, you access the members of a static class by using the class name itself. For example, if you have a static class that is named UtilityClass that has a public method named MethodA, you call the method as shown in the following example:

UtilityClass.MethodA();

The following list provides the main features of a static class:

  • Contains only static members.

  • Cannot be instantiated.

  • Is sealed. ( therefore static class cannot be inherited )

  • Cannot contain Instance Constructors. ( however, they can contain a static constructor.)


a static class remains in memory for the lifetime of the application domain in which your program resides.

When to use Static Class: A static class can be used as a convenient container for sets of methods that just operate on input parameters and do not have to get or set any internal instance fields.
For example, in the .NET Framework Class Library, the static System.Math class contains several methods that perform mathematical operations, without any requirement to store or retrieve data that is unique to a particular instance of the Math class.

Note: Creating a static class is therefore basically the same as creating a class that contains only static members and a private constructor. A private constructor prevents the class from being instantiated.

Advantage of Static Class:

public static class MyCalc
{

static MyCalc()
{

}

MyCalc obj = new MyCalc(); //compiler wont allow you to create this...it will show error...

}
The advantage of using a static class is that the compiler can check to make sure that no instance members are accidentally added. The compiler will guarantee that instances of this class cannot be created.

Here is an example of a static class that contains two methods that convert temperature from Celsius to Fahrenheit and from Fahrenheit to Celsius:

public static class TemperatureConverter {

public static double CelsiusToFahrenheit(string temperatureCelsius)
{ // Convert argument to double for calculations.
double celsius = Double.Parse(temperatureCelsius);
// Convert Celsius to Fahrenheit.

double fahrenheit = (celsius * 9 / 5) + 32;

return fahrenheit;
}

public static double FahrenheitToCelsius(string temperatureFahrenheit)
{ // Convert argument to double for calculations.
double fahrenheit = Double.Parse(temperatureFahrenheit);
// Convert Fahrenheit to Celsius.
double
celsius = (fahrenheit - 32) * 5 / 9;

return celsius;
}

}

Calling static methods...

TemperatureConverter.CelsiusToFahrenheit(12);

TemperatureConverter.FahrenheitToCelsius(13);
---------------------------------------------------------------------------------------------------
Static/Shared members :

Static / Shared variables declared in a class are shared among all the objects that are created for a Class.

For every new object is created for a Class, all the members of the Class are allocated memory. But Static / Shared members of the Class are allocated memory only once irrespective of number of objects created.

Memory for Static / Shared member is allocated when Class is loaded.

A Class is loaded when first instance(Object) is created.

These members are also called as Class members and are accessed outside the class using the Class name.

public class MyClass
{
public static int a;
}
MyClass.a = 10;

Two common uses of static fields are
  • to keep a count of the number of objects that have been instantiated, or
  • to store a value that must be shared among all instances.
Static methods can be overloaded but not overridden, because they belong to the class, and not to any instance of the class.

A const field is essentially static in its behavior.

Note : C# does not support static local variables (variables that are declared in method scope)

If your class contains static fields, provide a static constructor that initializes them when the class is loaded.

---------------------------------------------------------------------------------------------------

Static/Shared Constructor :

1. Static/Shared Constructor is executed by CLR when Class is loaded. So this is used to initialize Static/Shared members dynamically.

2. Static Constructor cannot be overloaded ( Normal constructor can be overloaded )

3. Static Constructor has no access specifiers like private/public.

Series of events that occur when the first object is created for a Class .....

* Class is loaded
* Static members are loaded and allocated memory.
* Static Constructor is called.
* Normal members are loaded and allocated memory.
* Normal Constructor is called.

Observe the above series.....Point to be noted is you cannot access normal members of a class in Static Constructor as they are loaded after Static Constructor is executed.


A Class in C# can be declared as Static. Such a Class should has static members only. This is not supported in VB.NET.

-------------------------------------------------------------------------------------------------