Monday, December 21, 2009

.Net Coding Best practices

.Net Coding Best practices - Vinayak's thumb rules

1. Do not hard code strings/ numerics. Instead of that use constants as shown below.

Bad practice

Int Count;
Count = 100;
If( Count == 0 )
{
// DO something…
}

Good practice

Int Count;
Count = 100;
private static const int ZERO = 0;
If( Count == ZERO )
{
// DO something…
}

2. For string comparison - Use String. Empty instead of “”

3. By default keep the scope of member variables to ‘private’, based on the needs expand the scope either to protected or public or internal.

a. Other advantage of making the scope private by default is that during XMLSerilaization, by default it will serialize all the public members.

4. When we have to manipulate the strings inside a loop, use StringBuilder instead of string as shown below.

Bad practice

String temp = String.Empty;
For( int I = 0 ; I <= 100; i++)
{
Temp += i.ToString();
}

Good practice

StringBuilder sb = new StringBuilder();
For ( int I = 0 ; I <= 100; i++)
{
Sb.Append(i.ToString());
}

5. Prefer Arrays over Collections for simple operations.

6. Prefer Generic Collections over ArrayList

7. Prefer Generic Dictionaries over HashTable *.

8. Prefer StringCollections and StringDictionaries for String manipulations and storage.

9. Use the appropriate data types.

For ex: if you want to check for any status, prefer bool rather than int.

Bad practice

Int Check = 0;
If( Check == 0 )
{
// DO something
}

Good practice

Bool Check = false;
If( !Check)
{
// DO something
}

10. Use ‘as’ operator for type casting and before using that resultant value check for null.

Class A
{
}
Class B : A
{
}
B objB = new B();
A objA1 = (A) objB;
A objA 2 = objB as A;
If( objA2 != null)
{
//Do something
}

11. For WCF proxy creation, use the using statement

Using(Cerate the proxy)
{
//Do the required operation
}

12. Follow ‘Acquire late, release early’ rule for expensive resources such as Connection, File etc.

For ex : if you want to make use of SqlConnection Object for any data operations, create the instance at the method level rather than at the class level.

Class MyData
{
Public MyData()
{

}
Public List<Customer> GetAllCustomer()
{
Using(SqlConnection objConnection = new SqlConnection(“Connection string”))
{
//Do the operation and get the required data..
}
}
}

If you want to create the SqlConnection instance at the class level, ensure that you are implementing the IDisposable for the class and doing the cleanup of SqlConnection instance at the Dispose();

Class MyData : IDisposable
{
SqlConnection objConnection = default(SqlCOnnection);
Public MyData()
{
objConnection = new SqlCOnnection(“Connection string”);
}
Public List<Customer> GetAllCustomer()
{
By using objConnection get the required data
}
Public void Dispose()
{
//Do the cleanup of SqlCOnnection
If( objConnection != null )
{
If( objConnection.State == ConnectionState.Open)
{
objConnection.Close();
}
}
}
}

13. If you do not want anybody to extend your class functionalities, make it ‘sealed’ to get the inlining and compile time benefits

14. Avoid declaring the ‘destructor’ for every class. This will increase the life time of the class which un necessarily makes them long lived

15. Prefer using Thread Pool over manual threading.

16. Do not make any calls to a method from the loop.

For ex :

Bad practice

For( int I = 0; I <= 100; i++)
{
Calculate(i);
}

Good practice

For( int I = 0; I <= 100; i++)
{
//Inline the body of Calculate.
}
17. Do not handle exceptions inside a loop, rather handle looping logic inside try/catch

For ex:

Bad practice

For(int I = 0 ; I <= 100; i++)
{
Try
{
}
Catch(Exception ex)
{
Throw ex;
}
}

Good practice

Try
{
For(int I = 0 ; I <= 100; i++)
{
}
}
Catch(Exception ex)
{
Throw ex;
}

18. Do not handle application logic by using Exception.

For ex :

Bad practice

try
{
Int x,y,z;
X = 0;
Y = 10;
Z = y/x;

}
Catch(DevideByZeroException ex)
{
Throw ex;
}

Good practice

Try
{
Int x,y,z;
X = 0;
Y = 10;
If( X != 0 )
{
Z = y/x;
}
}
Catch(Exception ex)
{
}

19. Prefer for/while loop over foreach

20. For communication between the layers, prefer Data Transfer objects over DataSet/DataTables.

I hope this will help you all to improve the code quality!!


Happy programming

Regards,
-Vinayak

1 comment:

Unknown said...

Hello Vinayak,


It would be helpful if you could provide the reasons for each of the following best practices

1. Do not hard code strings/ numerics. Instead of that use constants

2.For string comparison - Use String. Empty instead of “”


3.When we have to manipulate the strings inside a loop, use StringBuilder instead of string

4.Use ‘as’ operator for type casting

5.Prefer Generic Dictionaries over HashTable



Thanks,
Suraj H.B.