26 November 2010

Object Oriented Concepts in C#

In this article we will discuss key concepts of object orientation with their practical implementation in C#. We will discuss here basics of OOPS including Interfaces, Access Modifiers, inheritance, polymorphism etc. This is my second article on csharp-corner.com.




Key Concepts of Object Orientation

  • Abstraction
  • Encapsulation
  • Polymorphism
  • Inheritance.
Abstraction is the ability to generalize an object as a data type that has a specific set of characteristics and is able to perform a set of actions.
Object-oriented languages provide abstraction via classes. Classes define the properties and methods of an object type.
Examples:
  •  You can create an abstraction of a dog with characteristics, such as color, height, and weight, and actions such as run and bite. The characteristics are called properties, and the actions are called methods.
  •  A Recordset object is an abstract representation of a set of data.
Classes are blueprints for Object.
Objects are instance of classes.

C# Example of Class:
public class Draw
{// Class code.}

Object References
When we work with an object we are using a reference to that object. On the other hand, when we are working with simple data types such as Integer, we are working with the actual value rather than a reference.

When we create a new object using the New keyword, we store a reference to that object in a variable. For instance:
Draw MyDraw = new Draw;
This code creates a new instance of Draw. We gain access to this new object via the MyDraw variable. This variable holds a reference to the object.
Now we have a second variable, which also has a reference to that same object. We can use either variable interchangeably, since they both reference the exact same object. The thing we need to remember is that the variable we have is not the object itself but, rather, is just a reference or pointer to the object itself.
Early binding means that our code directly interacts with the object, by directly calling its methods. Since the compiler knows the object's data type ahead of time, it can directly compile code to invoke the methods on the object. Early binding also allows the IDE to use IntelliSense to aid our development efforts; it allows the compiler to ensure that we are referencing methods that do exist and that we are providing the proper parameter values.
Late binding means that our code interacts with an object dynamically at run-time. This provides a great deal of flexibility since our code literally doesn't care what type of object it is interacting with as long as the object supports the methods we want to call. Because the type of the object isn't known by the IDE or compiler, neither IntelliSense nor compile-time syntax checking is possible but we get unprecedented flexibility in exchange.
If we enable strict type checking by using Option Strict On at the top of our code modules, then the IDE and compiler will enforce early binding behavior. By default, Option Strict is turned off and so we have easy access to the use of late binding within our code.
Access Modifiers
Access Modifiers are keywords used to specify the declared accessibility of a member of a type.

Public is visible to everyone. A public member can be accessed using an instance of a class, by a class's internal code, and by any descendants of a class.


Private is hidden and usable only by the class itself. No code using a class instance can access a private member directly and neither can a descendant class.



Protected members are similar to private ones in that they are accessible only by the containing class. However, protected members also may be used by a descendant class. So members that are likely to be needed by a descendant class should be marked protected.



Internal/Friend is public to the entire application but private to any outside applications. Internal is useful when you want to allow a class to be used by other applications but reserve special functionality for the application that contains the class. Internal is used by C# and Friend by VB .NET.



Protected Internal may be accessed only by a descendant class that's contained in the same application as its base class. You use protected internal in situations where you want to deny access to parts of a class functionality to any descendant classes found in other applications.


Composition of an OBJECT
We use an interface to get access to an object's data and behavior. The object's data and behaviors are contained within the object, so a client application can treat the object like a black box accessible only through its interface. This is a key object-oriented concept called Encapsulation. The idea is that any programs that make use of this object won't have direct access to the behaviors or data-but rather those programs must make use of our object's interface.
There are three main parts of Object:
1. Interface
2. Implementation or Behavior
3. Member or Instance variables

Interface
The interface is defined as a set of methods (Sub and Function routines), properties (Property routines), events, and fields (variables or attributes) that are declared Public in scope.
Implementation or Behavior
The code inside of a method is called the implementation. Sometimes it is also called behavior since it is this code that actually makes the object do useful work.
Client applications can use our object even if we change the implementation-as long as we don't change the interface. As long as our method name and its parameter list and return data type remain unchanged, we can change the implementation all we want.

So Method Signature depends on:
  • Method name
  • Data types of parameters
  • Either Parameter is passed ByVal or ByRef.
  • Return type of method. 
It is important to keep in mind that encapsulation is a syntactic tool-it allows our code to continue to run without change. However, it is not semantic-meaning that, just because our code continues to run, doesn't mean it continues to do what we actually wanted it to do.
Member or Instance Variables
The third key part of an object is its data, or state. Every instance of a class is absolutely identical in terms of its interface and its implementation-the only thing that can vary at all is the data contained within that particular object.
Member variables are those declared so that they are available to all code within our class. Typically member variables are Private in scope-available only to the code in our class itself. They are also sometimes referred to as instance variables or as attributes. The .NET Framework also refers to them as fields.
We shouldn't confuse instance variables with properties. A Property is a type of method that is geared around retrieving and setting values, while an instance variable is a variable within the class that may hold the value exposed by a Property.

Interface looks like a class, but has no implementation.
The only thing it contains is definitions of events, indexers, methods and/or properties. The reason interfaces only provide definitions is because they are inherited by classes and structs, which must provide an implementation for each interface member defined. So, what are interfaces good for if they don't implement functionality? They're great for putting together plug-n-play like architectures where components can be interchanged at will. Since all interchangeable components implement the same interface, they can be used without any extra programming. The interface forces each component to expose specific public members that will be used in a certain way. 
Because interfaces must be defined by inheriting classes and structs, they define a contract. For instance, if class foo inherits from the IDisposable interface, it is making a statement that it guarantees it has the Dispose() method, which is the only member of the IDisposable interface. Any code that wishes to use class foo may check to see if class foo inherits IDisposable. When the answer is true, then the code knows that it can call foo.Dispose().
Defining an Interface: MyInterface.c
interface IMyInterface
{void MethodToImplement();
}
Above listing shows defines an interface named IMyInterface. A common naming convention is to prefix all interface names with a capital "I", but this is not mandatory. This interface has a single method named MethodToImplement(). This could have been any type of method declaration with different parameters and return types. Notice that this method does not have an implementation (instructions between curly braces- {}), but instead ends with a semi-colon, ";". This is because the interface only specifies the signature of methods that an inheriting class or struct must implement.

All the methods of Interface are public by default and no access modifiers (like private, public) are allowed with any method of Interface.
Using an Interface: InterfaceImplementer.cs
class InterfaceImplementer : IMyInterface
{public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
}
The InterfaceImplementer class in above listing implements the IMyInterface interface. Indicating that a class inherits an interface is the same as inheriting a class. In this case, the following syntax is used:
class InterfaceImplementer : IMyInterface

Note that this class inherits the IMyInterface interface; it must implement its all members. While implementing interface methods all those needs to be declared public only. It does this by implementing the MethodToImplement() method. Notice that this method implementation has the exact same signature, parameters and method name, as defined in the IMyInterface interface. Any difference will cause a compiler error. Interfaces may also inherit other interfaces. Following listing shows how inherited interfaces are implemented.
Interface Inheritance: InterfaceInheritance.cs
using System;interface IParentInterface
{void ParentInterfaceMethod();
}interface IMyInterface : IParentInterface
{void MethodToImplement();
}class InterfaceImplementer : IMyInterface
{public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}public void ParentInterfaceMethod()
{
Console.WriteLine("ParentInterfaceMethod() called.");
}
}
The code in above listing contains two interfaces: IMyInterface and the interface it inherits, IParentInterface. When one interface inherits another, any implementing class or struct must implement every interface member in the entire inheritance chain. Since the InterfaceImplementer class in above listing inherits from IMyInterface, it also inherits IParentInterface. Therefore, the InterfaceImplementer class must implement the MethodToImplement() method specified in the IMyInterface interface and the ParentInterfaceMethod() method specified in the IParentInterface interface.

In summary, you can implement an interface and use it in a class. Interfaces may also be inherited by other interface. Any class or struct that inherits an interface must also implement all members in the entire interface inheritance chain.
Inheritance is the idea that one class, called a subclass, can be based on another class, called a base class. Inheritance provides a mechanism for creating hierarchies of objects.
Inheritance is the ability to apply another class's interface and code to your own class.
Normal base classes may be instantiated themselves, or inherited. Derived classes can inherit base class members marked with protected or greater access. The derived class is specialized to provide more functionality, in addition to what its base class provides. Inheriting base class members in derived class is not mandatory.
Access Keywords
base -> Access the members of the base class.
this -> Refer to the current object for which a method is called.

The base keyword is used to access members of the base class from within a derived class:
Call a method on the base class that has been overridden by another method. Specify which base-class constructor should be called when creating instances of the derived class. A base class access is permitted only in a constructor, an instance method, or an instance property accessor.

In following example, both the base class, Person, and the derived class, Employee, have a method named Getinfo. By using the base keyword, it is possible to call the Getinfo method on the base class, from within the derived class.
// Accessing base class members
using System;public class Person
{protected string ssn = "444-55-6666";protected string name = "John L. Malgraine";public virtual void GetInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);}
}class Employee: Person
{public string id = "ABC567EFG";public override void GetInfo()
{// Calling the base class GetInfo method:base.GetInfo();
Console.WriteLine("Employee ID: {0}", id);
}
}class TestClass
{public static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}
Output
Name: John L. Malgraine
SSN: 444-55-6666
Employee ID: ABC567EFG

Base class constructors can be called from derived classes. To call a base class constructor, use the base() constructor reference. This is desirable when it's necessary to initialize a base class appropriately.
Here's an example that shows the derived class constructor with an address parameter:

abstract
public class Contact
{private string address;public Contact(string b_address)
{this.address = b_address;
}
}public class Customer : Contact
{public Customer(string c_address) : base(C_address)
{
}
}
In this code, the Customer class does not have an address, so it passes the parameter to its base class constructor by adding a colon and the base keyword with the parameter to its declaration. This calls the Contact constructor with the address parameter, where the address field in Contact is initialized.

One more example which shows how base-class constructor is called when creating instances of a derived class:
using System;public class MyBase
{int num;public MyBase()
{
Console.WriteLine("In MyBase()");
}public MyBase(int i)
{
num = i;
Console.WriteLine("in MyBase(int i)");
}public int GetNum()
{return num;
}
}public class MyDerived : MyBase
{static int i = 32;// This constructor will call MyBase.MyBase()public MyDerived(int ii) : base()
{
}// This constructor will call MyBase.MyBase(int i)public MyDerived() : base(i)
{
}public static void Main()
{
MyDerived md = new MyDerived(); // calls public MyDerived() : base(i) and// passes i=32 in base classMyDerived md1 = new MyDerived(1); // call public MyDerived() : base(i)}
}
Output
in MyBase(int i)
in MyBase()

The following example will not compile. It illustrates the effects of not including a default constructor in a class definition:

abstract
public class Contact
{private string address;public Contact(string address)
{this.address = address;
}
}public class Customer : Contact
{public Customer(string address)
{
}
}
In this example, the Customer constructor does not call the base class constructor. This is obviously a bug, since the address field will never be initialized.

When a class has no explicit constructor, the system assigns a default constructor. The default constructor automatically calls a default or parameterless base constructor. Here's an example of automatic default constructor generation that would occur for the preceding example:
public Customer() : Contact()
{
}

When a class does not declare any constructors, the code in this example is automatically generated. The default base class constructor is called implicitly when no derived class constructors are defined. Once a derived class constructor is defined, whether or not it has parameters, a default constructor will not be automatically defined, as the preceding code showed.

Calling Base Class Members
Derived classes can access the members of their base class if those members have protected or greater access. Simply use the member name in the appropriate context, just as if that member were a part of the derived class itself. Here's an example:
abstract public class Contact
{private string address;private string city;private string state;private string zip;public string FullAddress()
{string fullAddress = address + '\n' + city + ',' + state + ' ' + zip;return fullAddress;
}
}public class Customer : Contact
{public string GenerateReport()
{string fullAddress = FullAddress();// do some other stuff...return fullAddress;
}
}
In above example, the GenerateReport() method of the Customer class calls the FullAddress() method in its base class, Contact. All classes have full access to their own members without qualification. Qualification refers to using a class name with the dot operator to access a class member-MyObject.SomeMethod(), for instance. This shows that a derived class can access its base class members in the same manner as its own.

More Tips regarding Inheritance:

  • A static member cannot be marked as override, virtual, or abstract. So following is an error:
    public static virtual void GetSSN()
  • You can't call static methods of base class from derived class using base keyword.
    In above example if you declare a static method as follows:

public class Person
{protected string ssn = "444-55-6666";protected string name = "John L. Malgraine";public static void GetInfo()
{// Implementation}
}
now you can't call this method using base.GetInfo() from derived class instead you have to call Person.GetInfo() from derived class.
Inside Static members we can access only static fields, methods etc.
Following example will give error, because we can't access name in GetInfo() because name is not static.
public class Person
{protected string ssn = "444-55-6666";protected string name = "John L. Malgraine";public static void GetInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);
}
}
Virtual or abstract members cannot be private.
  •  If you are not overriding a virtual method of base class in derived class, you can't use base class method by using base keyword in derived class. Also when you will create an instance of derived class, it will call derived class method and you will only be able to access base class method when you will create instance of base class.
  • You can't decrease access level of a method in derived class when you are overriding a base class method in derived class, vice versa is possible.
    Means you can make protected method of base class to public in derived class.
The "this" keyword refers to:

  • the current instance for which a method is called. Static member functions do not have a this pointer. The this keyword can be used to access members from within constructors, instance methods, and instance accessors.
    The following are common uses of this:
To qualify members hidden by similar names, for example:
public Employee(string name, string alias)
{this.name = name;this.alias = alias;
}
In above example, this.name refers to private variable name in the class. If we write name = name, then this will refer to argument name of the constructor Employee and not to private variable name in the class. In this case private variable name will never be initialized.
  • To pass an object as a parameter to other methods, for example:
    CalcTax(this);
To declare indexers, for example:


public int this [int param]
{get{return array[param];
}set{
array[param] = value;
}
}
It is an error to refer to this in a static method, static property accessor, or variable initializer of a field declaration.
In this example, this is used to qualify the Employee class members, name and alias, which are hidden by similar names. It is also used to pass an object to the method CalcTax, which belongs to another class.
// keywords_this.cs
// this example
using System;public class Employee
{public string name;public string alias;public decimal salary = 3000.00m;// Constructor:public Employee(string name, string alias)
{// Use this to qualify the fields, name and alias:this.name = name;this.alias = alias;
}// Printing method:public void printEmployee()
{
Console.WriteLine("Name: {0}\nAlias: {1}", name, alias);// Passing the object to the CalcTax method by using this:Console.WriteLine("Taxes: {0:C}", Tax.CalcTax(this));
}
}public class Tax
{public static decimal CalcTax(Employee E)
{return (0.08m*(E.salary));
}
}public class MainClass
{public static void Main()
{// Create objects:Employee E1 = new Employee ("John M. Trainer", "jtrainer");// Display results:E1.printEmployee();
}
}
Output
Name: John M. Trainer
Alias: jtrainer
Taxes: $240.00

Abstract Classes
Abstract classes are a special type of base classes. In addition to normal class members, they have abstract class members. These Abstract class members are methods and properties that are declared without an implementation. All classes derived directly from abstract classes must implement all of these abstract methods and properties.
Abstract classes can never be instantiated. This would be illogical, because of the members without implementations.So what good is a class that can't be instantiated? Lots! Abstract classes sit toward the top of a class hierarchy. They establish structure and meaning to code. They make frameworks easier to build. This is possible because abstract classes have information and behavior common to all derived classes in a framework. Take a look at the following example:
abstract public class Contact // Abstract Class Contact.{protected string name;public Contact()
{// statements...}public abstract void generateReport();abstract public string Name
{get;set;
}
}
Contact, is an abstract class. Contact has two abstract members, and it has an abstract method named generateReport(). This method is declared with the abstract modifier in front of the method declaration. It has no implementation (no braces) and is terminated with a semicolon. The Name property is also declared abstract. The accessors of properties are terminated with semicolons.

public class Customer : Contact // Customer Inherits Abstract Class Contact.{string gender;decimal income;int numberOfVisits;public Customer()
{// statements}public override void generateReport()
{// unique report}public override string Name
{get{
numberOfVisits++;return name;
}set{
name = value;
numberOfVisits = 0;
}
}
}public class SiteOwner : Contact
{int siteHits;string mySite;public SiteOwner()
{// statements}public override void generateReport()
{// unique report}public override string Name
{get{
siteHits++;return name;
}set{
name = value;
siteHits = 0;
}
}
}
The abstract base class Contact has two derived classes, Customer and SiteOwner. Both of these derived classes implement the abstract members of the Contact class. The generateReport() method in each derived class has an override modifier in its declaration. Likewise, the Name declaration contains an override modifier in both Customer and SiteOwner.

C# requires explicit declaration of intent when overriding methods. This feature promotes safe code by avoiding the accidental overriding of base class methods, which is what actually does happen in other languages. Leaving out the override modifier generates an error. Similarly, adding a new modifier also generates an error. Abstract methods must be overridden and cannot be hidden, which the new modifier or the lack of a modifier would be trying to do.
The most famous of all abstract classes is the Object class. It may be referred to as object or Object, but it's still the same class. Object is the base class for all other classes in C#. It's also the default base class when a base class is not specified. The following class declarations produce the same exact results:

abstract public class Contact : Object
{// class members}abstract public class Contact
{// class members}
Object is implicitly included as a base class if it is not already declared. Besides providing the abstract glue to hold together the C# class framework, object includes built-in functionality, some of which is useful for derived classes to implement.

Difference between Interface and Abstract Class
  • Interfaces are closely related to abstract classes that have all members abstract.
  • For an abstract class, at least one method of the class must be an abstract method that means it may have concrete methods.
  •  For an interface, all the methods must be abstract
  • Class that implements an interface much provide concrete implementation of all the methods definition in an interface or else must be declare an abstract class
  • In C#, multiple inheritance is possible only through implementation of multiple interfaces. Abstract class can only be derived once.
  • An interface defines a contract and can only contains four entities viz methods, properties, events and indexes. An interface thus cannot contain constants, fields, operators, constructors, destructors, static constructors, or types.
  • Also an interface cannot contain static members of any kind. The modifiers abstract, public, protected, internal, private, virtual, override is disallowed, as they make no sense in this context.
  • Class members that implement the interface members must be publicly accessible.
Overriding Summery:
A derived class may override a virtual method of the base class with the keyword override. The following restrictions must be followed.


  • Keyword override is used in the definition of child class method that is going to override the base class's virtual method.
  • The return type must be the same as the virtual method have in base class.
  • The name of the method should also be same.
  • The parameter-list must also be same in order, number and type of parameters.
  • The accessibility of the overriding method should not be more restricted than that of the accessibility defined with virtual method of the base class. This accessibility either be the same or less restricted.
  • The virtual methods can be sealed in the child or derived classes to prevent further modifications in the implementation of the virtual method in the derived classes, by declaring them as sealed methods.
Hiding Base Class Members
Sometimes derived class members have the same name as a corresponding base class member. In this case, the derived member is said to be "hiding" the base class member.
When hiding occurs, the derived member is masking the functionality of the base class member. Users of the derived class won't be able to see the hidden member; they'll see only the derived class member. The following code shows how hiding a base class member works.
abstract public class Contact
{private string address;private string city;private string state;private string zip;public string FullAddress()
{string fullAddress =address + '\n' +city + ',' + state + ' ' + zip;return fullAddress;
}
}public class SiteOwner : Contact
{public string FullAddress()
{string fullAddress;// create an address...return fullAddress;
}
}
In this example, both SiteOwner and its base class, Contact, have a method named FullAddress(). The FullAddress() method in the SiteOwner class hides the FullAddress() method in the Contact class. This means that when an instance of a SiteOwner class is invoked with a call to the FullAddress() method, it is the SiteOwner class FullAddress() method that is called, not the FullAddress() method of the Contact class.

Although a base class member may be hidden, the derived class can still access it. It does this through the base identifier. Sometimes this is desirable. It is often useful to take advantage of the base class functionality and then add to it with the derived class code. The next example shows how to refer to a base class method from the derived class.
abstract public class Contact
{private string address;private string city;private string state;private string zip;public string FullAddress()
{string fullAddress =address + '\n' +city + ',' + state + ' ' + zip;return fullAddress;
}
}public class SiteOwner : Contact
{public string FullAddress()
{string fullAddress = base.FullAddress();// do some other stuff...return fullAddress;
}
}
In this particular example, the FullAddress() method of the Contact class is called from within the FullAddress() method of the SiteOwner class. This is accomplished with a base class reference. This provides another way to reuse code and add on to it with customized behavior.

Versioning
Versioning, in the context of inheritance, is a C# mechanism that allows modification of classes (creating new versions) without accidentally changing the meaning of the code. Hiding a base class member with the methods previously described generates a warning message from the compiler. This is because of the C# versioning policy. It's designed to eliminate a class of problems associated with modifications to base classes.
Here's the scenario: A developer creates a class that inherits from a third-party library. For the purposes of this discussion, we assume that the Contact class represents the third-party library. Here's the example:
public class Contact
{// does not include FullAddress() method}public class SiteOwner : Contact
{public string FullAddress()
{string fullAddress = mySite.ToString();return fullAddress;
}}
In this example, the FullAddress() method does not exist in the base class. There is no problem yet. Later on, the creators of the third-party library update their code. Part of this update includes a new member in a base class with the exact same name as the derived class:

public class Contact
{private string address;private string city;private string state;private string zip;public string FullAddress()
{string fullAddress =address + '\n' +city + ',' + state + ' ' + zip;return fullAddress;
}
}public class SiteOwner : Contact
{public string FullAddress()
{string fullAddress = mySite.ToString();return fullAddress;
}
}
In this code, the base class method FullAddress() contains different functionality than the derived class method. In other languages, this scenario would break the code because of implicit polymorphism. However, this does not break any code in C# because when the FullAddress() method is called on SiteOwner, it is still the SiteOwner class method that gets called.

This scenario generates a warning message. One way to eliminate the warning message is to place a new modifier in front of the derived class method name, as the following example shows:
using System;public class WebSite
{public string SiteName;public string URL;public string Description;public WebSite()
{
}public WebSite( string strSiteName, string strURL, string strDescription )
{
SiteName = strSiteName;
URL = strURL;
Description = strDescription;
}public override string ToString()
{return SiteName + ", " +URL + ", " +Description;
}
}public class Contact
{public string address;public string city;public string state;public string zip;public string FullAddress()
{string fullAddress =address + '\n' +city + ',' + state + ' ' + zip;return fullAddress;
}
}public class SiteOwner : Contact
{int siteHits;string name;
WebSite mySite;public SiteOwner()
{
mySite = new WebSite();
siteHits = 0;
}public SiteOwner(string aName, WebSite aSite)
{
mySite = new WebSite(aSite.SiteName,aSite.URL,aSite.Description);
Name = aName;
}new public string FullAddress()
{string fullAddress = mySite.ToString();return fullAddress;
}public string Name
{get{
siteHits++;return name;
}set{
name = value;
siteHits = 0;
}
}
}public class Test
{public static void Main()
{
WebSite mySite = new WebSite("Le Financier","http://www.LeFinancier.com","Fancy Financial Site");
SiteOwner anOwner = new SiteOwner("John Doe", mySite);string address;
anOwner.address = "123 Lane Lane";
anOwner.city = "Some Town";
anOwner.state = "HI";
anOwner.zip = "45678";
address = anOwner.FullAddress(); // Different ResultsConsole.WriteLine("Address: \n{0}\n", address);
}
}
Here's the output:
Address:
Le Financier,
http://www.LeFinancier.com, Fancy Financial Site

This has the effect of explicitly letting the compiler know the developer's intent. Placing the new modifier in front of the derived class member states that the developers know there is a base class method with the same name, and they definitely want to hide that member. This prevents breakage of existing code that depends on the implementation of the derived class member. With C#, the method in the derived class is called when an object of the derived class type is used. Likewise, the method in the base class is called when an object of the Base class type is called. Another problem this presents is that the base class may present some desirable new features that wouldn't be available through the derived class.
To use these new features requires one of a few different workarounds. One option would be to rename the derived class member, which would allow programs to use a base class method through a derived class member. The drawback to this option would be if there were other classes relying upon the implementation of the derived class member with the same name. This scenario will break code and, for this reason, is considered extremely bad form.
Another option is to define a new method in the derived class that called the base class method. This allows users of the derived class to have the new functionality of the base class, yet retain their existing functionality with the derived class. While this would work, there are maintainability concerns for the derived class.
Sealed Classes
Sealed classes are classes that can't be derived from. To prevent other classes from inheriting from a class, make it a sealed class. There are a couple good reasons to create sealed classes, including optimization and security.
Sealing a class avoids the system overhead associated with virtual methods. This allows the compiler to perform certain optimizations that are otherwise unavailable with normal classes.
Another good reason to seal a class is for security. Inheritance, by its very nature, dictates a certain amount of protected access to the internals of a potential base class. Sealing a class does away with the possibility of corruption by derived classes. A good example of a sealed class is the String class. The following example shows how to create a sealed class:
public sealed class CustomerStats
{string gender;decimal income;int numberOfVisits;public CustomerStats()
{
}
}public class CustomerInfo : CustomerStats // error{
}
This example generates a compiler error. Since the CustomerStats class is sealed, it can't be inherited by the CustomerInfo class.The CustomerStats class was meant to be used as an encapsulated object in another class. This is shown by the declaration of a CustomerStats object in the Customer class.

public class Customer
{
CustomerStats myStats; // okay}
Polymorphism

Polymorphism is reflected in the ability to write one routine that can operate on objects from more than one class-treating different objects from different classes in exactly the same way. For instance, if both Customer and Vendor objects have a Name property, and we can write a routine that calls the Name property regardless of whether we're using a Customer or Vendor object, then we have polymorphism.
A vehicle is a good example of polymorphism. A vehicle interface would only have those properties and methods that all vehicles have, a few of which might include paint color, number of doors, accelerator, and ignition. These properties and methods would apply to all types of vehicles including cars, trucks, and semi-trucks.
Polymorphism will not implement code behind the vehicle's properties and methods. Instead, polymorphism is the implementation of an interface. If the car, truck, and semitruck all implement the same vehicle interface, then the client code for all three classes can be exactly the same.
C# gives us polymorphism through inheritance. C# provides a keyword virtual that is used in the definition of a method to support polymorphism.
Child class are now free to provide their own implementation of this virtual method, that is called overriding. The following points are important regarding virtual keyword:-

If the method is not virtual, the compiler simply uses the reference type to invoke the appropriate method.

If the method is virtual, the compiler will generate code to checkup the reference type at runtime it is actually denoting to, then the appropriate method is called from the class of the reference type.
When a virtual method is called, runtime check (late method binding) is made to identify the object and appropriate method is invoked, all this is done at runtime.
In case of non-virtual methods, this information is available at compile time, so no runtime check to identify the object is made, so slightly efficient in the way non-virtual methods are called. But the behavior of virtual method is useful in many ways; the functionality they provide is fair enough to bear this slight loss of performance.
Implementing Polymorphism
The key factor here is the ability to dynamically invoke methods in a class based on their type. Essentially, a program would have a group of objects, examine the type of each one, and execute the appropriate method. Here's an example:

using System;public class WebSite
{public string SiteName;public string URL;public string Description;public WebSite()
{
}public WebSite( string strSiteName, string strURL, string strDescription )
{
SiteName = strSiteName;
URL = strURL;
Description = strDescription;
}public override string ToString()
{return SiteName + ", " +URL + ", " +Description;
}
}
When we inherit above class, we have two choices to invoke constructor of the class. So this is an example of design time polymorphism. Here at design time we have to decide which method we need to invoke while inheriting the class.

Polymorphism is the capability of a program to carry out dynamic operations by implementing methods of multiple derived classes through a common base class reference. Another definition of polymorphism is the ability to treat different objects the same way. This means that the runtime type of an object determines its behavior rather than the compile-time type of its reference.

19 November 2010

Generate New Guid (Unique Identifier) in SQL Server

About how to generate a random unique identifier in using sql query in SQL server


If you want to generate a new Guid (uniqueidentifier) in SQL server the you can simply use the NEWID() function.

Example

SELECT NEWID()
GO
-- This will return a new random uniqueidentifier e.g.
E75B92A3-3299-4407-A913-C5CA196B3CAB
  
You can directly use this with INSERT statement to insert new row in table.

-- Inserting data in Employees table.
INSERT INTO Employees
(EmployeeID, Name, Phone)
VALUES
(NEWID(), 'John Kris', '99-99999')

Add a SQL JOB in SQL Server 2005

SQL Server Agent allows you to automate a variety of administrative tasks. In this tutorial, we walk through the process of using SQL Server Agent to create and schedule a job that automates database administration.  

Step 1 

Connect to the database engine of SQL server using SQL Server Management Studio.

 

Step 2
Open up Microsoft SQL Server Configuration Manager and locate the SQL Server Agent service. If the status of that service is "RUNNING", you do not need to do anything. Otherwise, right-click on the SQL Server Agent service and select Start from the pop-up menu. You'll see the Starting Service

Expand the SQL Server Agent. You will see a Jobs folder over there. Right click on jobs and choose Add New.

Step 3 

Next, right-click on the Jobs folder and select New Job from the start-up menu. You'll see the New Job creation window shown bellow. Fill in the Name field with a unique name for your job (being descriptive will help you manage jobs better down the road!). Specify the account that you wish to be the owner of the job in the Owner text box. The job will run with the permissions of this account and may only be modified by the owner or sysadmin role members.
Once you've specified a name and owner, choose one of the predefined job categories from the drop-down list. For example, you might choose the "Database Maintenance" category for routine maintenance jobs.
Use the large Description text field to provide a detailed description of the purpose of your job. Write it in such a way that someone (yourself included!) would be able to look at it several years from now and understand the purpose of the job.
Finally, ensure that the Enabled box is checked.
 

A New Job popup will appear. Specify the name of the job.

Step 4

Cilck next on the "Steps" in the left menu. A sql job can contain one or more steps. A step might be simply an sql statement or a stored procedure call. Add you step here
 
Next, you'll need to add the individual steps for your job. Click the New button to create a new job step and you will see the New Job Step window shown above. Use the Step Name textbox to provide a descriptive name for the Step. Use the Database drop-down box to select the database that the job will act upon. 
Finally, use the Command textbox to provide the Transact-SQL syntax corresponding to the desired action for this job step. Once you have completed entering the command, click the Parse button to verify the syntax. 
After successfully validating the syntax, click OK to create the step. Repeat this process as many times as necessary to define your desired SQL Server Agent job.

Job step added

Step 5

Finally, you'll want to set a schedule for the job by clicking the Schedule icon in the Select a Page portion of the New Job window. You'll see the New Job Schedule window shown above. 
 Provide a name for the schedule in the Name text box and choose a schedule type (One-time, Recurring, Start when SQL Server Agent Starts or Start When CPUs Become Idle) from the drop-down box. Then use the frequency and duration sections of the window to specify the job's parameters. When you are finished click OK to close the Schedule window and OK to create the job. 

A sql job can contain one or more schedules. A schedule is basically the time at which sql job will run it self. You can specify recurring schedules also.
Job schedule added
You SQL job is ready now. However there are other thing you can use if needed like Alert, Notifications etc.

Windows System Tray Programming using C#

Windows System Tray Programming using C# and VB.NET

Windows System Tray provides easy access to the applications which we use frequently. .NET provides classes with many methods to manage your application at system tray using C# and VB.NET very easily. This article gives you a quick introduction of these .NET classes and methods and provides the download of demo application.


Following are the impotent classes to begin with to provide SystemTray functionality for .NET applications.
Examples may not be displayed properly in your browser, So you can download the source code given at the end of this article.

1. System.Windows.Forms.NotifyIcon
NotifyIcon is class defined in the namespace System.Windows.Forms which is useful to create an Icon to be displayed at the system tray.
Following is the C# code to create NotifyIcon for System Tray.

private System.Windows.Forms.NotifyIcon notifyIcon;

When Starting the Systemtray service
notifyIcon.Icon = new Icon( this.GetType() , "Enabled.ico" );
notifyIcon.Text = "Process (Enabled)";

When Stooping the Systemtray service
notifyIcon.Icon = new Icon( this.GetType() , "Disabled.ico" );
notifyIcon.Text = "Process (Disabled)";



1. System.Windows.Forms.ContextMenu

ContextMenu is also defined in the namespace System.Windows.Forms which is useful to create Menu to be displayed when right clicking on the system tray icon.


2. System.Windows.Forms.MenuItem

ContextMenu is also defined in the namespace System.Windows.Forms which is useful to create Menu items to be displayed when right clicking on the system tray icon. Now you can customize your system tray functionality by writing event handlers to these menu items. example displaying a form.


Following is the sample code to create Context menu and associating it with notify icon.

private System.Windows.Forms.NotifyIcon notifyIcon;
private System.Windows.Forms.ContextMenu contextMenu;
this.contextMenu = new System.Windows.Forms.ContextMenu();
this.notifyIcon.ContextMenu = this.contextMenu;
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
this.notifyIcon.Text = "notifyIcon";


this.notifyIcon.Visible = true;
this.notifyIcon.DoubleClick += new System.EventHandler(this.notifyIcon_DoubleClick);
this.contextMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {

this.menuItemSettings,
this.menuItemEnabled,
this.menuItemQuit});
this.menuItemSettings.Index = 0;
this.menuItemSettings.Text = "&Application Settings";
this.menuItemSettings.Click += new System.EventHandler(this.menuItemSettings_Click);
this.menuItemEnabled.Checked = true;
this.menuItemEnabled.Index = 1;
this.menuItemEnabled.Text = "&Enabled";
this.menuItemEnabled.Click += new System.EventHandler(this.menuItemEnabled_Click);
this.menuItemQuit.Index = 2;
this.menuItemQuit.Text = "&Exit";
this.menuItemQuit.Click += new System.EventHandler(this.menuItemQuit_Click);


3. System.Management.ManagementEventWatcher

This is the key class to handle the system tray icon contains two static methods start() stop() to enable and disable the system tray functionality.


Following is the sample code to Start and Stop the System Tray Service.


private void StartMonitoring()
{
notifyIcon.Icon = new Icon( this.GetType() , "Enabled.ico" );
notifyIcon.Text = "PriorityMonitor (Enabled)";

if ( ProcessWatcher == null )
{
WqlEventQuery wmiQuery = new WqlEventQuery( "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA \"Win32_Process\"" );
ProcessWatcher = new ManagementEventWatcher( wmiQuery );
ProcessWatcher.EventArrived +=new EventArrivedEventHandler(ProcessWatcher_EventArrived);
}
ProcessWatcher.Start();
}

private void StopMonitoring()
{
notifyIcon.Icon = new Icon( this.GetType() , "Disabled.ico" );
notifyIcon.Text = "PriorityMonitor (Disabled)";

if ( ProcessWatcher == null ) return; // Stop not needed!

ProcessWatcher.Stop();
}

17 November 2010

The real reason SELECT * queries are bad: index coverage

The real reason SELECT * queries are bad: index coverage

Are SELECT * queries bad? Sure, everyone know that. But, why?
It's returning too much data, right?

That's the common answer, but I don't think it's the right one. If you're working with a reasonably normalized database, the actual network traffic difference is pretty small.

Let's take a look at a sample. The following two queries select 326 rows from the TransactionHistoryArchive table in the AdventureWorks database (which has a total of 89K rows). The first uses a SELECT * query, the second selects a specific column:

SELECT * FROM Production.TransactionHistoryArchive WHERE ReferenceOrderID < 100 SELECT ReferenceOrderLineID FROM Production.TransactionHistoryArchive WHERE ReferenceOrderID < 100

In this case, the difference in network traffic is only 15K, roughly a 10% difference (180K vs. 165K). It's worth fixing, but not a huge difference.
SELECT * makes the Table / Index Scan Monster come 

Often, the bigger problem with SELECT * is the effect it will have on the execution plan. While SQL Server primarily uses indexes to look up your data, if the index contains all the columns you’re requesting it doesn’t even need to look in the table. That concept is known as index coverage. In the above example, the first query results in a Clustered Index Scan, whereas the second query uses a much more efficient Index Seek. In this case, the Index seek is one hundred times more efficient than the Clustered Index Scan.

SelectStarQueryPlan

Unless you've indexed every single column in a table (which is almost never a good idea), a SELECT * query can't take advantage of index coverage, and you're likely to get (extremely inefficient) scan operations.

If you just query the rows you'll actually be using, it's more likely they'll be covered by indexes. And I think that's the biggest performance advantage of ignoring SELECT * queries.



The Stability Aspect

SELECT * queries are also bad from an application maintenance point of view as well, since it introduces another outside variable to your code. If a column is added to a table, the results returned to your application will change in structure. Well programmed applications should be referring to columns by name and shouldn't be affected, but well programmed applications should also minimize the ways in which they are vulnerable to external changes.

16 November 2010

ArchiveSimAppTransaction

CREATE PROCEDURE [dbo].[ArchiveSimAppTransaction]

@rowsToArchivePerBatch BIGINT,
@batchCount INT

AS


SET NOCOUNT ON;

DECLARE @start BIGINT
DECLARE @end BIGINT
DECLARE @maxSimAppTransIDLimit BIGINT
DECLARE @count BIGINT
DECLARE @daystoDeleteFrom SMALLINT
DECLARE @today DATETIME

SET @count = 1
SET @daystoDeleteFrom = -7
SET @today = GETDATE()

--get the highest simappgenid from x days ago directly from MMFSIMTransactions using our artificial index.
SELECT @maxSimAppTransIDLimit = SimAppTransID FROM dbo.LookupMaxIDs (NOLOCK) WHERE
DATEDIFF(d, @today, Date) = @daystoDeleteFrom

WHILE @batchCount > @count
BEGIN

BEGIN TRANSACTION

SELECT @start= MIN(SimAppTransID) FROM MMFSIMTransactions.dbo.SimAppTransaction (NOLOCK)
SELECT @end = @start + @rowsToArchiveperBatch

INSERT INTO MMFSIMTranHistory.dbo.SimAppTransaction
(SimAppTransID,TransactionTypeID, CreateTime)
SELECT SimAppTransID,TransactionTypeID, CreateTime
FROM MMFSIMTransactions.dbo.SimAppTransaction WITH (NOLOCK)
WHERE (SimAppTransaction.SimAppTransID BETWEEN @start AND @end)
AND SimAppTransaction.SimAppTransID < @maxSimAppTransIDLimit


DELETE FROM MMFSIMTransactions.dbo.SimAppTransaction
WHERE (SimAppTransaction.SimAppTransID BETWEEN @start AND @end)
AND SimAppTransaction.SimAppTransID < @maxSimAppTransIDLimit

SET @count = @count + 1

IF @@ERROR = 0
BEGIN
COMMIT TRANSACTION
END
ELSE
BEGIN
ROLLBACK TRANSACTION
RETURN
END

WAITFOR DELAY '00:00:05'
END



--EXEC ArchiveSimAppTransaction 10000, 2

15 November 2010

SQL Server 2005 - Defining Indexes

In this tutorial you will learn about Defining Indexes in SQL Server 2005 - clustered and non clustered indexex, The Query Optimizer, to create an index, To create a unique index, To create a clustered index, To create full-text indexes, To change index properties, To rename an index, to delete an index, To specify a fill factor for an index, To create an XML index and To delete XML Indexes.



When data volumes increase, organizations are faced with problems relating to data retrieval and posting. They feel the need for a mechanism that will increase the speed of data access. An index, like the index of a book, enables the database retrieve and present data to the end user with ease. An index can be defined as a mechanism for providing fast access to table rows and for enforcing constraints.

An index can be created by selecting one or more columns in a table that is being searched. It is a kind of ‘on disk’ structure associated with the table or view and contains keys that are built from one or more of the columns in the table or view. This structure known as B-Tree helps the SQL Server find the row or rows associated with the key values. Indexes can be created on computed columns or xml columns also.

Indexes can be clustered or non clustered. A clustered index stores data rows in the table based on their key values. Each table can have only one clustered index as the key values in the data rows are unique and the index is built on the unique key column. When a table has a clustered index, it is known as a clustered table. Non-Clustered indexes have structures that are different from the data rows. A non clustered index key value is used to point to data rows that contain the key value. This value is known as row locator. The structure of the row locator is determined on the basis of the type of storage of the data pages. If the data page is stored as a heap, a row locator becomes a pointer to a row. If the data page is stored in a clustered table the row locator is a clustered index key. Clustered and Non clustered indexes can be unique and indexes are automatically maintained for a table or view whenever the data table is modified.

SQL Server 2005 permits users add non-key columns to leaf level of the non clustered index for by passing existing index key limits and to execute fully covered index queries.

When the primary key and unique constraints of a table column are defined an automatic index is created.

The Query Optimizer uses indexes to reduce disk I/O operations and use of system resources while querying on data. Queries which contain SELECT, UPDATE or DELETE statements require indexes for optimal performance. When a query is executed, each available method is evaluated for retrieving data and the most efficient one is selected by the Query optimizer. The methodology used may be table scans or index scans. In table scans I/O operations are many and resource intensive as all rows in a table are scanned to find the relevant ones. Index scans are used to search the index key columns to find the storage location of rows needed by the query and as the Index contains very few columns, the query executes faster.

SQL Server 2005 provides the user with a new Transact-SQL DDL statement for modifying relational and XML indexes. The CREATE INDEX statement is enhanced to support XML index syntax, partitioning and the included columns. A number of new index options have been added including the ONLINE option that allows for concurrent user access to underlying data during index operations.

To create an index

1. In Object Explorer, right-click the table for which you want to create an index and click Modify.



2. The table opens in Table Designer.



3. From the Table Designer menu, click Indexes/Keys.



4. In the Indexes/Keys dialog box, click Add.



5. Select the new index in the Selected Primary/Unique Key or Index list and set properties for the index in the grid to the right.



6. Specify any other settings for the index and click Close.

7. The index is created in the database when you save the table.

SQL Server allows users create unique indexes on unique columns such as the identity number of the employee or student or whatever is the unique key by which the component data are identified. A set of columns also can be used to create a unique index. The DBA can set the option of ignoring duplicate keys in a unique index if required. The default is No.

To create a unique index

  1. In Object Explorer, right-click the table and click Modify.
  2. The table opens in Table Designer.
  3. From the Table Designer menu, click Indexes/Keys.
  4. Click Add. The Selected Primary/Unique Key or Index list displays the system-assigned name of the new index.


5. In the grid, click Type.



6. Choose Index from the drop-down list to the right of the property.

7. Under Column name, select the columns you want to index. You can select up to 16 columns. For optimal performance, select only one or two columns per index. For each column you select, indicate whether the index arranges values of this column in ascending or descending order.



8. In the grid, click Is Unique.



9. Choose Yes from the drop-down list to the right of the property.

10. Select the Ignore duplicate keys option if you want to ignore new or updated data that would create a duplicate key in the index (with the INSERT or UPDATE statement).



11. The index is created in the database when you save the table or diagram.



Please note that unique indexes cannot be created on a single column if the column contains NULL in more than one row. Similarly indexes cannot be created on multiple columns if the combination of the columns contains NULL in some rows. The NULL values are treated as duplicate values.

Clustered indexes can be created in SQL Server databases. In such cases the logical order of the index key values will be the same as the physical order of rows in the table. A table can have only one clustered index.

To create a clustered index

1. In Object Explorer, right-click the table for which you want to create a clustered index and click Modify.
2. The table opens in Table Designer.
3. From the Table Designer menu, click Indexes/Keys.
4. In the Indexes/Keys dialog box, click Add.
5. Select the new index in the Selected Primary/Unique Key or Index list.
6. In the grid, select Create as Clustered, and choose Yes from the drop-down list to the right of the property.



7. The index is created in the database when you save the table.

A full text index is used when a full text search is required to be performed on all the text based columns of the database. This index relies on a regular index which has to be created before a full text index is created. The regular index is created on a single, non null column. Usually a column with small values is selected for the indexation in a regular index. Often a Catalog is created using an external tool such as SQL Server Management Studio. Textual data from different text file formats are to be stored as image type files before Full text search can be done on the data.

To create full-text indexes

  1. In Object Explorer, right-click the table for which you want to create a full-text index and click Modify.
  2. The table opens in Table Designer.
  3. From the Table Designer menu, click Fulltext Index.


4. The Full-text Index dialog box opens. If the database is not enabled for full text indexing the dialog box will have the add button disabled. To enable full text indexing for the database, right click the database>Click properties and check the Full text indexing check box.



5. Then create a catalog by right clicking on Storage>Full Text Catalog and creating a new Catalog and entering the required information in the dialog box that opens.





6. Now open the Full Text Index property dialog box by clicking on it in the Table Designer menu.



7. Click Add.
8. Select the new index in the Selected Full-text Index list and set properties for the index in the grid to the right.
9. Your index is automatically saved in the database when you save your table in Table Designer. The index is available for modification as soon as you create it.

To change index properties

1. In Object Explorer, right-click the table you want to open and click Modify.
2. From the Table Designer menu, click Indexes/Keys.
3. Select the index from the Selected Primary/Unique Key or Index list.
4. Change properties in the grid.
5. The changes are saved to the database when you save the table.

System defined names are assigned to indexes based on the database file name. If multiple indexes are created on a table the index names are incremented numerically with _1, _2 etc. An index can be renamed to be unique to a table. Since the automatically created index bears the same name as the primary key or unique constraint in a table, another index cannot be renamed later to match the primary key or unique constraint.

To rename an index

1. In Object Explorer, right-click the table with the index you want to rename and click Modify.
2. From the Table Designer menu, click Indexes/Keys.
3. Select the index from the Selected Primary/Unique Key or Index list.
4. In the grid, click Name and type a new name into the text box.



5. The changes are saved to the database when you save the table.

Indexes can be deleted. Usually an index is considered for deletion when the performance of the INSERT,UPDATE and DELETE operations are hindered by the Index.

To delete an index

1. In Object Explorer, right-click the table with indexes you want to delete and click Modify.
2. From the Table Designer menu, click Indexes/Keys.
3. In the Indexes/Keys dialog box, select the index you want to delete.
4. Click Delete.
5. The index is deleted from the database when the table is saved.
6. A similar procedure can be followed for deleting a full text index by selecting Full text index from the Table Designer and selecting the index name and clicking delete button.

Microsoft SQL Server database uses a fill factor to specify how full each index page can be. The percentage of free space allotted to an index is defined as the fill factor. This is an important aspect of indexing as the amount of space to be filled by an index has to be determined by the DBA so that performance is not retarded.

To specify a fill factor for an index

1. In Object Explorer, right-click the table with an index for which you want to specify a fill factor and click Modify.
2. The table opens in Table Designer.
3. From the Table Designer menu, click Indexes/Keys.
4. The Indexes/Keys dialog box opens.
5. Select the index in the Selected Primary/Unique Key or Index list.
6. In the Fill Factor box, type a number from 0 to 100. The value of 100 implies that the index will fill up completely and the storage space required will be minimal. This setting is recommended only for cases where data is unlikely to change. If data is likely to undergo addition and modification, it is better to set a lower value. Storage space required would be in proportion to the value set.



XML indexes cannot be created using the Index/Keys dialog box. One or more XML indexes can be created for xml data type columns on the basis of a primary xml index. Deleting the primary xml index will result in the deletion of all indexes created on the base of the primary index.

To create an XML index

1. In Object Explorer, right-click the table for which you want to create an XML index and click Modify. 2. The table opens in Table Designer.
3. Select the xml column for the index.
4. From the Table Designer menu, click XML Index.

 
5. In the XML Indexes dialog box, click Add.




6. Select the new index in the Selected XML Index list and set properties for the index in the grid to the right.

To delete XML Indexes

1. In Object Explorer, right-click the table with the XML index you want to delete and click Modify.
2. The table opens in Table Designer.
3. From the Table Designer menu, click XML Index.
4. The XML Index dialog box opens.
5. Click the index you want to delete in the Selected XML Index column.
6. Click Delete.