SlideShare une entreprise Scribd logo
1  sur  54
Microsoft .NET Coding Guidelines and Best
                        Practices




Confidential e-Zest Solutions Ltd.              Page 1 of 54
Version and History
Version       Date               Author       Reviewed By   Comments
1.0           23-May-2012        Lalit Kale                 Draft




Confidential e-Zest Solutions Ltd.                                     Page 2 of 54
Table of Contents

1     Overview ................................................................................................................................. 5

2     Principles and Themes .............................................................................................................. 5

3     How to follow the standards across the team ........................................................................... 6

4     General Coding Standards ........................................................................................................ 7
    4.1    Clarity and Consistency ...............................................................................................................................7
    4.2    Formatting and Style...................................................................................................................................8
    4.3    Using Libraries.............................................................................................................................................9
    4.4    Variable Declarations and Initalizations .....................................................................................................9
    4.5    Function Declarations and Calls ................................................................................................................11
    4.6    Enums........................................................................................................................................................12
    4.7    Comments .................................................................................................................................................14
                  4.7.1          Inline Code Comments                                                                                                                   16

5     .NET Coding Standards ........................................................................................................... 19
    5.1    Design Guidelines for Developing Class Libraries .....................................................................................19
    5.2    Files and Structure ....................................................................................................................................19
    5.3    Assembly Properties .................................................................................................................................19
    5.4    Naming Convensions.................................................................................................................................19
                  5.4.1          General Naming Conventions                                                                                                             19
                  5.4.2          Capitalization Naming Rules for Identifiers                                                                                            19
                  5.4.3          Hungarian Notation                                                                                                                     21
                  5.4.4          UI Control NamingConventions                                                                                                           21
    5.5    Constants ..................................................................................................................................................22
    5.6    Strings .......................................................................................................................................................22
    5.7    Arrays and Collections ..............................................................................................................................24
    5.8    Structures ..................................................................................................................................................26
                  5.8.1          Structures vs. Classes                                                                                                                 27
    5.9    Classes .......................................................................................................................................................27
                  5.9.1          Fields                                                                                                                                 27
                  5.9.2          Properties                                                                                                                             27
                  5.9.3          Constructors                                                                                                                           28
                  5.9.4          Methods                                                                                                                                28
                  5.9.5          Events                                                                                                                                 28
                  5.9.6          Member Overloading                                                                                                                     29
                  5.9.7          Interface Members                                                                                                                      30
                  5.9.8          Virtual Members                                                                                                                        30
                  5.9.9          Static Classes                                                                                                                         30


Confidential e-Zest Solutions Ltd.                                                                                                                   Page 3 of 54
5.9.10        Abstract Classes                                                                                                               30
   5.10 Namespaces ..............................................................................................................................................31
   5.11 Errors and Exceptions ...............................................................................................................................31
                  5.11.1        Exception Throwing                                                                                                             31
                  5.11.2        Exception Handling                                                                                                             32
   5.12 Resource Cleanup .....................................................................................................................................35
                  5.12.1        Try-finally Block                                                                                                              35
                  5.12.2        Basic Dispose Pattern                                                                                                          37
                  5.12.3        Finalizable Types                                                                                                              45
                  5.12.4        Overriding Dispose                                                                                                             52




Confidential e-Zest Solutions Ltd.                                                                                                            Page 4 of 54
1 Overview

This document defines .NETcoding guidelines for the e-Zest project teams. This standard derives from
the experience of project and product development efforts and is continuously evolving. If you discover
a new best practice or a topic that is not covered, please bring that to the attention of the Architect
Group and have the conclusion added to this document.

No set of guidelines will satisfy everyone. The goal of a standard is to create efficiencies across all of the
developers. Applying a set of well-defined coding standards will result in code with fewer bugs, and
better maintainability.Adopting an unfamiliar standard may be awkward initially, but the pain fades
quickly and the benefits are quickly realized, especially when you inherit ownership of others' code.




2 Principles and Themes

High-quality code exhibits the following characteristics:

     1. Understandable.Code must be clearly readable and straightforward. Code must showcase the
        key things it isdesigned and implemented for. The relevant parts of entire project/Solution code
        should be easy to reuse. Projects/Solution should not contain unnecessary code.
        Projects/Solutionsmust include appropriate documentation.
     2. Correct.Projects/Solutions must demonstrateproperly how to perform the key things they are
        designed to do. Projects/Solutions must compile cleanly, run correctly as documented, and be
        tested.
     3. Consistent.Projects/Solutions should follow consistent coding style and layout to make the code
        easier to read. Likewise, Projects/Solutions should be consistent with each other to make them
        easier to use together. Consistency shows craftsmanship and attention to detail.
     4. Safe. Projects/Solutions must comply with legal, privacy, and policy standards. They must not
        demonstrate hacks or poor programming practices.
     5. Secure.Projects/Solutions should demonstrate how to use secure programming practices such
        as least privilege, secure versions of runtime library functions, and SDL-recommended project
        settings.
     6. Reliable
     7. Maintainable
     8. Efficient

The proper use of programming practices, design, and language features determines how well
Projects/Solutions can achieve these. This code standard is designed to help you create
Projects/Solutions that serve as “best practices” for customers to emulate.



Confidential e-Zest Solutions Ltd.                                                                    Page 5 of 54
3 How to follow the standards across the team

If you have a team of different skills and tastes, you are going to have a tough time convincing everyone
to follow the same standards. The best approach is to have a team meeting and developing your own
standards document. You may use this document as a template to prepare your own document.

Distribute a copy of this document (or your project’s tailored coding guidelines document) well ahead of
the coding standards meeting. All members should come to the meeting prepared to discuss pros and
cons of the various points in the document. Make sure you have a technical manager present in the
meeting to resolve conflicts.

Discuss all points in the document. Everyone may have a different opinion about each point, but at the
end of the discussion, all members must agree upon the standard you are going to follow. Prepare a
new standards/guidelines document with appropriate changes based on the suggestions from all of the
team members. Print copies of it and post it in all workstations.

After you start the development, you must schedule code review meetings to ensure that everyone is
following the rules.

3 types of code reviews are recommended:

1.Peer review – another team member review the code to ensure that the code follows the coding
standards and meets requirements. This level of review can include some unit testing also. Every file in
the project must go through this process.

2.Architect review – the architect of the team must review the core modules of the project to ensure
that they adhere to the design and there are no “big” mistakes that can affect the project in the long
run.

3.Group review – randomly select one or more files and conduct a group review once in a week.
Distribute a printed copy of the files to all team members 30 minutes before the meeting. Let them read
and come up with points for discussion. In the group review meeting, use a projector to display the file
content in the screen. Go through every sections of the code and let every member give their
suggestions on how could that piece of code can be written in a better way. (Don’t forget to appreciate
the developer for the good work and also make sure he does not get offended by the “group attack”!)




Confidential e-Zest Solutions Ltd.                                                                Page 6 of 54
4 General Coding Standards

These general coding standards can be applied to all languages - they provide high-level guidance to the
style, formatting and structure of your source code.

4.1     Clarity and Consistency
Do ensure that clarity, readability and transparency are paramount. These coding standards strive to
ensure that the resultant code is easy to understand and maintain, but nothing beats fundamentally
clear, concise, self-documenting code.Do ensure that when applying these coding standards that they
are applied consistently.

      1. File name should match with class name.
         For example, for the class HelloWorld, the file name should be helloworld.cs (or, helloworld.vb)

      2. Use Pascal Case for file names.

      3. Do not hardcode numbers. Use constants instead. Declare constant in the top of the file and use
         it in your code.However, for application level variables, using constants are also not
         recommended. You should use the constants in the config file or database so that you can
         change it later. Declare them as constants only if you are sure this value will never need to be
         changed.

      4. Do not hardcode strings. Use resource files.

      5. Never assume that your code will run from drive "C:". You may never know, some users may run
         it from network or from a "Z:”.

      6. Do not have more than one class in a single file.

      7. Avoid having very large files. If a single file has more than 1000 lines of code, it is a good
         candidate for refactoring. Split them logically into two or more classes.

      8. Avoid passing too many parameters to a method. If you have more than 4~5 parameters, it is a
         good candidate to define a class or structure.

      9. Use the AssemblyInfo file to fill information like version number, description, company name,
         copyright notice etc.

      10. Logically organize all your files within appropriate folders. Use 2 level folder hierarchies. You can
          have up to 10 folders in the root folder and each folder can have up to 5 sub folders. If you have
          too many folders than cannot be accommodated with the above mentioned 2 level hierarchy,
          you may need re factoring into multiple assemblies.

      11. Make sure you have a good logging class which can be configured to log errors, warning or
          traces. If you configure to log errors, it should only log errors. But if you configure to log traces,
          it should record all (errors, warnings and trace). Your log class should be written such a way that

Confidential e-Zest Solutions Ltd.                                                                        Page 7 of 54
in future you can change it easily to log to Windows Event Log, SQL Server, or Email to
           administrator or to a File etc without any change in any other part of the application. Use the
           log class extensively throughout the code to record errors, warning and even trace messages
           that can help you trouble shoot a problem.

      12. If you are opening database connections, sockets, file stream etc, always close them in the
          finally block. This will ensure that even if an exception occurs after opening the connection, it
          will be safely closed in the finally block.

      13. Declare variables as close as possible to where it is first used. Use one variable declaration per
          line.

      14. Use StringBuilder class instead of String when you have to manipulate string objects in a loop.
          The String object works in weird way in .NET. Each time you append a string, it is actually
          discarding the old string object and recreating a new object, which is a relatively expensive
          operations.


4.2     Formatting and Style
Do not use tabs. It's generally accepted across Microsoft that tabs shouldn't be used in source files -
different text editors use different spacing to render tabs, and this causes formatting confusion. All code
should be written using four spaces for indentation.

Visual Studio text editor can be configured to insert spaces for tabs.




Confidential e-Zest Solutions Ltd.                                                                    Page 8 of 54
You should limit the length of lines of code. Having overly long lines inhibits the readability of code.
Break the code line when the line length is greater than column 78 for readability. If column 78 looks
too narrow, use column 86 or 90.



Douse a fixed-width font, typically Courier New, in your code editor.




4.3     Using Libraries
Do notreference unnecessary libraries, include unnecessary header files, or reference unnecessary
assemblies. Paying attention to small things like this can improve build times, minimize chances for
mistakes, and give readers a good impression.

4.4     Variable Declarations and Initalizations
Dodeclare local variables in the minimum scope block that can contain them, typically just before use
if the language allows; otherwise, at the top of that scope block.

Doinitialize variables when they are declared.

Dodeclare and initialize/assign local variables on a single line where the language allows it. This
reduces vertical space and makes sure that a variable does not exist in an un-initialized state or in a state
that will immediately change.

Do not use Hungarian notation to name variables.

Use Meaningful, descriptive words to name variables. Do not use abbreviations.


Confidential e-Zest Solutions Ltd.                                                                  Page 9 of 54
Good:



           string address
           int salary


Not Good:



           string nam
           string addr
           int sal


Do not use single character variable names like i, n, s etc. Use names like index, temp

One exception in this case would be variables used for iterations in loops:

           for ( int i = 0; i < count; i++ )
           {
                  ...
           }
If the variable is used only as a counter for iteration and is not used anywhere else in the loop, many
people still like to use a single char variable (i) instead of inventing a different suitable name.

Do not use underscores (_) for local variable names.

All member variables must be prefixed with underscore (_) so that they can be identified from other
local variables.

Do not use variable names that resemble keywords.

Prefixbooleanvariables, properties and methods with “is” or similar prefixes.

           Ex: private bool _isFinished


           // C# sample:
           string name = myObject.Name;

           int val = time.Hours;


           ' VB.NET sample:
           Dim name AsString = myObject.Name

           Dim val AsInteger = time.Hours




Confidential e-Zest Solutions Ltd.                                                                Page 10 of 54
4.5     Function Declarations and Calls
The function/method name, return value and parameter list can take several forms. Ideally this can all
fit on a single line. If there are many arguments that don't fit on a line those can be wrapped, many per
line or one per line. Put the return type on the same line as the function/method name.For example,

Single Line Format:

           // C# function call sample:
           hr = DoSomeFunctionCall(param1, param2, param3);
           'VB.NETfunction call sample:
           hr = DoSomeFunctionCall(param1, param2, param3)



Multiple Line Formats:

           // C# function call sample:
           hr = DoSomeFunctionCall(param1, param2,param3,

                 param4, param5);

           'VB.NETfunction call sample:
           hr = DoSomeFunctionCall(param1, param2,param3, _

           param4, param5)

Do order parameters, grouping the in parameters first, the out parameters appear last. Within the
group, order the parameters based onwhat will help programmers supply the right values. For example,
if a function takes arguments named “left” and “right”, put “left” before “right” so that their place
match their names. When designing a series of functions which take the same arguments, use a
consistent order across the functions. For example, if one function takes an input handle as the first
parameter, all of the related functions should also take the same input handle as the first parameter.

Do not writing very long methods. A method should typically have 1~25 lines of code. If a method has
more than 25 lines of code, you must consider refactoring into separate methods.

Do not use mis-leading names. Method name should tell what it does.

A method should do only 'one job'. Do not combine more than one job in a single method, even if
those jobs are very small.

Good:

           // Save the address.
           SaveAddress ( address );

           // Send an email to the supervisor to inform that the address is updated.
           SendEmail ( address, email );

           void SaveAddress ( string address )
           {
                  // Save the address.
                  // ...
           }


Confidential e-Zest Solutions Ltd.                                                               Page 11 of 54
void SendEmail ( string address, string email )
           {
                  // Send an email to inform the supervisor that the address is changed.
                  // ...
           }


Not Good:

           // Save address and send an email to the supervisor to inform that
           // the address is updated.
           SaveAddress ( address, email );

           void SaveAddress ( string address, string email )
           {
                  // Job 1.
                  // Save the address.
                  // ...

                      // Job 2.
                      // Send an email to inform the supervisor that the address is changed.
                      // ...
           }



4.6     Enums
Douse an enum to strongly type parameters, properties, and return values that represent sets of
values.

Dofavor using an enum over static constants or “#define” values .An enum is a structure with a set of
static constants. The reason to follow this guideline is because you will get some additional compiler and
reflection support if you define an enum versus manually defining a structure with static constants.

Good:

           // C# sample:

           publicenumColor

           {

                 Red,

                 Green,

                 Blue

           }

           ' VB.NET sample:

           PublicEnum Color

                 Red

                 Green


Confidential e-Zest Solutions Ltd.                                                               Page 12 of 54
Blue

           EndEnum

Bad:

           // C# sample:

           publicstaticclassColor

           {

           publicconst int Red = 0;

           publicconst int Green = 1;

           publicconst int Blue = 2;

           }

           ' VB.NET sample:

           PublicClass Color

           PublicConst Red AsInteger = 0

           PublicConst Green AsInteger = 1

           PublicConst Blue AsInteger = 2

           EndClass

Do not use an enum for open sets (such as the operating system version, names of your friends, etc.).

Doprovide a value of zero on simple enums.Consider calling the value something like “None.” If such
value is not appropriate for this particular enum, the most common default value for the enum should
be assigned the underlying value of zero.

           // C# sample:

           publicenumCompression

           {

                 None = 0,

                 GZip,

                 Deflate

           }

           ' VB.NET sample:

           PublicEnum Compression

                 None = 0


Confidential e-Zest Solutions Ltd.                                                            Page 13 of 54
GZip

                  Deflate

           EndEnum

Do not use Enum.IsDefined for enum range checks in .NET.There are really two problems with
Enum.IsDefined. First it loads reflection and a bunch of cold type metadata, making it a surprisingly
expensive call. Second, there is a versioning issue here.

           Good:

           // C# sample:

           if (c >Color.Black || c <Color.White)

           {

           thrownewArgumentOutOfRangeException(...);

           }

           ' VB.NET sample:

           If (c > Color.Black Or c < Color.White) Then

                  ThrowNew ArgumentOutOfRangeException(...);

           EndIf

           Bad:

           // C# sample:

           if (!Enum.IsDefined(typeof(Color), c))

           {

           thrownew InvalidEnumArgumentException(...);

           }

           ' VB.NET sample:

           IfNot [Enum].IsDefined(GetType(Color), c) Then

                  ThrowNew ArgumentOutOfRangeException(...);

           EndIf


4.7     Comments
You should use comments that summarize what a piece of code is designed to do and why. Do not
use comments to repeat the code.

           Good:


Confidential e-Zest Solutions Ltd.                                                                Page 14 of 54
// Determine whether system is running Windows Vista or later operating

           // systems (major version >= 6) because they support linked tokens, but

           // previous versions (major version < 6) do not.

           Bad:

           // The following code sets the variable i to the starting value of the

           // array.         Then it loops through each item in the array.

You shoulduse ‘//’ comments instead of ‘/* */’ for comments for C# code comments.The single-line
syntax (// …) is preferred even when a comment spans multiple lines.

           // Determine whether system is running Windows Vista or later operating

           // systems (major version >= 6) because they support linked tokens, but

           // previous versions (major version < 6) do not.

           if (Environment.OSVersion.Version.Major >= 6)

           {

           }



           ' Get and display the process elevation information (IsProcessElevated)

           ' and integrity level (GetProcessIntegrityLevel). The information is not

           ' available on operating systems prior to Windows Vista.

           If (Environment.OSVersion.Version.Major >= 6) Then

           EndIf

You should indent comments at the same level as the code they describe.

You should use full sentences with initial caps, a terminating period and proper punctuation and
spelling in comments.

           Good:

           // Intialize the components on the Windows Form.

           InitializeComponent();

           ' Intialize the components on the Windows Form.

           InitializeComponent()

           Bad:


Confidential e-Zest Solutions Ltd.                                                            Page 15 of 54
//intialize the components on the Windows Form.

           InitializeComponent();

           'intialize the components on the Windows Form

           InitializeComponent()

4.7.1      Inline CodeComments
Inline comments should be included on their own line and should be indented at the same level as the
code they are commenting on, with a blank line before, but none after. Comments describing a block of
code should appear on a line by themselves, indented as the code they describe, with one blank line
before it and one blank line after it. For example:

           if (MAXVAL >= exampleLength)

           {

           // Reprort the error.

           ReportError(GetLastError());



           // The value is out of range, we cannot continue.

           return E_INVALIDARG;

           }

Inline comments are permissible on the same line as the actual code only when giving a brief description
of a structure member, class member variable, parameter, or a short statement. In this case it is a good
idea to align the comments for all variables. For example:

           class Example

           {

           public:

                 ...



           void TestFunction

                 {

                        ...

                        do

                        {

                              ...


Confidential e-Zest Solutions Ltd.                                                             Page 16 of 54
}

                        while (!fFinished); // Continue if not finished.

                  }

           private:

           int m_length;             // The length of the example

           float m_accuracy; // The accuracy of the example

           };

You should not drown your code in comments. Commenting every line with obvious descriptions of
what the code does actually hinders readability and comprehension. Single-line comments should be
used when the code is doing something that might not be immediately obvious.

The following example contains many unnecessary comments:

           Bad:

           // Loop through each item in the wrinkles array

           for (int i = 0; i <= lastWrinkle; i++)

           {

                  Wrinkle wrinkle = apWrinkles[i];         // Get the next wrinkle

           if (wrinkle.IsNew() &&// Process if it’s a new wrinkle

                        nMaxImpact <wrinkle.GetImpact()) // And it has the biggest impact

                  {

                        nMaxImpact = wrinkle.GetImpact(); // Save its impact for comparison

                        pBestWrinkle = wrinkle;           // Remember this wrinkle as well

                  }

           }

A better implementation would be:

           Good:

           // Loop through each item in the wrinkles array, find the Wrinkle with

           // the largest impact that is new, and store it in ‘pBestWrinkle’.

           for (int i = 0; i <= lastWrinkle; i++)

           {

                  Wrinkle wrinkle = apWrinkles[i];

Confidential e-Zest Solutions Ltd.                                                           Page 17 of 54
if (wrinkle.IsNew() && nMaxImpact <wrinkle.GetImpact())

                 {

                        nMaxImpact = wrinkle->GetImpact();

                        pBestWrinkle = wrinkle;

                 }

           }

You should add comments to call out non-intuitive or behavior that is not obvious from reading the
code.




Confidential e-Zest Solutions Ltd.                                                           Page 18 of 54
5 .NET Coding Standards

These coding standards can be applied to C# and VB.NET.

5.1     Design Guidelines for Developing Class Libraries
The Design Guidelines for Developing Class Libraries document on MSDN is a fairly thorough discussion
of how to write managed code.

5.2     Files and Structure
Do nothave more than one public type in a source file, unless they differ only in the number of generic
parameters or one is nested in the other. Multiple internal types in one file are allowed.

Do name the source file with the name of the public type it contains. For example, MainForm class
should be in MainForm.cs file and List<T> class should be in List.cs file.

5.3     Assembly Properties
The assembly should contain the appropriate property values describing its name, copyright, and so on.

 Standard                                                 Example
 Set Copyright to Copyright © Microsoft Corporation       [assembly: AssemblyCopyright("Copyright ©
 2010                                                     Microsoft Corporation 2010")]
 Set AssemblyCompany to Microsoft Corporation             [assembly: AssemblyCompany("Microsoft
                                                          Corporation")]
 Set both AssemblyTitle and AssemblyProduct to the        [assembly: AssemblyTitle("CSNamedPipeClient")]
 current sample name                                      [assembly: AssemblyProduct("CSNamedPipeClient")]


5.4     Naming Convensions

5.4.1       General Naming Conventions
Do use meaning names for various types, functions, variables, constructs and types.

You should not use of shortenings or contractions as parts of identifier names. For example, use
“GetWindow” rather than “GetWin”. For functions of common types, thread procs, window procedures,
dialog procedures use the common suffixes for these “ThreadProc”, “DialogProc”, “WndProc”.

Do not useunderscores, hyphens, or any other non-alphanumeric characters.

5.4.2       Capitalization Naming Rules for Identifiers
The following table describes the capitalization and naming rules for different types of identifiers.

 Identifier            Casing                Naming Structure                     Example
 Class, Structure      PascalCasing          Noun                                 public class ComplexNumber
                                                                                  {...}
                                                                                  public struct
                                                                                  ComplextStruct{...}
 Namespace             PascalCasing          Noun                                 namespace


Confidential e-Zest Solutions Ltd.                                                                    Page 19 of 54
Do not use the same name for a namespace and        Microsoft.Sample.Windows7
                                              a type in that namespace.
 Enumeration           PascalCasing           Noun                                                 [Flags]
                                              Doname flag enums with plural nouns or noun         publicenumConsoleModifiers
                                              phrases and simple enums with singular nouns or      {Alt, Control}
                                              noun phrases.
 Method                PascalCasing           Verb or Verbphrase                                   public void Print() {...}
                                                                                                   public void ProcessItem()
                                                                                                   {...}
 Public Property       PascalCasing           Noun or Adjective                                    publicstring CustomerName
                                              Doname collection proprieties with a plural         public ItemCollection Items
                                              phrase describing the items in the collection, as    public boolCanRead
                                              opposed to a singular phrase followed by “List” or
                                              “Collection”.
                                              Doname Boolean proprieties with an affirmative
                                              phrase (CanSeek instead of CantSeek). Optionally,
                                              you can also prefix Boolean properties with “Is,”
                                              “Can,” or “Has” but only where it adds value.
 Non-public Field      camelCasing or         Noun or Adjective.                                   privatestring name;
                       _camelCasing           Do be consistent in a code sample when you use      privatestring_name;
                                              the '_' prefix.
 Event                 PascalCasing           Verb or Verb phrase                                  // A close event that is
                                              Dogive events names with a concept of before        raised after the window is
                                              and after, using the present and past tense.         closed.
                                              Do not use “Before” or “After” prefixes or          publicevent WindowClosed
                                              postfixes to indicate pre and post events.
                                                                                                   // A close event that is
                                                                                                   raised before a window is
                                                                                                   closed.
                                                                                                   publicevent WindowClosing

 Delegate              PascalCasing           Do add the suffix ‘EventHandler’ to names of        publicdelegate
                                              delegates that are used in events.                   WindowClosedEventHandler
                                              Do add the suffix ‘Callback’ to names of
                                              delegates other than those used as event handlers.
                                              Do not add the suffix “Delegate” to a delegate.
 Interface             PascalCasing           Noun                                                 publicinterfaceIDictionary
                       ‘I’ prefix
 Constant              PascalCasing for       Noun                                                 publicconststring
                       publicly visible;                                                           MessageText = "A";
                       camelCasing for                                                             privateconststring
                       internally visible;                                                         messageText = "B";
                       All capital only for                                                        publicconst double PI=
                       abbreviation of one                                                         3.14159...;
                       or two chars long.

 Parameter,            camelCasing            Noun                                                 int customerID;
 Variable
 Generic Type          PascalCasing           Noun                                                 T, TItem, TPolicy
 Parameter             ‘T’ prefix             Doname generic type parameters with
                                              descriptive names, unless a single-letter name is
                                              completely self-explanatory and a descriptive name
                                              would not add value.
                                              Doprefix descriptive type parameter names with
                                              T.
                                              You shouldusing T as the type parameter name
                                              for types with one single-letter type parameter.
 Resource              PascalCasing           Noun                                                 ArgumentExceptionInvalidName
                                              Do provide descriptive rather than short
                                              identifiers.Keep them concise where possible, but


Confidential e-Zest Solutions Ltd.                                                                                     Page 20 of 54
do not sacrifice readability for space.
                                                Do use only alphanumeric characters and
                                                underscores in naming resources.


5.4.3       Hungarian Notation
Do not use Hungarian notation (i.e., do not encode the type of a variable in its name) in .NET.

5.4.4       UI Control NamingConventions
UI controls would use the following prefixes. The primary purpose was to make code more readable.

 Control Type                 Prefix
 Button                       btn
 CheckBox                     chk
 CheckedListBox               lst
 ComboBox                     cmb
 ContextMenu                  mnu
 DataGrid                     dg
 DateTimePicker               dtp
 Form                         suffix: XXXForm
 GroupBox                     grp
 ImageList                    iml
 Label                        lb
 ListBox                      lst
 ListView                     lvw
 Menu                         mnu
 MenuItem                     mnu
 NotificationIcon             nfy
 Panel                        pnl
 PictureBox                   pct
 ProgressBar                  prg
 RadioButton                  rad
 Splitter                     spl
 StatusBar                    sts
 TabControl                   tab
 TabPage                      tab
 TextBox                      tb
 Timer                        tmr
 TreeView                     tvw




For example, for the “File | Save” menu option, the “Save” MenuItem would be called “mnuFileSave”.




Confidential e-Zest Solutions Ltd.                                                                 Page 21 of 54
5.5     Constants
Douse constant fields for constants that will never change.The compiler burns the values of const
fields directly into calling code. Therefore const values can never be changed without the risk of
breaking compatibility.



           publicclassInt32

           {

           publicconstint MaxValue = 0x7fffffff;

           publicconstint MinValue = unchecked((int)0x80000000);

           }

           PublicClass Int32

           PublicConst MaxValue AsInteger = &H7FFFFFFF

           PublicConst MinValue AsInteger = &H80000000

           EndClass

Douse public static (shared) readonly fields for predefined object instances. If there are predefined
instances of the type, declare them as public readonly static fields of the type itself. For example,

           publicclassShellFolder

           {

           publicstaticreadonlyShellFolder ProgramData = newShellFolder("ProgramData");

           publicstaticreadonlyShellFolder ProgramFiles = newShellFolder("ProgramData");

                 ...

           }

           PublicClass ShellFolder

           PublicSharedReadOnly ProgramData AsNew ShellFolder("ProgramData")

           PublicSharedReadOnly ProgramFiles AsNew ShellFolder("ProgramFiles")

                 ...

           EndClass


5.6     Strings
Do not use the ‘+’ operator (or ‘&’ in VB.NET) to concatenate many strings. Instead, you should use
StringBuilder for concatenation. However, do use the ‘+’ operator (or ‘&’ in VB.NET) to concatenate
small numbers of strings.


Confidential e-Zest Solutions Ltd.                                                               Page 22 of 54
Good:

           StringBuilder sb = newStringBuilder();

           for (int i = 0; i < 10; i++)

           {

                sb.Append(i.ToString());

           }

           Bad:

           string str = string.Empty;

           for (int i = 0; i < 10; i++)

           {

                str += i.ToString();

           }

Do use overloads that explicitly specify the string comparison rules for string operations. Typically, this
involves calling a method overload that has a parameter of type StringComparison.

Do use StringComparison.Ordinal or StringComparison.OrdinalIgnoreCase for comparisons as your
safe default for culture-agnostic string matching, and for better performance.

Do use string operations that are based on StringComparison.CurrentCulture when you display output
to the user.

Do use the non-linguistic StringComparison.Ordinal or StringComparison.OrdinalIgnoreCasevalues
instead of string operations based on CultureInfo.InvariantCulture when the comparison is linguistically
irrelevant (symbolic, for example).Do not use string operations based on
StringComparison.InvariantCulture in most cases. One of the few exceptions is when you are persisting
linguistically meaningful but culturally agnostic data.

Do use an overload of the String.Equals method to test whether two strings are equal. For example, to
test if two strings are equal ignoring the case,

           if (str1.Equals(str2, StringComparison.OrdinalIgnoreCase))

           If (str1.Equals(str2, StringComparison.OrdinalIgnoreCase)) Then




Do not use an overload of the String.Compare or CompareTo method and test for a return value of
zero to determine whether two strings are equal. They are used to sort strings, not to check for equality.



Confidential e-Zest Solutions Ltd.                                                                 Page 23 of 54
Do use the String.ToUpperInvariant method instead of the String.ToLowerInvariant method when you
normalize strings for comparison.

5.7     Arrays and Collections
You shoulduse arrays in low-level functions to minimize memory consumption and maximize
performance. In public interfaces, do prefer collections over arrays.

Collections provide more control over contents, can evolve over time, and are more usable. In addition,
using arrays for read-only scenarios is discouraged as the cost of cloning the array is prohibitive.

However, if you are targeting more skilled developers and usability is less of a concern, it might be
better to use arrays for read-write scenarios. Arrays have a smaller memory footprint, which helps
reduce the working set, and access to elements in an array is faster as it is optimized by the runtime.

Do not use read-only array fields. The field itself is read-only and can’t be changed, but elements in
the array can be changed.This example demonstrates the pitfalls of using read-only array fields:

           Bad:

           publicstaticreadonlychar[] InvalidPathChars = { '"', '<', '>', '|'};

This allows callers to change the values in the array as follows:

           InvalidPathChars[0] = 'A';

Instead, you can use either a read-only collection (only if the items are immutable) or clone the array
before returning it. However, the cost of cloning the array may be prohibitive.

           publicstatic ReadOnlyCollection<char> GetInvalidPathChars()

           {

           return Array.AsReadOnly(badChars);

           }



           publicstaticchar[] GetInvalidPathChars()

           {

           return (char[])badChars.Clone();

           }




You shoulduse jagged arrays instead of multidimensional arrays.A jagged array is an array with
elements that are also arrays. The arrays that make up the elements can be of different sizes, leading to
less wasted space for some sets of data (e.g., sparse matrix), as compared to multidimensional arrays.


Confidential e-Zest Solutions Ltd.                                                                Page 24 of 54
Furthermore, the CLR optimizes index operations on jagged arrays, so they might exhibit better runtime
performance in some scenarios.

           // Jagged arrays

           int[][] jaggedArray =

           {

           newint[] {1,2,3,4},

           newint[] {5,6,7},

           newint[] {8},

           newint[] {9}

           };



           Dim jaggedArray AsInteger()() = NewInteger()() _

           { _

           NewInteger() {1, 2, 3, 4}, _

           NewInteger() {5, 6, 7}, _

           NewInteger() {8}, _

           NewInteger() {9} _

           }



           // Multidimensional arrays

           int [,] multiDimArray =

           {

                 {1,2,3,4},

                 {5,6,7,0},

                 {8,0,0,0},

                 {9,0,0,0}

           };



           Dim multiDimArray(,) AsInteger = _

           { _


Confidential e-Zest Solutions Ltd.                                                            Page 25 of 54
{1, 2, 3, 4}, _

                 {5, 6, 7, 0}, _

                 {8, 0, 0, 0}, _

                 {9, 0, 0, 0} _

           }




Douse Collection<T> or a subclass of Collection<T> for properties or return values representing
read/write collections, and use ReadOnlyCollection<T> or a subclass of ReadOnlyCollection<T> for
properties or return values representing read-only collections.

You should reconsider the use of ArrayList because any objects added into the ArrayList are added as
System.Object and when retrieving values back from the arraylist, these objects are to be unboxed to
return the actual valuetype. So it is recommended to use the custom typed collections instead of
ArrayList. For example, .NET provides a strongly typed collection class for String in
System.Collection.Specialized, namely StringCollection.

You should reconsider the use of Hashtable. Instead, try other dictionary such as StringDictionary,
NameValueCollection, HybridCollection.Hashtable can be used if less number of values is stored.

When you are creating a collection type, you should implement IEnumerable so that the collection
can be used with LINQ to Objects.

Do notimplement both IEnumerator<T> and IEnumerable<T> on the same type. The same applies to
the nongeneric interfaces IEnumerator and IEnumerable. In other words, a type should be either a
collection or an enumerator, but not both.

Do not return a null reference for Arrayor Collection. Null can be difficult to understand in this
context. For example, a user might assume that the following code will work.Return an empty array or
collection instead of a null reference.

           int[] arr = SomeOtherFunc();

           foreach (int v in arr)

           {

                 ...

           }


5.8     Structures
Doensure that a state where all instance data is set to zero, false, or null (as appropriate) is valid.This
prevents accidental creation of invalid instances when an array of the structs is created.



Confidential e-Zest Solutions Ltd.                                                                  Page 26 of 54
Doimplement IEquatable<T> on value types.The Object.Equals method on value types causes boxing
and its default implementation is not very efficient, as it uses reflection. IEquatable<T>.Equals can have
much better performance and can be implemented such that it will not cause boxing.

5.8.1      Structures vs. Classes
Do not define a struct unless the type has all of the following characteristics:



      •    It logically represents a single value, similar to primitive types (int, double, etc.).
      •    It has an instance size fewer than 16 bytes.
      •    It is immutable.
      •    It will not have to be boxed frequently.


In all other cases, you should define your types as classes instead of structs.

5.9       Classes
Douse inheritance to express “is a” relationships such as “cat is an animal”.

Douse interfaces such as IDisposable to express “can do” relationships such as using “objects of this
class can be disposed”.

5.9.1      Fields
Do not provide instance fields that are public or protected.Public and protected fields do not version
well and are not protected by code access security demands. Instead of using publicly visible fields, use
private fields and expose them through properties.

Douse public static read-only fields for predefined object instances.

Douse constant fields for constants that will never change.

Do not assign instances of mutable types to read-only fields.

5.9.2      Properties
Docreate read-only properties if the caller should not be able to change the value of the property.

Do not provide set-only properties.If the property getter cannot be provided, use a method to
implement the functionality instead. The method name should begin with Set followed by what would
have been the property name.



Doprovide sensible default values for all properties, ensuring that the defaults do not result in a
security hole or an extremely inefficient design.



Confidential e-Zest Solutions Ltd.                                                                   Page 27 of 54
You should not throw exceptions from property getters.Property getters should be simple operations
without any preconditions. If a getter might throw an exception, consider redesigning the property to be
a method.This recommendation does not apply to indexers. Indexers can throw exceptions because of
invalid arguments.It is valid and acceptable to throw exceptions from a property setter.

5.9.3      Constructors
Dominimal work in the constructor.Constructors should not do much work other than to capture the
constructor parameters and set main properties. The cost of any other processing should be delayed
until required.

Dothrow exceptions from instance constructors if appropriate.

Doexplicitly declare the public default constructor in classes, if such a constructor is required.Even
though some compilers automatically add a default constructor to your class, adding it explicitly makes
code maintenance easier. It also ensures the default constructor remains defined even if the compiler
stops emitting it because you add a constructor that takes parameters.

Do not call virtual members on an object inside its constructors.Calling a virtual member causes the
most-derived override to be called regardless of whether the constructor for the type that defines the
most-derived override has been called.

5.9.4      Methods
Doplace all out parameters after all of the pass-by-value and ref parameters (excluding parameter
arrays), even if this results in an inconsistency in parameter ordering between overloads.

Dovalidate arguments passed to public, protected, or explicitly implemented members. Throw
System.ArgumentException, or one of its subclasses, if the validation fails: If a null argument is passed
and the member does not support null arguments, throw ArgumentNullException. If the value of an
argument is outside the allowable range of values as defined by the invoked method, throw
ArgumentOutOfRangeException.

5.9.5      Events
Dobe prepared for arbitrary code executing in the event-handling method.Consider placing the code
where the event is raised in a try-catch block to prevent program termination due to unhandled
exceptions thrown from the event handlers.



Do not use events in performance sensitive APIs. While events are easier for many developers to
understand and use, they are less desirable than Virtual Members from a performance and memory
consumption perspective.




Confidential e-Zest Solutions Ltd.                                                                 Page 28 of 54
5.9.6      Member Overloading
Douse member overloading rather than defining members with default arguments. Default arguments
are not CLS-compliant and cannot be used from some languages.There is also a versioning issue in
members with default arguments.Imagine version 1 of a method that sets an optional parameter to 123.
When compiling code that calls this method without specifying the optional parameter, the compiler will
embed the default value (123) into the code at the call site. Now, if version 2 of the method changes the
optional parameter to 863, then, if the calling code is not recompiled, it will call version 2 of the method
passing in 123 (version 1’s default, not version 2’s default).



           Good:

           PublicOverloadsSub Rotate(ByVal data As Matrix)

                  Rotate(data, 180)

           EndSub



           PublicOverloadsSub Rotate(ByVal data As Matrix, ByVal degrees AsInteger)

           ' Do rotation here

           EndSub




           Bad:

           PublicSub Rotate(ByVal data As Matrix, OptionalByVal degrees AsInteger = 180)

           ' Do rotation here

           EndSub




Do not arbitrarily vary parameter names in overloads. If a parameter in one overload represents the
same input as a parameter in another overload, the parameters should have the same name.Parameters
with the same name should appear in the same position in all overloads.



Domake only the longest overload virtual (if extensibility is required). Shorter overloads should simply
call through to a longer overload.




Confidential e-Zest Solutions Ltd.                                                                 Page 29 of 54
5.9.7      Interface Members
You should not implement interface members explicitly without having a strong reason to do so.
Explicitly implemented members can be confusing to developers because they don’t appear in the list of
public members and they can also cause unnecessary boxing of value types.

You should implement interface members explicitly, if the members are intended to be called only
through the interface.

5.9.8      Virtual Members
Virtual members perform better than callbacks and events, but do not perform better than non-virtual
methods.

Do not make members virtual unless you have a good reason to do so and you are aware of all the
costs related to designing, testing, and maintaining virtual members.

You shouldprefer protected accessibility over public accessibility for virtual members. Public members
should provide extensibility (if required) by calling into a protected virtual member.

5.9.9      Static Classes
Douse static classes sparingly.Static classes should be used only as supporting classes for the object-
oriented core of the framework.

5.9.10 Abstract Classes
Do not define public or protected-internal constructors in abstract types.

Dodefine a protected or an internal constructor on abstract classes.

A protected constructor is more common and simply allows the base class to do its own initialization
when subtypes are created.

           publicabstractclassClaim

           {

           protected Claim()

                 {

                        ...

                 }

           }




An internal constructor can be used to limit concrete implementations of the abstract class to the
assembly defining the class.

Confidential e-Zest Solutions Ltd.                                                               Page 30 of 54
publicabstractclassClaim

           {

           internal Claim()

                 {

                        ...

                 }

           }


5.10 Namespaces
Namespace names should follow the standard pattern

<company name>.<product name>.<top level module/Folder>.<bottom level module/Folder>



5.11 Errors and Exceptions

5.11.1 Exception Throwing
Do report execution failures by throwing exceptions.Exceptions are the primary means of reporting
errors in frameworks. If a member cannot successfully do what it is designed to do, it should be
considered an execution failure and an exception should be thrown.Do not return error codes.

Dothrow the most specific (the most derived) exception that makes sense.For example, throw
ArgumentNullException and not its base type ArgumentException if a null argument is passed. Throwing
System.Exception as well as catching System.Exception are nearly always the wrong thing to do.

Do not use exceptions for the normal flow of control, if possible.Except for system failures and
operations with potential race conditions, you should write code that does not throw exceptions. For
example, you can check preconditions before calling a method that may fail and throw exceptions. For
example,

           // C# sample:

           if (collection != null && !collection.IsReadOnly)

           {

                 collection.Add(additionalNumber);

           }




           ' VB.NET sample:

           If ((Not collection IsNothing) And (Not collection.IsReadOnly)) Then

                 collection.Add(additionalNumber)

Confidential e-Zest Solutions Ltd.                                                           Page 31 of 54
EndIf

Do not throw exceptions from exception filter blocks. When an exception filter raises an exception,
the exception is caught by the CLR, and the filter returns false. This behavior is indistinguishable from
the filter executing and returning false explicitly and is therefore very difficult to debug.

           ' VB.NET sample

           ' This is bad design. The exception filter (When clause)

           ' may throw an exception when the InnerException property

           ' returns null

           Try

           ...

           Catch e As ArgumentException _

           When e.InnerException.Message.StartsWith("File")

           ...

           EndTry

Do not explicitly throw exceptions from finally blocks. Implicitly thrown exceptions resulting from
calling methods that throw are acceptable.

5.11.2 Exception Handling
You should notswallow errors by catching nonspecific exceptions, such as System.Exception,
System.SystemException, and so on in .NET code.Do catch only specific errors that the code knows how
to handle. You should catch a more specific exception, or re-throw the general exception as the last
statement in the catch block. There are cases when swallowing errors in applications is acceptable, but
such cases are rare.

Good:

           // C# sample:

           try

           {

                 ...

           }

           catch(System.NullReferenceException exc)

           {

                 ...



Confidential e-Zest Solutions Ltd.                                                                 Page 32 of 54
}

           catch(System.ArgumentOutOfRangeException exc)

           {

                 ...

           }

           catch(System.InvalidCastException exc)

           {

                 ...

           }

           ' VB.NET sample:

           Try

                 ...

           Catch exc As System.NullReferenceException

                 ...

           Catch exc As System.ArgumentOutOfRangeException

                 ...

           Catch exc As System.InvalidCastException

                 ...

           EndTry

Bad:

           // C# sample:

           try

           {

                 ...

           }

           catch (Exception ex)

           {

                 ...

           }




Confidential e-Zest Solutions Ltd.                           Page 33 of 54
' VB.NET sample:

           Try

                 ...

           Catch ex As Exception

                 ...

           EndTry

Doprefer using an empty throw when catching and re-throwing an exception. This is the best way to
preserve the exception call stack.

Good:

           // C# sample:

           try

           {

                 ... // Do some reading with the file

           }

           catch

           {

                 file.Position = position; // Unwind on failure

           throw; // Rethrow

           }



           ' VB.NET sample:

           Try

                 ...' Do some reading with the file

           Catch ex As Exception

                 file.Position = position ' Unwind on failure

           Throw ' Rethrow

           EndTry




Bad:



Confidential e-Zest Solutions Ltd.                                                          Page 34 of 54
// C# sample:

           try

           {

                 ... // Do some reading with the file

           }

           catch (Exception ex)

           {

                 file.Position = position; // Unwind on failure

           throw ex; // Rethrow

           }



           ' VB.NET sample:

           Try

                 ...' Do some reading with the file

           Catch ex As Exception

                 file.Position = position ' Unwind on failure

           Throw ex ' Rethrow

           EndTry


5.12 Resource Cleanup
Do not force garbage collections with GC.Collect.

5.12.1 Try-finally Block
Douse try-finally blocks for cleanup code andtry-catch blocks for error recovery code. Do not use
catch blocks for cleanup code.Usually, the cleanup logic rolls back resource (particularly, native
resource) allocations. For example,

           // C# sample:

           FileStream stream = null;

           try

           {

           stream = newFileStream(...);

                 ...



Confidential e-Zest Solutions Ltd.                                                             Page 35 of 54
}

           finally

           {

                 if (stream != null)

                 {

           stream.Close();

                 }

           }

           ' VB.NET sample:

           Dim stream As FileStream = Nothing

           Try

                 stream = New FileStream(...)

                 ...

           Catch ex As Exception

           If (stream IsNotNothing) Then

                        stream.Close()

           EndIf

           EndTry

C# and VB.NET provide the using statement that can be used instead of plain try-finally to clean up
objects implementing the IDisposable interface.

           // C# sample:

           using(FileStream stream = newFileStream(...))

           {

                 ...

           }



           ' VB.NET sample:

           Using stream AsNew FileStream(...)

                 ...

           EndUsing


Confidential e-Zest Solutions Ltd.                                                              Page 36 of 54
Many language constructs emit try-finally blocks automatically for you. Examples are C#/VB’s using
statement, C#’s lock statement, VB’s SyncLock statement, C#’s foreach statement, and VB’s For Each
statement.

5.12.2 Basic Dispose Pattern
The basic implementation of the pattern involves implementing the System.IDisposable interface and
declaring the Dispose(bool) method that implements all resource cleanup logic to be shared between
the Dispose method and the optional finalizer. Please note that this section does not discuss providing a
finalizer. Finalizable types are extensions to this basic pattern and are discussed in the next section. The
following example shows a simple implementation of the basic pattern:



           // C# sample:

           publicclassDisposableResourceHolder : IDisposable

           {

                 private bool disposed = false;

           privateSafeHandle resource; // Handle to a resource



           public DisposableResourceHolder()

                 {

           this.resource = ... // Allocates the native resource

                 }



           publicvoid DoSomething()

                 {

           if (disposed)

                        {

           thrownewObjectDisposedException(...);

                        }



           // Now call some native methods using the resource

                        ...

                 }



Confidential e-Zest Solutions Ltd.                                                                 Page 37 of 54
publicvoid Dispose()

                 {

                        Dispose(true);

           GC.SuppressFinalize(this);

                 }



           protectedvirtualvoid Dispose(bool disposing)

                 {

           // Protect from being called multiple times.

           if (disposed)

           {

           return;

                        }



           if (disposing)

                        {

           // Clean up all managed resources.

           if (resource != null)

                              {

                                     resource.Dispose();

                              }

                        }



           disposed = true;

                 }

           }

           ' VB.NET sample:

           PublicClass DisposableResourceHolder

           Implements IDisposable


Confidential e-Zest Solutions Ltd.                         Page 38 of 54
Private disposed AsBoolean = False

           Private resource As SafeHandle ' Handle to a resource



           PublicSubNew()

                        resource = ... ' Allocates the native resource

           EndSub



           PublicSub DoSomething()

           If (disposed) Then

           ThrowNew ObjectDisposedException(...)

           EndIf



           ' Now call some native methods using the resource

                        ...

           EndSub



           PublicSub Dispose() Implements IDisposable.Dispose

                        Dispose(True)

                        GC.SuppressFinalize(Me)

           EndSub



           ProtectedOverridableSub Dispose(ByVal disposing AsBoolean)

           ' Protect from being called multiple times.

           If disposed Then

           Return

           EndIf



           If disposing Then

           ' Clean up all managed resources.


Confidential e-Zest Solutions Ltd.                                       Page 39 of 54
If (resource IsNotNothing) Then

                                     resource.Dispose()

           EndIf

           EndIf



                        disposed = True

           EndSub



           EndClass

Doimplement the Basic Dispose Pattern on types containing instances of disposable types.

Doextend the Basic Dispose Pattern to provide a finalizer on types holding resources that need to be
freed explicitly and that do not have finalizers.For example, the pattern should be implemented on types
storing unmanaged memory buffers.

You should implement the Basic Dispose Pattern on classes that themselves don’t hold unmanaged
resources or disposable objects but are likely to have subtypes that do.A great example of this is the
System.IO.Stream class. Although it is an abstract base class that doesn’t hold any resources, most of its
subclasses do and because of this, it implements this pattern.

Do declare a protected virtual void Dispose(bool disposing) method to centralize all logic related to
releasing unmanaged resources.All resource cleanup should occur in this method. The method is called
from both the finalizer and the IDisposable.Dispose method.The parameter will be false if being invoked
from inside a finalizer. It should be used to ensure any code running during finalization is not accessing
other finalizable objects.Details of implementing finalizers are described in the next section.

           // C# sample:

           protectedvirtualvoid Dispose(bool disposing)

           {

           // Protect from being called multiple times.

           if (disposed)

           {

           return;

                   }



           if (disposing)


Confidential e-Zest Solutions Ltd.                                                                Page 40 of 54
{

           // Clean up all managed resources.

           if (resource != null)

                         {

                                resource.Dispose();

                         }

                   }



           disposed = true;

           }

           ' VB.NET sample:

           ProtectedOverridableSub Dispose(ByVal disposing AsBoolean)

           ' Protect from being called multiple times.

                 If disposed Then

                        Return

           EndIf



           If disposing Then

           ' Clean up all managed resources.

           If (resource IsNotNothing) Then

                              resource.Dispose()

           EndIf

           EndIf



                 disposed = True

           EndSub




Do implement the IDisposable interface by simply calling Dispose(true) followed by
GC.SuppressFinalize(this).The call to SuppressFinalize should only occur if Dispose(true) executes
successfully.


Confidential e-Zest Solutions Ltd.                                                               Page 41 of 54
// C# sample:

           publicvoid Dispose()

           {

                 Dispose(true);

           GC.SuppressFinalize(this);

           }



           ' VB.NET sample:

           PublicSub Dispose() Implements IDisposable.Dispose

                 Dispose(True)

                 GC.SuppressFinalize(Me)

           EndSub

Do not make the parameterless Dispose method virtual.The Dispose(bool) method is the one that
should be overridden by subclasses.

You should not throw an exception from within Dispose(bool) except under critical situations where
the containing process has been corrupted (leaks, inconsistent shared state, etc.).Users expect that a
call to Dispose would not raise an exception.For example, consider the manual try-finally in this C#
snippet:

           TextReader tr = newStreamReader(File.OpenRead("foo.txt"));

           try

           {

           // Do some stuff

           }

           finally

           {

                 tr.Dispose();

           // More stuff

           }

If Dispose could raise an exception, further finally block cleanup logic will not execute. To work around
this, the user would need to wrap every call to Dispose (within their finally block!) in a try block, which

Confidential e-Zest Solutions Ltd.                                                                  Page 42 of 54
leads to very complex cleanup handlers. If executing a Dispose(bool disposing) method, never throw an
exception if disposing is false. Doing so will terminate the process if executing inside a finalizer context.

Dothrow an ObjectDisposedException from any member that cannot be used after the object has
been disposed.

           // C# sample:

           publicclassDisposableResourceHolder : IDisposable

           {

           private bool disposed = false;

           private SafeHandle resource; // Handle to a resource



           publicvoid DoSomething()

                 {

           if (disposed)

           {

           thrownewObjectDisposedException(...);

           }



           // Now call some native methods using the resource

                        ...

                 }



           protectedvirtualvoid Dispose(bool disposing)

                 {

           if (disposed)

           {

                              return;

           }



           // Cleanup

                        ...


Confidential e-Zest Solutions Ltd.                                                                   Page 43 of 54
disposed = true;

                 }

           }

           ' VB.NET sample:

           PublicClass DisposableResourceHolder

           Implements IDisposable



           Private disposed AsBoolean = False

           Private resource As SafeHandle ' Handle to a resource



           PublicSub DoSomething()

           If (disposed) Then

           ThrowNew ObjectDisposedException(...)

           EndIf



           ' Now call some native methods using the resource

                        ...

           EndSub



           ProtectedOverridableSub Dispose(ByVal disposing AsBoolean)

           ' Protect from being called multiple times.

           If disposed Then

           Return

           EndIf



           ' Cleanup

                        ...



                        disposed = True


Confidential e-Zest Solutions Ltd.                                      Page 44 of 54
EndSub



           EndClass

5.12.3 Finalizable Types
Finalizable types are types that extend the Basic Dispose Pattern by overriding the finalizer and
providing finalization code path in the Dispose(bool) method.The following code shows an example of a
finalizable type:

           // C# sample:

           publicclassComplexResourceHolder : IDisposable

           {

                 bool disposed = false;

           privateIntPtr buffer; // Unmanaged memory buffer

           privateSafeHandle resource; // Disposable handle to a resource



           public ComplexResourceHolder()

                 {

           this.buffer = ... // Allocates memory

           this.resource = ... // Allocates the resource

                 }



           publicvoid DoSomething()

                 {

           if (disposed)

                        {

           thrownewObjectDisposedException(...);

                        }



           // Now call some native methods using the resource

                        ...

                 }



Confidential e-Zest Solutions Ltd.                                                           Page 45 of 54
~ComplexResourceHolder()

                 {

                        Dispose(false);

                 }



           publicvoid Dispose()

                 {

                        Dispose(true);

           GC.SuppressFinalize(this);

                 }



           protectedvirtualvoid Dispose(bool disposing)

                 {

           // Protect from being called multiple times.

           if (disposed)

                        {

                              return;

                        }



           if (disposing)

                        {

           // Clean up all managed resources.

           if (resource != null)

                                {

                                     resource.Dispose();

                                }

                        }



           // Clean up all native resources.


Confidential e-Zest Solutions Ltd.                         Page 46 of 54
ReleaseBuffer(buffer);



           disposed = true;

                 }

           }

           ' VB.NET sample:

           PublicClass DisposableResourceHolder

           Implements IDisposable



           Private disposed AsBoolean = False

           Private buffer As IntPtr ' Unmanaged memory buffer

           Private resource As SafeHandle ' Handle to a resource



           PublicSubNew()

                        buffer = ... ' Allocates memory

                        resource = ... ' Allocates the native resource

           EndSub



           PublicSub DoSomething()

           If (disposed) Then

           ThrowNew ObjectDisposedException(...)

           EndIf



           ' Now call some native methods using the resource

                        ...

           EndSub



           ProtectedOverridesSub Finalize()

                        Dispose(False)

           MyBase.Finalize()


Confidential e-Zest Solutions Ltd.                                       Page 47 of 54
EndSub



           PublicSub Dispose() Implements IDisposable.Dispose

                        Dispose(True)

                        GC.SuppressFinalize(Me)

           EndSub



           ProtectedOverridableSub Dispose(ByVal disposing AsBoolean)

           ' Protect from being called multiple times.

           If disposed Then

           Return

           EndIf



           If disposing Then

           ' Clean up all managed resources.

           If (resource IsNotNothing) Then

                                     resource.Dispose()

           EndIf

           EndIf



           ' Clean up all native resources.

                        ReleaseBuffer(Buffer)



                        disposed = True

           EndSub



           EndClass




Confidential e-Zest Solutions Ltd.                                      Page 48 of 54
Domake a type finalizable, if the type is responsible for releasing an unmanaged resource that does
not have its own finalizer.When implementing the finalizer, simply call Dispose(false) and place all
resource cleanup logic inside the Dispose(bool disposing) method.



           // C# sample:

           publicclassComplexResourceHolder : IDisposable

           {

                 ...

                 ~ComplexResourceHolder()

                 {

                        Dispose(false);

                 }



           protectedvirtualvoid Dispose(bool disposing)

                 {

                        ...

                 }

           }



           ' VB.NET sample:

           PublicClass DisposableResourceHolder

           Implements IDisposable



           ...

           ProtectedOverridesSub Finalize()

                        Dispose(False)

           MyBase.Finalize()

           EndSub



           ProtectedOverridableSub Dispose(ByVal disposing AsBoolean)


Confidential e-Zest Solutions Ltd.                                                            Page 49 of 54
...

           EndSub



           EndClass




Dobe very careful to make type finalizable.Carefully consider any case in which you think a finalizer is
needed. There is a real cost associated with instances with finalizers, from both a performance and code
complexity standpoint.

Doimplement the Basic Dispose Pattern on every finalizable type. See the previous section for details
on the basic pattern.This gives users of the type a means to explicitly perform deterministic cleanup of
those same resources for which the finalizer is responsible.

You shouldcreate and use a critical finalizable object (a type with a type hierarchy that contains
CriticalFinalizerObject) for situations in which a finalizer absolutely must execute even in the face of
forced application domain unloads and thread aborts.

Doprefer resource wrappers based on SafeHandle or SafeHandleZeroOrMinusOneIsInvalid (for Win32
resource handle whose value of either 0 or -1 indicates an invalid handle) to writing finalizer by yourself
to encapsulate unmanaged resources where possible, in which case a finalizer becomes unnecessary
because the wrapper is responsible for its own resource cleanup.Safe handles implement the
IDisposable interface, and inherit from CriticalFinalizerObject so the finalizer logic will absolutely
execute even in the face of forced application domain unloads and thread aborts.

           ///<summary>

           /// Represents a wrapper class for a pipe handle.

           ///</summary>

           [SecurityCritical(SecurityCriticalScope.Everything),

           HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true),

           SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]

           internalsealedclassSafePipeHandle : SafeHandleZeroOrMinusOneIsInvalid

           {

           private SafePipeHandle()

                        : base(true)

                 {

                 }



Confidential e-Zest Solutions Ltd.                                                                  Page 50 of 54
public SafePipeHandle(IntPtr preexistingHandle, bool ownsHandle)

                        : base(ownsHandle)

                 {

           base.SetHandle(preexistingHandle);

                 }



                 [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success),

           DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]

                 [return: MarshalAs(UnmanagedType.Bool)]

           privatestaticexternbool CloseHandle(IntPtr handle);



           protectedoverridebool ReleaseHandle()

                 {

           return CloseHandle(base.handle);

                 }

           }



           ///<summary>

           /// Represents a wrapper class for a local memory pointer.

           ///</summary>

           [SuppressUnmanagedCodeSecurity,

           HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]

           internalsealedclassSafeLocalMemHandle : SafeHandleZeroOrMinusOneIsInvalid

           {

           public SafeLocalMemHandle()

                        : base(true)

                 {

                 }




Confidential e-Zest Solutions Ltd.                                                     Page 51 of 54
public SafeLocalMemHandle(IntPtr preexistingHandle, bool ownsHandle)

                        : base(ownsHandle)

                 {

           base.SetHandle(preexistingHandle);

                 }



                 [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success),

           DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]

           privatestaticexternIntPtr LocalFree(IntPtr hMem);



           protectedoverridebool ReleaseHandle()

                 {

           return (LocalFree(base.handle) == IntPtr.Zero);

                 }

           }

Do not access any finalizable objects in the finalizer code path, as there is significant risk that they will
have already been finalized. For example, a finalizable object A that has a reference to another
finalizable object B cannot reliably use B in A’s finalizer, or vice versa. Finalizers are called in a random
order (short of a weak ordering guarantee for critical finalization).

It is OK to touch unboxed value type fields.

Also, be aware that objects stored in static variables will get collected at certain points during an
application domain unload or while exiting the process. Accessing a static variable that refers to a
finalizable object (or calling a static method that might use values stored in static variables) might not be
safe if Environment.HasShutdownStarted returns true.


Do not let exceptions escape from the finalizer logic, except for system-critical failures.If an exception
is thrown from a finalizer, the CLR may shut down the entire process preventing other finalizers from
executing and resources from being released in a controlled manner.

5.12.4 Overriding Dispose
If you're inheriting from a base class that implements IDisposable, you mustimplement IDisposable also.
Always call your base class's Dispose(bool) so itcleans up.



Confidential e-Zest Solutions Ltd.                                                                   Page 52 of 54
publicclassDisposableBase : IDisposable

           {

                 ~DisposableBase()

                 {

                        Dispose(false);

                 }



           publicvoid Dispose()

                 {

                        Dispose(true);

                        GC.SuppressFinalize(this);

                 }



           protectedvirtualvoid Dispose(bool disposing)

                 {

           // ...

                 }

           }



           publicclassDisposableSubclass : DisposableBase

           {

           protectedoverridevoid Dispose(bool disposing)

                 {

           try

                        {

           if (disposing)

                              {

           // Clean up managed resources.

                              }




Confidential e-Zest Solutions Ltd.                          Page 53 of 54
// Clean up native resources.

                        }

           finally

                        {

           base.Dispose(disposing);

                        }

                 }

           }




Confidential e-Zest Solutions Ltd.         Page 54 of 54

Contenu connexe

En vedette

Jump Start To Ooad And Design Patterns
Jump Start To Ooad And Design PatternsJump Start To Ooad And Design Patterns
Jump Start To Ooad And Design PatternsLalit Kale
 
Denizimizdeki Baliklar
Denizimizdeki BaliklarDenizimizdeki Baliklar
Denizimizdeki BaliklarAhmet Kutay
 
Model Driven Architectures
Model Driven ArchitecturesModel Driven Architectures
Model Driven ArchitecturesLalit Kale
 
Versioning guidelines for product
Versioning guidelines for productVersioning guidelines for product
Versioning guidelines for productLalit Kale
 
Implementing application security using the .net framework
Implementing application security using the .net frameworkImplementing application security using the .net framework
Implementing application security using the .net frameworkLalit Kale
 
Sales And Marketing Recruitmen and Selection Plan
Sales And Marketing Recruitmen and Selection PlanSales And Marketing Recruitmen and Selection Plan
Sales And Marketing Recruitmen and Selection Plannilesat
 
Code review guidelines
Code review guidelinesCode review guidelines
Code review guidelinesLalit Kale
 
How To Create Strategic Marketing Plan
How To Create Strategic Marketing PlanHow To Create Strategic Marketing Plan
How To Create Strategic Marketing PlanLalit Kale
 

En vedette (18)

Safe netizens
Safe netizensSafe netizens
Safe netizens
 
Arte NeocláSica
Arte NeocláSicaArte NeocláSica
Arte NeocláSica
 
Jump Start To Ooad And Design Patterns
Jump Start To Ooad And Design PatternsJump Start To Ooad And Design Patterns
Jump Start To Ooad And Design Patterns
 
Sector Servizos
Sector ServizosSector Servizos
Sector Servizos
 
O Relevo PeníNsular
O Relevo PeníNsularO Relevo PeníNsular
O Relevo PeníNsular
 
Romanticismo E Realismo
Romanticismo E RealismoRomanticismo E Realismo
Romanticismo E Realismo
 
Denizimizdeki Baliklar
Denizimizdeki BaliklarDenizimizdeki Baliklar
Denizimizdeki Baliklar
 
Arte Paleocristiá
Arte PaleocristiáArte Paleocristiá
Arte Paleocristiá
 
Model Driven Architectures
Model Driven ArchitecturesModel Driven Architectures
Model Driven Architectures
 
Risks With OpenID
Risks With OpenIDRisks With OpenID
Risks With OpenID
 
Cyber Safe Parenting
Cyber Safe ParentingCyber Safe Parenting
Cyber Safe Parenting
 
Barajlar002
Barajlar002Barajlar002
Barajlar002
 
Versioning guidelines for product
Versioning guidelines for productVersioning guidelines for product
Versioning guidelines for product
 
Quattrocento
QuattrocentoQuattrocento
Quattrocento
 
Implementing application security using the .net framework
Implementing application security using the .net frameworkImplementing application security using the .net framework
Implementing application security using the .net framework
 
Sales And Marketing Recruitmen and Selection Plan
Sales And Marketing Recruitmen and Selection PlanSales And Marketing Recruitmen and Selection Plan
Sales And Marketing Recruitmen and Selection Plan
 
Code review guidelines
Code review guidelinesCode review guidelines
Code review guidelines
 
How To Create Strategic Marketing Plan
How To Create Strategic Marketing PlanHow To Create Strategic Marketing Plan
How To Create Strategic Marketing Plan
 

Similaire à Coding guidelines

Selenium documentation,
Selenium documentation,Selenium documentation,
Selenium documentation,t7t7uyt
 
Ibm tivoli monitoring for network performance v2.1 the mainframe network mana...
Ibm tivoli monitoring for network performance v2.1 the mainframe network mana...Ibm tivoli monitoring for network performance v2.1 the mainframe network mana...
Ibm tivoli monitoring for network performance v2.1 the mainframe network mana...Banking at Ho Chi Minh city
 
Matlab tutorial by manish myst, ssgbcoet
Matlab tutorial by manish myst, ssgbcoetMatlab tutorial by manish myst, ssgbcoet
Matlab tutorial by manish myst, ssgbcoetManish Myst
 
Newfies-Dialer : Autodialer software - Documentation version 1.1.0
Newfies-Dialer : Autodialer software - Documentation version 1.1.0Newfies-Dialer : Autodialer software - Documentation version 1.1.0
Newfies-Dialer : Autodialer software - Documentation version 1.1.0Areski Belaid
 
A Cloud Decision making Framework
A Cloud Decision making FrameworkA Cloud Decision making Framework
A Cloud Decision making FrameworkAndy Marshall
 
Network Tutorial
Network TutorialNetwork Tutorial
Network Tutorialalalieli
 
Managing storage management tivoli enterprise integration with tivoli storage...
Managing storage management tivoli enterprise integration with tivoli storage...Managing storage management tivoli enterprise integration with tivoli storage...
Managing storage management tivoli enterprise integration with tivoli storage...Banking at Ho Chi Minh city
 
Ibm tivoli business service manager v4.1 redp4288
Ibm tivoli business service manager v4.1 redp4288Ibm tivoli business service manager v4.1 redp4288
Ibm tivoli business service manager v4.1 redp4288Banking at Ho Chi Minh city
 
Deployment guide series ibm tivoli composite application manager for web reso...
Deployment guide series ibm tivoli composite application manager for web reso...Deployment guide series ibm tivoli composite application manager for web reso...
Deployment guide series ibm tivoli composite application manager for web reso...Banking at Ho Chi Minh city
 
Deployment guide series ibm tivoli composite application manager for web reso...
Deployment guide series ibm tivoli composite application manager for web reso...Deployment guide series ibm tivoli composite application manager for web reso...
Deployment guide series ibm tivoli composite application manager for web reso...Banking at Ho Chi Minh city
 
Sqlmap readme
Sqlmap readmeSqlmap readme
Sqlmap readmefangjiafu
 
PyML - a Python Machine Learning package
PyML - a Python Machine Learning packagePyML - a Python Machine Learning package
PyML - a Python Machine Learning packagebutest
 
An introduction to tivoli net view for os 390 v1r2 sg245224
An introduction to tivoli net view for os 390 v1r2 sg245224An introduction to tivoli net view for os 390 v1r2 sg245224
An introduction to tivoli net view for os 390 v1r2 sg245224Banking at Ho Chi Minh city
 
Learn Makefiles With the tastiest examples
Learn Makefiles With the tastiest examplesLearn Makefiles With the tastiest examples
Learn Makefiles With the tastiest examplesAhmed Abdelazeem
 

Similaire à Coding guidelines (20)

Network Programming
Network ProgrammingNetwork Programming
Network Programming
 
Flask docs
Flask docsFlask docs
Flask docs
 
Map server 5.4.2
Map server 5.4.2Map server 5.4.2
Map server 5.4.2
 
Rapidminer 4.4-tutorial
Rapidminer 4.4-tutorialRapidminer 4.4-tutorial
Rapidminer 4.4-tutorial
 
Selenium documentation,
Selenium documentation,Selenium documentation,
Selenium documentation,
 
Ibm tivoli monitoring for network performance v2.1 the mainframe network mana...
Ibm tivoli monitoring for network performance v2.1 the mainframe network mana...Ibm tivoli monitoring for network performance v2.1 the mainframe network mana...
Ibm tivoli monitoring for network performance v2.1 the mainframe network mana...
 
Matlab tutorial by manish myst, ssgbcoet
Matlab tutorial by manish myst, ssgbcoetMatlab tutorial by manish myst, ssgbcoet
Matlab tutorial by manish myst, ssgbcoet
 
VB.NET 編碼準則
VB.NET 編碼準則VB.NET 編碼準則
VB.NET 編碼準則
 
Oop c++ tutorial
Oop c++ tutorialOop c++ tutorial
Oop c++ tutorial
 
Newfies-Dialer : Autodialer software - Documentation version 1.1.0
Newfies-Dialer : Autodialer software - Documentation version 1.1.0Newfies-Dialer : Autodialer software - Documentation version 1.1.0
Newfies-Dialer : Autodialer software - Documentation version 1.1.0
 
A Cloud Decision making Framework
A Cloud Decision making FrameworkA Cloud Decision making Framework
A Cloud Decision making Framework
 
Network Tutorial
Network TutorialNetwork Tutorial
Network Tutorial
 
Managing storage management tivoli enterprise integration with tivoli storage...
Managing storage management tivoli enterprise integration with tivoli storage...Managing storage management tivoli enterprise integration with tivoli storage...
Managing storage management tivoli enterprise integration with tivoli storage...
 
Ibm tivoli business service manager v4.1 redp4288
Ibm tivoli business service manager v4.1 redp4288Ibm tivoli business service manager v4.1 redp4288
Ibm tivoli business service manager v4.1 redp4288
 
Deployment guide series ibm tivoli composite application manager for web reso...
Deployment guide series ibm tivoli composite application manager for web reso...Deployment guide series ibm tivoli composite application manager for web reso...
Deployment guide series ibm tivoli composite application manager for web reso...
 
Deployment guide series ibm tivoli composite application manager for web reso...
Deployment guide series ibm tivoli composite application manager for web reso...Deployment guide series ibm tivoli composite application manager for web reso...
Deployment guide series ibm tivoli composite application manager for web reso...
 
Sqlmap readme
Sqlmap readmeSqlmap readme
Sqlmap readme
 
PyML - a Python Machine Learning package
PyML - a Python Machine Learning packagePyML - a Python Machine Learning package
PyML - a Python Machine Learning package
 
An introduction to tivoli net view for os 390 v1r2 sg245224
An introduction to tivoli net view for os 390 v1r2 sg245224An introduction to tivoli net view for os 390 v1r2 sg245224
An introduction to tivoli net view for os 390 v1r2 sg245224
 
Learn Makefiles With the tastiest examples
Learn Makefiles With the tastiest examplesLearn Makefiles With the tastiest examples
Learn Makefiles With the tastiest examples
 

Plus de Lalit Kale

Serverless microservices
Serverless microservicesServerless microservices
Serverless microservicesLalit Kale
 
Develop in ludicrous mode with azure serverless
Develop in ludicrous mode with azure serverlessDevelop in ludicrous mode with azure serverless
Develop in ludicrous mode with azure serverlessLalit Kale
 
For Business's Sake, Let's focus on AppSec
For Business's Sake, Let's focus on AppSecFor Business's Sake, Let's focus on AppSec
For Business's Sake, Let's focus on AppSecLalit Kale
 
Introduction To Microservices
Introduction To MicroservicesIntroduction To Microservices
Introduction To MicroservicesLalit Kale
 
Dot net platform and dotnet core fundamentals
Dot net platform and dotnet core fundamentalsDot net platform and dotnet core fundamentals
Dot net platform and dotnet core fundamentalsLalit Kale
 
Code refactoring
Code refactoringCode refactoring
Code refactoringLalit Kale
 
Application Security Tools
Application Security ToolsApplication Security Tools
Application Security ToolsLalit Kale
 
Threat Modeling And Analysis
Threat Modeling And AnalysisThreat Modeling And Analysis
Threat Modeling And AnalysisLalit Kale
 
Application Security-Understanding The Horizon
Application Security-Understanding The HorizonApplication Security-Understanding The Horizon
Application Security-Understanding The HorizonLalit Kale
 
State management
State managementState management
State managementLalit Kale
 
Data normailazation
Data normailazationData normailazation
Data normailazationLalit Kale
 
Bowling Game Kata by Robert C. Martin
Bowling Game Kata by Robert C. MartinBowling Game Kata by Robert C. Martin
Bowling Game Kata by Robert C. MartinLalit Kale
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven DesignLalit Kale
 
Web 2.0 concept
Web 2.0 conceptWeb 2.0 concept
Web 2.0 conceptLalit Kale
 

Plus de Lalit Kale (15)

Serverless microservices
Serverless microservicesServerless microservices
Serverless microservices
 
Develop in ludicrous mode with azure serverless
Develop in ludicrous mode with azure serverlessDevelop in ludicrous mode with azure serverless
Develop in ludicrous mode with azure serverless
 
For Business's Sake, Let's focus on AppSec
For Business's Sake, Let's focus on AppSecFor Business's Sake, Let's focus on AppSec
For Business's Sake, Let's focus on AppSec
 
Introduction To Microservices
Introduction To MicroservicesIntroduction To Microservices
Introduction To Microservices
 
Dot net platform and dotnet core fundamentals
Dot net platform and dotnet core fundamentalsDot net platform and dotnet core fundamentals
Dot net platform and dotnet core fundamentals
 
Code refactoring
Code refactoringCode refactoring
Code refactoring
 
Application Security Tools
Application Security ToolsApplication Security Tools
Application Security Tools
 
Threat Modeling And Analysis
Threat Modeling And AnalysisThreat Modeling And Analysis
Threat Modeling And Analysis
 
Application Security-Understanding The Horizon
Application Security-Understanding The HorizonApplication Security-Understanding The Horizon
Application Security-Understanding The Horizon
 
State management
State managementState management
State management
 
Data normailazation
Data normailazationData normailazation
Data normailazation
 
Opps
OppsOpps
Opps
 
Bowling Game Kata by Robert C. Martin
Bowling Game Kata by Robert C. MartinBowling Game Kata by Robert C. Martin
Bowling Game Kata by Robert C. Martin
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Web 2.0 concept
Web 2.0 conceptWeb 2.0 concept
Web 2.0 concept
 

Dernier

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 

Dernier (20)

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 

Coding guidelines

  • 1. Microsoft .NET Coding Guidelines and Best Practices Confidential e-Zest Solutions Ltd. Page 1 of 54
  • 2. Version and History Version Date Author Reviewed By Comments 1.0 23-May-2012 Lalit Kale Draft Confidential e-Zest Solutions Ltd. Page 2 of 54
  • 3. Table of Contents 1 Overview ................................................................................................................................. 5 2 Principles and Themes .............................................................................................................. 5 3 How to follow the standards across the team ........................................................................... 6 4 General Coding Standards ........................................................................................................ 7 4.1 Clarity and Consistency ...............................................................................................................................7 4.2 Formatting and Style...................................................................................................................................8 4.3 Using Libraries.............................................................................................................................................9 4.4 Variable Declarations and Initalizations .....................................................................................................9 4.5 Function Declarations and Calls ................................................................................................................11 4.6 Enums........................................................................................................................................................12 4.7 Comments .................................................................................................................................................14 4.7.1 Inline Code Comments 16 5 .NET Coding Standards ........................................................................................................... 19 5.1 Design Guidelines for Developing Class Libraries .....................................................................................19 5.2 Files and Structure ....................................................................................................................................19 5.3 Assembly Properties .................................................................................................................................19 5.4 Naming Convensions.................................................................................................................................19 5.4.1 General Naming Conventions 19 5.4.2 Capitalization Naming Rules for Identifiers 19 5.4.3 Hungarian Notation 21 5.4.4 UI Control NamingConventions 21 5.5 Constants ..................................................................................................................................................22 5.6 Strings .......................................................................................................................................................22 5.7 Arrays and Collections ..............................................................................................................................24 5.8 Structures ..................................................................................................................................................26 5.8.1 Structures vs. Classes 27 5.9 Classes .......................................................................................................................................................27 5.9.1 Fields 27 5.9.2 Properties 27 5.9.3 Constructors 28 5.9.4 Methods 28 5.9.5 Events 28 5.9.6 Member Overloading 29 5.9.7 Interface Members 30 5.9.8 Virtual Members 30 5.9.9 Static Classes 30 Confidential e-Zest Solutions Ltd. Page 3 of 54
  • 4. 5.9.10 Abstract Classes 30 5.10 Namespaces ..............................................................................................................................................31 5.11 Errors and Exceptions ...............................................................................................................................31 5.11.1 Exception Throwing 31 5.11.2 Exception Handling 32 5.12 Resource Cleanup .....................................................................................................................................35 5.12.1 Try-finally Block 35 5.12.2 Basic Dispose Pattern 37 5.12.3 Finalizable Types 45 5.12.4 Overriding Dispose 52 Confidential e-Zest Solutions Ltd. Page 4 of 54
  • 5. 1 Overview This document defines .NETcoding guidelines for the e-Zest project teams. This standard derives from the experience of project and product development efforts and is continuously evolving. If you discover a new best practice or a topic that is not covered, please bring that to the attention of the Architect Group and have the conclusion added to this document. No set of guidelines will satisfy everyone. The goal of a standard is to create efficiencies across all of the developers. Applying a set of well-defined coding standards will result in code with fewer bugs, and better maintainability.Adopting an unfamiliar standard may be awkward initially, but the pain fades quickly and the benefits are quickly realized, especially when you inherit ownership of others' code. 2 Principles and Themes High-quality code exhibits the following characteristics: 1. Understandable.Code must be clearly readable and straightforward. Code must showcase the key things it isdesigned and implemented for. The relevant parts of entire project/Solution code should be easy to reuse. Projects/Solution should not contain unnecessary code. Projects/Solutionsmust include appropriate documentation. 2. Correct.Projects/Solutions must demonstrateproperly how to perform the key things they are designed to do. Projects/Solutions must compile cleanly, run correctly as documented, and be tested. 3. Consistent.Projects/Solutions should follow consistent coding style and layout to make the code easier to read. Likewise, Projects/Solutions should be consistent with each other to make them easier to use together. Consistency shows craftsmanship and attention to detail. 4. Safe. Projects/Solutions must comply with legal, privacy, and policy standards. They must not demonstrate hacks or poor programming practices. 5. Secure.Projects/Solutions should demonstrate how to use secure programming practices such as least privilege, secure versions of runtime library functions, and SDL-recommended project settings. 6. Reliable 7. Maintainable 8. Efficient The proper use of programming practices, design, and language features determines how well Projects/Solutions can achieve these. This code standard is designed to help you create Projects/Solutions that serve as “best practices” for customers to emulate. Confidential e-Zest Solutions Ltd. Page 5 of 54
  • 6. 3 How to follow the standards across the team If you have a team of different skills and tastes, you are going to have a tough time convincing everyone to follow the same standards. The best approach is to have a team meeting and developing your own standards document. You may use this document as a template to prepare your own document. Distribute a copy of this document (or your project’s tailored coding guidelines document) well ahead of the coding standards meeting. All members should come to the meeting prepared to discuss pros and cons of the various points in the document. Make sure you have a technical manager present in the meeting to resolve conflicts. Discuss all points in the document. Everyone may have a different opinion about each point, but at the end of the discussion, all members must agree upon the standard you are going to follow. Prepare a new standards/guidelines document with appropriate changes based on the suggestions from all of the team members. Print copies of it and post it in all workstations. After you start the development, you must schedule code review meetings to ensure that everyone is following the rules. 3 types of code reviews are recommended: 1.Peer review – another team member review the code to ensure that the code follows the coding standards and meets requirements. This level of review can include some unit testing also. Every file in the project must go through this process. 2.Architect review – the architect of the team must review the core modules of the project to ensure that they adhere to the design and there are no “big” mistakes that can affect the project in the long run. 3.Group review – randomly select one or more files and conduct a group review once in a week. Distribute a printed copy of the files to all team members 30 minutes before the meeting. Let them read and come up with points for discussion. In the group review meeting, use a projector to display the file content in the screen. Go through every sections of the code and let every member give their suggestions on how could that piece of code can be written in a better way. (Don’t forget to appreciate the developer for the good work and also make sure he does not get offended by the “group attack”!) Confidential e-Zest Solutions Ltd. Page 6 of 54
  • 7. 4 General Coding Standards These general coding standards can be applied to all languages - they provide high-level guidance to the style, formatting and structure of your source code. 4.1 Clarity and Consistency Do ensure that clarity, readability and transparency are paramount. These coding standards strive to ensure that the resultant code is easy to understand and maintain, but nothing beats fundamentally clear, concise, self-documenting code.Do ensure that when applying these coding standards that they are applied consistently. 1. File name should match with class name. For example, for the class HelloWorld, the file name should be helloworld.cs (or, helloworld.vb) 2. Use Pascal Case for file names. 3. Do not hardcode numbers. Use constants instead. Declare constant in the top of the file and use it in your code.However, for application level variables, using constants are also not recommended. You should use the constants in the config file or database so that you can change it later. Declare them as constants only if you are sure this value will never need to be changed. 4. Do not hardcode strings. Use resource files. 5. Never assume that your code will run from drive "C:". You may never know, some users may run it from network or from a "Z:”. 6. Do not have more than one class in a single file. 7. Avoid having very large files. If a single file has more than 1000 lines of code, it is a good candidate for refactoring. Split them logically into two or more classes. 8. Avoid passing too many parameters to a method. If you have more than 4~5 parameters, it is a good candidate to define a class or structure. 9. Use the AssemblyInfo file to fill information like version number, description, company name, copyright notice etc. 10. Logically organize all your files within appropriate folders. Use 2 level folder hierarchies. You can have up to 10 folders in the root folder and each folder can have up to 5 sub folders. If you have too many folders than cannot be accommodated with the above mentioned 2 level hierarchy, you may need re factoring into multiple assemblies. 11. Make sure you have a good logging class which can be configured to log errors, warning or traces. If you configure to log errors, it should only log errors. But if you configure to log traces, it should record all (errors, warnings and trace). Your log class should be written such a way that Confidential e-Zest Solutions Ltd. Page 7 of 54
  • 8. in future you can change it easily to log to Windows Event Log, SQL Server, or Email to administrator or to a File etc without any change in any other part of the application. Use the log class extensively throughout the code to record errors, warning and even trace messages that can help you trouble shoot a problem. 12. If you are opening database connections, sockets, file stream etc, always close them in the finally block. This will ensure that even if an exception occurs after opening the connection, it will be safely closed in the finally block. 13. Declare variables as close as possible to where it is first used. Use one variable declaration per line. 14. Use StringBuilder class instead of String when you have to manipulate string objects in a loop. The String object works in weird way in .NET. Each time you append a string, it is actually discarding the old string object and recreating a new object, which is a relatively expensive operations. 4.2 Formatting and Style Do not use tabs. It's generally accepted across Microsoft that tabs shouldn't be used in source files - different text editors use different spacing to render tabs, and this causes formatting confusion. All code should be written using four spaces for indentation. Visual Studio text editor can be configured to insert spaces for tabs. Confidential e-Zest Solutions Ltd. Page 8 of 54
  • 9. You should limit the length of lines of code. Having overly long lines inhibits the readability of code. Break the code line when the line length is greater than column 78 for readability. If column 78 looks too narrow, use column 86 or 90. Douse a fixed-width font, typically Courier New, in your code editor. 4.3 Using Libraries Do notreference unnecessary libraries, include unnecessary header files, or reference unnecessary assemblies. Paying attention to small things like this can improve build times, minimize chances for mistakes, and give readers a good impression. 4.4 Variable Declarations and Initalizations Dodeclare local variables in the minimum scope block that can contain them, typically just before use if the language allows; otherwise, at the top of that scope block. Doinitialize variables when they are declared. Dodeclare and initialize/assign local variables on a single line where the language allows it. This reduces vertical space and makes sure that a variable does not exist in an un-initialized state or in a state that will immediately change. Do not use Hungarian notation to name variables. Use Meaningful, descriptive words to name variables. Do not use abbreviations. Confidential e-Zest Solutions Ltd. Page 9 of 54
  • 10. Good: string address int salary Not Good: string nam string addr int sal Do not use single character variable names like i, n, s etc. Use names like index, temp One exception in this case would be variables used for iterations in loops: for ( int i = 0; i < count; i++ ) { ... } If the variable is used only as a counter for iteration and is not used anywhere else in the loop, many people still like to use a single char variable (i) instead of inventing a different suitable name. Do not use underscores (_) for local variable names. All member variables must be prefixed with underscore (_) so that they can be identified from other local variables. Do not use variable names that resemble keywords. Prefixbooleanvariables, properties and methods with “is” or similar prefixes. Ex: private bool _isFinished // C# sample: string name = myObject.Name; int val = time.Hours; ' VB.NET sample: Dim name AsString = myObject.Name Dim val AsInteger = time.Hours Confidential e-Zest Solutions Ltd. Page 10 of 54
  • 11. 4.5 Function Declarations and Calls The function/method name, return value and parameter list can take several forms. Ideally this can all fit on a single line. If there are many arguments that don't fit on a line those can be wrapped, many per line or one per line. Put the return type on the same line as the function/method name.For example, Single Line Format: // C# function call sample: hr = DoSomeFunctionCall(param1, param2, param3); 'VB.NETfunction call sample: hr = DoSomeFunctionCall(param1, param2, param3) Multiple Line Formats: // C# function call sample: hr = DoSomeFunctionCall(param1, param2,param3, param4, param5); 'VB.NETfunction call sample: hr = DoSomeFunctionCall(param1, param2,param3, _ param4, param5) Do order parameters, grouping the in parameters first, the out parameters appear last. Within the group, order the parameters based onwhat will help programmers supply the right values. For example, if a function takes arguments named “left” and “right”, put “left” before “right” so that their place match their names. When designing a series of functions which take the same arguments, use a consistent order across the functions. For example, if one function takes an input handle as the first parameter, all of the related functions should also take the same input handle as the first parameter. Do not writing very long methods. A method should typically have 1~25 lines of code. If a method has more than 25 lines of code, you must consider refactoring into separate methods. Do not use mis-leading names. Method name should tell what it does. A method should do only 'one job'. Do not combine more than one job in a single method, even if those jobs are very small. Good: // Save the address. SaveAddress ( address ); // Send an email to the supervisor to inform that the address is updated. SendEmail ( address, email ); void SaveAddress ( string address ) { // Save the address. // ... } Confidential e-Zest Solutions Ltd. Page 11 of 54
  • 12. void SendEmail ( string address, string email ) { // Send an email to inform the supervisor that the address is changed. // ... } Not Good: // Save address and send an email to the supervisor to inform that // the address is updated. SaveAddress ( address, email ); void SaveAddress ( string address, string email ) { // Job 1. // Save the address. // ... // Job 2. // Send an email to inform the supervisor that the address is changed. // ... } 4.6 Enums Douse an enum to strongly type parameters, properties, and return values that represent sets of values. Dofavor using an enum over static constants or “#define” values .An enum is a structure with a set of static constants. The reason to follow this guideline is because you will get some additional compiler and reflection support if you define an enum versus manually defining a structure with static constants. Good: // C# sample: publicenumColor { Red, Green, Blue } ' VB.NET sample: PublicEnum Color Red Green Confidential e-Zest Solutions Ltd. Page 12 of 54
  • 13. Blue EndEnum Bad: // C# sample: publicstaticclassColor { publicconst int Red = 0; publicconst int Green = 1; publicconst int Blue = 2; } ' VB.NET sample: PublicClass Color PublicConst Red AsInteger = 0 PublicConst Green AsInteger = 1 PublicConst Blue AsInteger = 2 EndClass Do not use an enum for open sets (such as the operating system version, names of your friends, etc.). Doprovide a value of zero on simple enums.Consider calling the value something like “None.” If such value is not appropriate for this particular enum, the most common default value for the enum should be assigned the underlying value of zero. // C# sample: publicenumCompression { None = 0, GZip, Deflate } ' VB.NET sample: PublicEnum Compression None = 0 Confidential e-Zest Solutions Ltd. Page 13 of 54
  • 14. GZip Deflate EndEnum Do not use Enum.IsDefined for enum range checks in .NET.There are really two problems with Enum.IsDefined. First it loads reflection and a bunch of cold type metadata, making it a surprisingly expensive call. Second, there is a versioning issue here. Good: // C# sample: if (c >Color.Black || c <Color.White) { thrownewArgumentOutOfRangeException(...); } ' VB.NET sample: If (c > Color.Black Or c < Color.White) Then ThrowNew ArgumentOutOfRangeException(...); EndIf Bad: // C# sample: if (!Enum.IsDefined(typeof(Color), c)) { thrownew InvalidEnumArgumentException(...); } ' VB.NET sample: IfNot [Enum].IsDefined(GetType(Color), c) Then ThrowNew ArgumentOutOfRangeException(...); EndIf 4.7 Comments You should use comments that summarize what a piece of code is designed to do and why. Do not use comments to repeat the code. Good: Confidential e-Zest Solutions Ltd. Page 14 of 54
  • 15. // Determine whether system is running Windows Vista or later operating // systems (major version >= 6) because they support linked tokens, but // previous versions (major version < 6) do not. Bad: // The following code sets the variable i to the starting value of the // array. Then it loops through each item in the array. You shoulduse ‘//’ comments instead of ‘/* */’ for comments for C# code comments.The single-line syntax (// …) is preferred even when a comment spans multiple lines. // Determine whether system is running Windows Vista or later operating // systems (major version >= 6) because they support linked tokens, but // previous versions (major version < 6) do not. if (Environment.OSVersion.Version.Major >= 6) { } ' Get and display the process elevation information (IsProcessElevated) ' and integrity level (GetProcessIntegrityLevel). The information is not ' available on operating systems prior to Windows Vista. If (Environment.OSVersion.Version.Major >= 6) Then EndIf You should indent comments at the same level as the code they describe. You should use full sentences with initial caps, a terminating period and proper punctuation and spelling in comments. Good: // Intialize the components on the Windows Form. InitializeComponent(); ' Intialize the components on the Windows Form. InitializeComponent() Bad: Confidential e-Zest Solutions Ltd. Page 15 of 54
  • 16. //intialize the components on the Windows Form. InitializeComponent(); 'intialize the components on the Windows Form InitializeComponent() 4.7.1 Inline CodeComments Inline comments should be included on their own line and should be indented at the same level as the code they are commenting on, with a blank line before, but none after. Comments describing a block of code should appear on a line by themselves, indented as the code they describe, with one blank line before it and one blank line after it. For example: if (MAXVAL >= exampleLength) { // Reprort the error. ReportError(GetLastError()); // The value is out of range, we cannot continue. return E_INVALIDARG; } Inline comments are permissible on the same line as the actual code only when giving a brief description of a structure member, class member variable, parameter, or a short statement. In this case it is a good idea to align the comments for all variables. For example: class Example { public: ... void TestFunction { ... do { ... Confidential e-Zest Solutions Ltd. Page 16 of 54
  • 17. } while (!fFinished); // Continue if not finished. } private: int m_length; // The length of the example float m_accuracy; // The accuracy of the example }; You should not drown your code in comments. Commenting every line with obvious descriptions of what the code does actually hinders readability and comprehension. Single-line comments should be used when the code is doing something that might not be immediately obvious. The following example contains many unnecessary comments: Bad: // Loop through each item in the wrinkles array for (int i = 0; i <= lastWrinkle; i++) { Wrinkle wrinkle = apWrinkles[i]; // Get the next wrinkle if (wrinkle.IsNew() &&// Process if it’s a new wrinkle nMaxImpact <wrinkle.GetImpact()) // And it has the biggest impact { nMaxImpact = wrinkle.GetImpact(); // Save its impact for comparison pBestWrinkle = wrinkle; // Remember this wrinkle as well } } A better implementation would be: Good: // Loop through each item in the wrinkles array, find the Wrinkle with // the largest impact that is new, and store it in ‘pBestWrinkle’. for (int i = 0; i <= lastWrinkle; i++) { Wrinkle wrinkle = apWrinkles[i]; Confidential e-Zest Solutions Ltd. Page 17 of 54
  • 18. if (wrinkle.IsNew() && nMaxImpact <wrinkle.GetImpact()) { nMaxImpact = wrinkle->GetImpact(); pBestWrinkle = wrinkle; } } You should add comments to call out non-intuitive or behavior that is not obvious from reading the code. Confidential e-Zest Solutions Ltd. Page 18 of 54
  • 19. 5 .NET Coding Standards These coding standards can be applied to C# and VB.NET. 5.1 Design Guidelines for Developing Class Libraries The Design Guidelines for Developing Class Libraries document on MSDN is a fairly thorough discussion of how to write managed code. 5.2 Files and Structure Do nothave more than one public type in a source file, unless they differ only in the number of generic parameters or one is nested in the other. Multiple internal types in one file are allowed. Do name the source file with the name of the public type it contains. For example, MainForm class should be in MainForm.cs file and List<T> class should be in List.cs file. 5.3 Assembly Properties The assembly should contain the appropriate property values describing its name, copyright, and so on. Standard Example Set Copyright to Copyright © Microsoft Corporation [assembly: AssemblyCopyright("Copyright © 2010 Microsoft Corporation 2010")] Set AssemblyCompany to Microsoft Corporation [assembly: AssemblyCompany("Microsoft Corporation")] Set both AssemblyTitle and AssemblyProduct to the [assembly: AssemblyTitle("CSNamedPipeClient")] current sample name [assembly: AssemblyProduct("CSNamedPipeClient")] 5.4 Naming Convensions 5.4.1 General Naming Conventions Do use meaning names for various types, functions, variables, constructs and types. You should not use of shortenings or contractions as parts of identifier names. For example, use “GetWindow” rather than “GetWin”. For functions of common types, thread procs, window procedures, dialog procedures use the common suffixes for these “ThreadProc”, “DialogProc”, “WndProc”. Do not useunderscores, hyphens, or any other non-alphanumeric characters. 5.4.2 Capitalization Naming Rules for Identifiers The following table describes the capitalization and naming rules for different types of identifiers. Identifier Casing Naming Structure Example Class, Structure PascalCasing Noun public class ComplexNumber {...} public struct ComplextStruct{...} Namespace PascalCasing Noun namespace Confidential e-Zest Solutions Ltd. Page 19 of 54
  • 20. Do not use the same name for a namespace and Microsoft.Sample.Windows7 a type in that namespace. Enumeration PascalCasing Noun [Flags] Doname flag enums with plural nouns or noun publicenumConsoleModifiers phrases and simple enums with singular nouns or {Alt, Control} noun phrases. Method PascalCasing Verb or Verbphrase public void Print() {...} public void ProcessItem() {...} Public Property PascalCasing Noun or Adjective publicstring CustomerName Doname collection proprieties with a plural public ItemCollection Items phrase describing the items in the collection, as public boolCanRead opposed to a singular phrase followed by “List” or “Collection”. Doname Boolean proprieties with an affirmative phrase (CanSeek instead of CantSeek). Optionally, you can also prefix Boolean properties with “Is,” “Can,” or “Has” but only where it adds value. Non-public Field camelCasing or Noun or Adjective. privatestring name; _camelCasing Do be consistent in a code sample when you use privatestring_name; the '_' prefix. Event PascalCasing Verb or Verb phrase // A close event that is Dogive events names with a concept of before raised after the window is and after, using the present and past tense. closed. Do not use “Before” or “After” prefixes or publicevent WindowClosed postfixes to indicate pre and post events. // A close event that is raised before a window is closed. publicevent WindowClosing Delegate PascalCasing Do add the suffix ‘EventHandler’ to names of publicdelegate delegates that are used in events. WindowClosedEventHandler Do add the suffix ‘Callback’ to names of delegates other than those used as event handlers. Do not add the suffix “Delegate” to a delegate. Interface PascalCasing Noun publicinterfaceIDictionary ‘I’ prefix Constant PascalCasing for Noun publicconststring publicly visible; MessageText = "A"; camelCasing for privateconststring internally visible; messageText = "B"; All capital only for publicconst double PI= abbreviation of one 3.14159...; or two chars long. Parameter, camelCasing Noun int customerID; Variable Generic Type PascalCasing Noun T, TItem, TPolicy Parameter ‘T’ prefix Doname generic type parameters with descriptive names, unless a single-letter name is completely self-explanatory and a descriptive name would not add value. Doprefix descriptive type parameter names with T. You shouldusing T as the type parameter name for types with one single-letter type parameter. Resource PascalCasing Noun ArgumentExceptionInvalidName Do provide descriptive rather than short identifiers.Keep them concise where possible, but Confidential e-Zest Solutions Ltd. Page 20 of 54
  • 21. do not sacrifice readability for space. Do use only alphanumeric characters and underscores in naming resources. 5.4.3 Hungarian Notation Do not use Hungarian notation (i.e., do not encode the type of a variable in its name) in .NET. 5.4.4 UI Control NamingConventions UI controls would use the following prefixes. The primary purpose was to make code more readable. Control Type Prefix Button btn CheckBox chk CheckedListBox lst ComboBox cmb ContextMenu mnu DataGrid dg DateTimePicker dtp Form suffix: XXXForm GroupBox grp ImageList iml Label lb ListBox lst ListView lvw Menu mnu MenuItem mnu NotificationIcon nfy Panel pnl PictureBox pct ProgressBar prg RadioButton rad Splitter spl StatusBar sts TabControl tab TabPage tab TextBox tb Timer tmr TreeView tvw For example, for the “File | Save” menu option, the “Save” MenuItem would be called “mnuFileSave”. Confidential e-Zest Solutions Ltd. Page 21 of 54
  • 22. 5.5 Constants Douse constant fields for constants that will never change.The compiler burns the values of const fields directly into calling code. Therefore const values can never be changed without the risk of breaking compatibility. publicclassInt32 { publicconstint MaxValue = 0x7fffffff; publicconstint MinValue = unchecked((int)0x80000000); } PublicClass Int32 PublicConst MaxValue AsInteger = &H7FFFFFFF PublicConst MinValue AsInteger = &H80000000 EndClass Douse public static (shared) readonly fields for predefined object instances. If there are predefined instances of the type, declare them as public readonly static fields of the type itself. For example, publicclassShellFolder { publicstaticreadonlyShellFolder ProgramData = newShellFolder("ProgramData"); publicstaticreadonlyShellFolder ProgramFiles = newShellFolder("ProgramData"); ... } PublicClass ShellFolder PublicSharedReadOnly ProgramData AsNew ShellFolder("ProgramData") PublicSharedReadOnly ProgramFiles AsNew ShellFolder("ProgramFiles") ... EndClass 5.6 Strings Do not use the ‘+’ operator (or ‘&’ in VB.NET) to concatenate many strings. Instead, you should use StringBuilder for concatenation. However, do use the ‘+’ operator (or ‘&’ in VB.NET) to concatenate small numbers of strings. Confidential e-Zest Solutions Ltd. Page 22 of 54
  • 23. Good: StringBuilder sb = newStringBuilder(); for (int i = 0; i < 10; i++) { sb.Append(i.ToString()); } Bad: string str = string.Empty; for (int i = 0; i < 10; i++) { str += i.ToString(); } Do use overloads that explicitly specify the string comparison rules for string operations. Typically, this involves calling a method overload that has a parameter of type StringComparison. Do use StringComparison.Ordinal or StringComparison.OrdinalIgnoreCase for comparisons as your safe default for culture-agnostic string matching, and for better performance. Do use string operations that are based on StringComparison.CurrentCulture when you display output to the user. Do use the non-linguistic StringComparison.Ordinal or StringComparison.OrdinalIgnoreCasevalues instead of string operations based on CultureInfo.InvariantCulture when the comparison is linguistically irrelevant (symbolic, for example).Do not use string operations based on StringComparison.InvariantCulture in most cases. One of the few exceptions is when you are persisting linguistically meaningful but culturally agnostic data. Do use an overload of the String.Equals method to test whether two strings are equal. For example, to test if two strings are equal ignoring the case, if (str1.Equals(str2, StringComparison.OrdinalIgnoreCase)) If (str1.Equals(str2, StringComparison.OrdinalIgnoreCase)) Then Do not use an overload of the String.Compare or CompareTo method and test for a return value of zero to determine whether two strings are equal. They are used to sort strings, not to check for equality. Confidential e-Zest Solutions Ltd. Page 23 of 54
  • 24. Do use the String.ToUpperInvariant method instead of the String.ToLowerInvariant method when you normalize strings for comparison. 5.7 Arrays and Collections You shoulduse arrays in low-level functions to minimize memory consumption and maximize performance. In public interfaces, do prefer collections over arrays. Collections provide more control over contents, can evolve over time, and are more usable. In addition, using arrays for read-only scenarios is discouraged as the cost of cloning the array is prohibitive. However, if you are targeting more skilled developers and usability is less of a concern, it might be better to use arrays for read-write scenarios. Arrays have a smaller memory footprint, which helps reduce the working set, and access to elements in an array is faster as it is optimized by the runtime. Do not use read-only array fields. The field itself is read-only and can’t be changed, but elements in the array can be changed.This example demonstrates the pitfalls of using read-only array fields: Bad: publicstaticreadonlychar[] InvalidPathChars = { '"', '<', '>', '|'}; This allows callers to change the values in the array as follows: InvalidPathChars[0] = 'A'; Instead, you can use either a read-only collection (only if the items are immutable) or clone the array before returning it. However, the cost of cloning the array may be prohibitive. publicstatic ReadOnlyCollection<char> GetInvalidPathChars() { return Array.AsReadOnly(badChars); } publicstaticchar[] GetInvalidPathChars() { return (char[])badChars.Clone(); } You shoulduse jagged arrays instead of multidimensional arrays.A jagged array is an array with elements that are also arrays. The arrays that make up the elements can be of different sizes, leading to less wasted space for some sets of data (e.g., sparse matrix), as compared to multidimensional arrays. Confidential e-Zest Solutions Ltd. Page 24 of 54
  • 25. Furthermore, the CLR optimizes index operations on jagged arrays, so they might exhibit better runtime performance in some scenarios. // Jagged arrays int[][] jaggedArray = { newint[] {1,2,3,4}, newint[] {5,6,7}, newint[] {8}, newint[] {9} }; Dim jaggedArray AsInteger()() = NewInteger()() _ { _ NewInteger() {1, 2, 3, 4}, _ NewInteger() {5, 6, 7}, _ NewInteger() {8}, _ NewInteger() {9} _ } // Multidimensional arrays int [,] multiDimArray = { {1,2,3,4}, {5,6,7,0}, {8,0,0,0}, {9,0,0,0} }; Dim multiDimArray(,) AsInteger = _ { _ Confidential e-Zest Solutions Ltd. Page 25 of 54
  • 26. {1, 2, 3, 4}, _ {5, 6, 7, 0}, _ {8, 0, 0, 0}, _ {9, 0, 0, 0} _ } Douse Collection<T> or a subclass of Collection<T> for properties or return values representing read/write collections, and use ReadOnlyCollection<T> or a subclass of ReadOnlyCollection<T> for properties or return values representing read-only collections. You should reconsider the use of ArrayList because any objects added into the ArrayList are added as System.Object and when retrieving values back from the arraylist, these objects are to be unboxed to return the actual valuetype. So it is recommended to use the custom typed collections instead of ArrayList. For example, .NET provides a strongly typed collection class for String in System.Collection.Specialized, namely StringCollection. You should reconsider the use of Hashtable. Instead, try other dictionary such as StringDictionary, NameValueCollection, HybridCollection.Hashtable can be used if less number of values is stored. When you are creating a collection type, you should implement IEnumerable so that the collection can be used with LINQ to Objects. Do notimplement both IEnumerator<T> and IEnumerable<T> on the same type. The same applies to the nongeneric interfaces IEnumerator and IEnumerable. In other words, a type should be either a collection or an enumerator, but not both. Do not return a null reference for Arrayor Collection. Null can be difficult to understand in this context. For example, a user might assume that the following code will work.Return an empty array or collection instead of a null reference. int[] arr = SomeOtherFunc(); foreach (int v in arr) { ... } 5.8 Structures Doensure that a state where all instance data is set to zero, false, or null (as appropriate) is valid.This prevents accidental creation of invalid instances when an array of the structs is created. Confidential e-Zest Solutions Ltd. Page 26 of 54
  • 27. Doimplement IEquatable<T> on value types.The Object.Equals method on value types causes boxing and its default implementation is not very efficient, as it uses reflection. IEquatable<T>.Equals can have much better performance and can be implemented such that it will not cause boxing. 5.8.1 Structures vs. Classes Do not define a struct unless the type has all of the following characteristics: • It logically represents a single value, similar to primitive types (int, double, etc.). • It has an instance size fewer than 16 bytes. • It is immutable. • It will not have to be boxed frequently. In all other cases, you should define your types as classes instead of structs. 5.9 Classes Douse inheritance to express “is a” relationships such as “cat is an animal”. Douse interfaces such as IDisposable to express “can do” relationships such as using “objects of this class can be disposed”. 5.9.1 Fields Do not provide instance fields that are public or protected.Public and protected fields do not version well and are not protected by code access security demands. Instead of using publicly visible fields, use private fields and expose them through properties. Douse public static read-only fields for predefined object instances. Douse constant fields for constants that will never change. Do not assign instances of mutable types to read-only fields. 5.9.2 Properties Docreate read-only properties if the caller should not be able to change the value of the property. Do not provide set-only properties.If the property getter cannot be provided, use a method to implement the functionality instead. The method name should begin with Set followed by what would have been the property name. Doprovide sensible default values for all properties, ensuring that the defaults do not result in a security hole or an extremely inefficient design. Confidential e-Zest Solutions Ltd. Page 27 of 54
  • 28. You should not throw exceptions from property getters.Property getters should be simple operations without any preconditions. If a getter might throw an exception, consider redesigning the property to be a method.This recommendation does not apply to indexers. Indexers can throw exceptions because of invalid arguments.It is valid and acceptable to throw exceptions from a property setter. 5.9.3 Constructors Dominimal work in the constructor.Constructors should not do much work other than to capture the constructor parameters and set main properties. The cost of any other processing should be delayed until required. Dothrow exceptions from instance constructors if appropriate. Doexplicitly declare the public default constructor in classes, if such a constructor is required.Even though some compilers automatically add a default constructor to your class, adding it explicitly makes code maintenance easier. It also ensures the default constructor remains defined even if the compiler stops emitting it because you add a constructor that takes parameters. Do not call virtual members on an object inside its constructors.Calling a virtual member causes the most-derived override to be called regardless of whether the constructor for the type that defines the most-derived override has been called. 5.9.4 Methods Doplace all out parameters after all of the pass-by-value and ref parameters (excluding parameter arrays), even if this results in an inconsistency in parameter ordering between overloads. Dovalidate arguments passed to public, protected, or explicitly implemented members. Throw System.ArgumentException, or one of its subclasses, if the validation fails: If a null argument is passed and the member does not support null arguments, throw ArgumentNullException. If the value of an argument is outside the allowable range of values as defined by the invoked method, throw ArgumentOutOfRangeException. 5.9.5 Events Dobe prepared for arbitrary code executing in the event-handling method.Consider placing the code where the event is raised in a try-catch block to prevent program termination due to unhandled exceptions thrown from the event handlers. Do not use events in performance sensitive APIs. While events are easier for many developers to understand and use, they are less desirable than Virtual Members from a performance and memory consumption perspective. Confidential e-Zest Solutions Ltd. Page 28 of 54
  • 29. 5.9.6 Member Overloading Douse member overloading rather than defining members with default arguments. Default arguments are not CLS-compliant and cannot be used from some languages.There is also a versioning issue in members with default arguments.Imagine version 1 of a method that sets an optional parameter to 123. When compiling code that calls this method without specifying the optional parameter, the compiler will embed the default value (123) into the code at the call site. Now, if version 2 of the method changes the optional parameter to 863, then, if the calling code is not recompiled, it will call version 2 of the method passing in 123 (version 1’s default, not version 2’s default). Good: PublicOverloadsSub Rotate(ByVal data As Matrix) Rotate(data, 180) EndSub PublicOverloadsSub Rotate(ByVal data As Matrix, ByVal degrees AsInteger) ' Do rotation here EndSub Bad: PublicSub Rotate(ByVal data As Matrix, OptionalByVal degrees AsInteger = 180) ' Do rotation here EndSub Do not arbitrarily vary parameter names in overloads. If a parameter in one overload represents the same input as a parameter in another overload, the parameters should have the same name.Parameters with the same name should appear in the same position in all overloads. Domake only the longest overload virtual (if extensibility is required). Shorter overloads should simply call through to a longer overload. Confidential e-Zest Solutions Ltd. Page 29 of 54
  • 30. 5.9.7 Interface Members You should not implement interface members explicitly without having a strong reason to do so. Explicitly implemented members can be confusing to developers because they don’t appear in the list of public members and they can also cause unnecessary boxing of value types. You should implement interface members explicitly, if the members are intended to be called only through the interface. 5.9.8 Virtual Members Virtual members perform better than callbacks and events, but do not perform better than non-virtual methods. Do not make members virtual unless you have a good reason to do so and you are aware of all the costs related to designing, testing, and maintaining virtual members. You shouldprefer protected accessibility over public accessibility for virtual members. Public members should provide extensibility (if required) by calling into a protected virtual member. 5.9.9 Static Classes Douse static classes sparingly.Static classes should be used only as supporting classes for the object- oriented core of the framework. 5.9.10 Abstract Classes Do not define public or protected-internal constructors in abstract types. Dodefine a protected or an internal constructor on abstract classes. A protected constructor is more common and simply allows the base class to do its own initialization when subtypes are created. publicabstractclassClaim { protected Claim() { ... } } An internal constructor can be used to limit concrete implementations of the abstract class to the assembly defining the class. Confidential e-Zest Solutions Ltd. Page 30 of 54
  • 31. publicabstractclassClaim { internal Claim() { ... } } 5.10 Namespaces Namespace names should follow the standard pattern <company name>.<product name>.<top level module/Folder>.<bottom level module/Folder> 5.11 Errors and Exceptions 5.11.1 Exception Throwing Do report execution failures by throwing exceptions.Exceptions are the primary means of reporting errors in frameworks. If a member cannot successfully do what it is designed to do, it should be considered an execution failure and an exception should be thrown.Do not return error codes. Dothrow the most specific (the most derived) exception that makes sense.For example, throw ArgumentNullException and not its base type ArgumentException if a null argument is passed. Throwing System.Exception as well as catching System.Exception are nearly always the wrong thing to do. Do not use exceptions for the normal flow of control, if possible.Except for system failures and operations with potential race conditions, you should write code that does not throw exceptions. For example, you can check preconditions before calling a method that may fail and throw exceptions. For example, // C# sample: if (collection != null && !collection.IsReadOnly) { collection.Add(additionalNumber); } ' VB.NET sample: If ((Not collection IsNothing) And (Not collection.IsReadOnly)) Then collection.Add(additionalNumber) Confidential e-Zest Solutions Ltd. Page 31 of 54
  • 32. EndIf Do not throw exceptions from exception filter blocks. When an exception filter raises an exception, the exception is caught by the CLR, and the filter returns false. This behavior is indistinguishable from the filter executing and returning false explicitly and is therefore very difficult to debug. ' VB.NET sample ' This is bad design. The exception filter (When clause) ' may throw an exception when the InnerException property ' returns null Try ... Catch e As ArgumentException _ When e.InnerException.Message.StartsWith("File") ... EndTry Do not explicitly throw exceptions from finally blocks. Implicitly thrown exceptions resulting from calling methods that throw are acceptable. 5.11.2 Exception Handling You should notswallow errors by catching nonspecific exceptions, such as System.Exception, System.SystemException, and so on in .NET code.Do catch only specific errors that the code knows how to handle. You should catch a more specific exception, or re-throw the general exception as the last statement in the catch block. There are cases when swallowing errors in applications is acceptable, but such cases are rare. Good: // C# sample: try { ... } catch(System.NullReferenceException exc) { ... Confidential e-Zest Solutions Ltd. Page 32 of 54
  • 33. } catch(System.ArgumentOutOfRangeException exc) { ... } catch(System.InvalidCastException exc) { ... } ' VB.NET sample: Try ... Catch exc As System.NullReferenceException ... Catch exc As System.ArgumentOutOfRangeException ... Catch exc As System.InvalidCastException ... EndTry Bad: // C# sample: try { ... } catch (Exception ex) { ... } Confidential e-Zest Solutions Ltd. Page 33 of 54
  • 34. ' VB.NET sample: Try ... Catch ex As Exception ... EndTry Doprefer using an empty throw when catching and re-throwing an exception. This is the best way to preserve the exception call stack. Good: // C# sample: try { ... // Do some reading with the file } catch { file.Position = position; // Unwind on failure throw; // Rethrow } ' VB.NET sample: Try ...' Do some reading with the file Catch ex As Exception file.Position = position ' Unwind on failure Throw ' Rethrow EndTry Bad: Confidential e-Zest Solutions Ltd. Page 34 of 54
  • 35. // C# sample: try { ... // Do some reading with the file } catch (Exception ex) { file.Position = position; // Unwind on failure throw ex; // Rethrow } ' VB.NET sample: Try ...' Do some reading with the file Catch ex As Exception file.Position = position ' Unwind on failure Throw ex ' Rethrow EndTry 5.12 Resource Cleanup Do not force garbage collections with GC.Collect. 5.12.1 Try-finally Block Douse try-finally blocks for cleanup code andtry-catch blocks for error recovery code. Do not use catch blocks for cleanup code.Usually, the cleanup logic rolls back resource (particularly, native resource) allocations. For example, // C# sample: FileStream stream = null; try { stream = newFileStream(...); ... Confidential e-Zest Solutions Ltd. Page 35 of 54
  • 36. } finally { if (stream != null) { stream.Close(); } } ' VB.NET sample: Dim stream As FileStream = Nothing Try stream = New FileStream(...) ... Catch ex As Exception If (stream IsNotNothing) Then stream.Close() EndIf EndTry C# and VB.NET provide the using statement that can be used instead of plain try-finally to clean up objects implementing the IDisposable interface. // C# sample: using(FileStream stream = newFileStream(...)) { ... } ' VB.NET sample: Using stream AsNew FileStream(...) ... EndUsing Confidential e-Zest Solutions Ltd. Page 36 of 54
  • 37. Many language constructs emit try-finally blocks automatically for you. Examples are C#/VB’s using statement, C#’s lock statement, VB’s SyncLock statement, C#’s foreach statement, and VB’s For Each statement. 5.12.2 Basic Dispose Pattern The basic implementation of the pattern involves implementing the System.IDisposable interface and declaring the Dispose(bool) method that implements all resource cleanup logic to be shared between the Dispose method and the optional finalizer. Please note that this section does not discuss providing a finalizer. Finalizable types are extensions to this basic pattern and are discussed in the next section. The following example shows a simple implementation of the basic pattern: // C# sample: publicclassDisposableResourceHolder : IDisposable { private bool disposed = false; privateSafeHandle resource; // Handle to a resource public DisposableResourceHolder() { this.resource = ... // Allocates the native resource } publicvoid DoSomething() { if (disposed) { thrownewObjectDisposedException(...); } // Now call some native methods using the resource ... } Confidential e-Zest Solutions Ltd. Page 37 of 54
  • 38. publicvoid Dispose() { Dispose(true); GC.SuppressFinalize(this); } protectedvirtualvoid Dispose(bool disposing) { // Protect from being called multiple times. if (disposed) { return; } if (disposing) { // Clean up all managed resources. if (resource != null) { resource.Dispose(); } } disposed = true; } } ' VB.NET sample: PublicClass DisposableResourceHolder Implements IDisposable Confidential e-Zest Solutions Ltd. Page 38 of 54
  • 39. Private disposed AsBoolean = False Private resource As SafeHandle ' Handle to a resource PublicSubNew() resource = ... ' Allocates the native resource EndSub PublicSub DoSomething() If (disposed) Then ThrowNew ObjectDisposedException(...) EndIf ' Now call some native methods using the resource ... EndSub PublicSub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) EndSub ProtectedOverridableSub Dispose(ByVal disposing AsBoolean) ' Protect from being called multiple times. If disposed Then Return EndIf If disposing Then ' Clean up all managed resources. Confidential e-Zest Solutions Ltd. Page 39 of 54
  • 40. If (resource IsNotNothing) Then resource.Dispose() EndIf EndIf disposed = True EndSub EndClass Doimplement the Basic Dispose Pattern on types containing instances of disposable types. Doextend the Basic Dispose Pattern to provide a finalizer on types holding resources that need to be freed explicitly and that do not have finalizers.For example, the pattern should be implemented on types storing unmanaged memory buffers. You should implement the Basic Dispose Pattern on classes that themselves don’t hold unmanaged resources or disposable objects but are likely to have subtypes that do.A great example of this is the System.IO.Stream class. Although it is an abstract base class that doesn’t hold any resources, most of its subclasses do and because of this, it implements this pattern. Do declare a protected virtual void Dispose(bool disposing) method to centralize all logic related to releasing unmanaged resources.All resource cleanup should occur in this method. The method is called from both the finalizer and the IDisposable.Dispose method.The parameter will be false if being invoked from inside a finalizer. It should be used to ensure any code running during finalization is not accessing other finalizable objects.Details of implementing finalizers are described in the next section. // C# sample: protectedvirtualvoid Dispose(bool disposing) { // Protect from being called multiple times. if (disposed) { return; } if (disposing) Confidential e-Zest Solutions Ltd. Page 40 of 54
  • 41. { // Clean up all managed resources. if (resource != null) { resource.Dispose(); } } disposed = true; } ' VB.NET sample: ProtectedOverridableSub Dispose(ByVal disposing AsBoolean) ' Protect from being called multiple times. If disposed Then Return EndIf If disposing Then ' Clean up all managed resources. If (resource IsNotNothing) Then resource.Dispose() EndIf EndIf disposed = True EndSub Do implement the IDisposable interface by simply calling Dispose(true) followed by GC.SuppressFinalize(this).The call to SuppressFinalize should only occur if Dispose(true) executes successfully. Confidential e-Zest Solutions Ltd. Page 41 of 54
  • 42. // C# sample: publicvoid Dispose() { Dispose(true); GC.SuppressFinalize(this); } ' VB.NET sample: PublicSub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) EndSub Do not make the parameterless Dispose method virtual.The Dispose(bool) method is the one that should be overridden by subclasses. You should not throw an exception from within Dispose(bool) except under critical situations where the containing process has been corrupted (leaks, inconsistent shared state, etc.).Users expect that a call to Dispose would not raise an exception.For example, consider the manual try-finally in this C# snippet: TextReader tr = newStreamReader(File.OpenRead("foo.txt")); try { // Do some stuff } finally { tr.Dispose(); // More stuff } If Dispose could raise an exception, further finally block cleanup logic will not execute. To work around this, the user would need to wrap every call to Dispose (within their finally block!) in a try block, which Confidential e-Zest Solutions Ltd. Page 42 of 54
  • 43. leads to very complex cleanup handlers. If executing a Dispose(bool disposing) method, never throw an exception if disposing is false. Doing so will terminate the process if executing inside a finalizer context. Dothrow an ObjectDisposedException from any member that cannot be used after the object has been disposed. // C# sample: publicclassDisposableResourceHolder : IDisposable { private bool disposed = false; private SafeHandle resource; // Handle to a resource publicvoid DoSomething() { if (disposed) { thrownewObjectDisposedException(...); } // Now call some native methods using the resource ... } protectedvirtualvoid Dispose(bool disposing) { if (disposed) { return; } // Cleanup ... Confidential e-Zest Solutions Ltd. Page 43 of 54
  • 44. disposed = true; } } ' VB.NET sample: PublicClass DisposableResourceHolder Implements IDisposable Private disposed AsBoolean = False Private resource As SafeHandle ' Handle to a resource PublicSub DoSomething() If (disposed) Then ThrowNew ObjectDisposedException(...) EndIf ' Now call some native methods using the resource ... EndSub ProtectedOverridableSub Dispose(ByVal disposing AsBoolean) ' Protect from being called multiple times. If disposed Then Return EndIf ' Cleanup ... disposed = True Confidential e-Zest Solutions Ltd. Page 44 of 54
  • 45. EndSub EndClass 5.12.3 Finalizable Types Finalizable types are types that extend the Basic Dispose Pattern by overriding the finalizer and providing finalization code path in the Dispose(bool) method.The following code shows an example of a finalizable type: // C# sample: publicclassComplexResourceHolder : IDisposable { bool disposed = false; privateIntPtr buffer; // Unmanaged memory buffer privateSafeHandle resource; // Disposable handle to a resource public ComplexResourceHolder() { this.buffer = ... // Allocates memory this.resource = ... // Allocates the resource } publicvoid DoSomething() { if (disposed) { thrownewObjectDisposedException(...); } // Now call some native methods using the resource ... } Confidential e-Zest Solutions Ltd. Page 45 of 54
  • 46. ~ComplexResourceHolder() { Dispose(false); } publicvoid Dispose() { Dispose(true); GC.SuppressFinalize(this); } protectedvirtualvoid Dispose(bool disposing) { // Protect from being called multiple times. if (disposed) { return; } if (disposing) { // Clean up all managed resources. if (resource != null) { resource.Dispose(); } } // Clean up all native resources. Confidential e-Zest Solutions Ltd. Page 46 of 54
  • 47. ReleaseBuffer(buffer); disposed = true; } } ' VB.NET sample: PublicClass DisposableResourceHolder Implements IDisposable Private disposed AsBoolean = False Private buffer As IntPtr ' Unmanaged memory buffer Private resource As SafeHandle ' Handle to a resource PublicSubNew() buffer = ... ' Allocates memory resource = ... ' Allocates the native resource EndSub PublicSub DoSomething() If (disposed) Then ThrowNew ObjectDisposedException(...) EndIf ' Now call some native methods using the resource ... EndSub ProtectedOverridesSub Finalize() Dispose(False) MyBase.Finalize() Confidential e-Zest Solutions Ltd. Page 47 of 54
  • 48. EndSub PublicSub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) EndSub ProtectedOverridableSub Dispose(ByVal disposing AsBoolean) ' Protect from being called multiple times. If disposed Then Return EndIf If disposing Then ' Clean up all managed resources. If (resource IsNotNothing) Then resource.Dispose() EndIf EndIf ' Clean up all native resources. ReleaseBuffer(Buffer) disposed = True EndSub EndClass Confidential e-Zest Solutions Ltd. Page 48 of 54
  • 49. Domake a type finalizable, if the type is responsible for releasing an unmanaged resource that does not have its own finalizer.When implementing the finalizer, simply call Dispose(false) and place all resource cleanup logic inside the Dispose(bool disposing) method. // C# sample: publicclassComplexResourceHolder : IDisposable { ... ~ComplexResourceHolder() { Dispose(false); } protectedvirtualvoid Dispose(bool disposing) { ... } } ' VB.NET sample: PublicClass DisposableResourceHolder Implements IDisposable ... ProtectedOverridesSub Finalize() Dispose(False) MyBase.Finalize() EndSub ProtectedOverridableSub Dispose(ByVal disposing AsBoolean) Confidential e-Zest Solutions Ltd. Page 49 of 54
  • 50. ... EndSub EndClass Dobe very careful to make type finalizable.Carefully consider any case in which you think a finalizer is needed. There is a real cost associated with instances with finalizers, from both a performance and code complexity standpoint. Doimplement the Basic Dispose Pattern on every finalizable type. See the previous section for details on the basic pattern.This gives users of the type a means to explicitly perform deterministic cleanup of those same resources for which the finalizer is responsible. You shouldcreate and use a critical finalizable object (a type with a type hierarchy that contains CriticalFinalizerObject) for situations in which a finalizer absolutely must execute even in the face of forced application domain unloads and thread aborts. Doprefer resource wrappers based on SafeHandle or SafeHandleZeroOrMinusOneIsInvalid (for Win32 resource handle whose value of either 0 or -1 indicates an invalid handle) to writing finalizer by yourself to encapsulate unmanaged resources where possible, in which case a finalizer becomes unnecessary because the wrapper is responsible for its own resource cleanup.Safe handles implement the IDisposable interface, and inherit from CriticalFinalizerObject so the finalizer logic will absolutely execute even in the face of forced application domain unloads and thread aborts. ///<summary> /// Represents a wrapper class for a pipe handle. ///</summary> [SecurityCritical(SecurityCriticalScope.Everything), HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true), SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] internalsealedclassSafePipeHandle : SafeHandleZeroOrMinusOneIsInvalid { private SafePipeHandle() : base(true) { } Confidential e-Zest Solutions Ltd. Page 50 of 54
  • 51. public SafePipeHandle(IntPtr preexistingHandle, bool ownsHandle) : base(ownsHandle) { base.SetHandle(preexistingHandle); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] privatestaticexternbool CloseHandle(IntPtr handle); protectedoverridebool ReleaseHandle() { return CloseHandle(base.handle); } } ///<summary> /// Represents a wrapper class for a local memory pointer. ///</summary> [SuppressUnmanagedCodeSecurity, HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)] internalsealedclassSafeLocalMemHandle : SafeHandleZeroOrMinusOneIsInvalid { public SafeLocalMemHandle() : base(true) { } Confidential e-Zest Solutions Ltd. Page 51 of 54
  • 52. public SafeLocalMemHandle(IntPtr preexistingHandle, bool ownsHandle) : base(ownsHandle) { base.SetHandle(preexistingHandle); } [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] privatestaticexternIntPtr LocalFree(IntPtr hMem); protectedoverridebool ReleaseHandle() { return (LocalFree(base.handle) == IntPtr.Zero); } } Do not access any finalizable objects in the finalizer code path, as there is significant risk that they will have already been finalized. For example, a finalizable object A that has a reference to another finalizable object B cannot reliably use B in A’s finalizer, or vice versa. Finalizers are called in a random order (short of a weak ordering guarantee for critical finalization). It is OK to touch unboxed value type fields. Also, be aware that objects stored in static variables will get collected at certain points during an application domain unload or while exiting the process. Accessing a static variable that refers to a finalizable object (or calling a static method that might use values stored in static variables) might not be safe if Environment.HasShutdownStarted returns true. Do not let exceptions escape from the finalizer logic, except for system-critical failures.If an exception is thrown from a finalizer, the CLR may shut down the entire process preventing other finalizers from executing and resources from being released in a controlled manner. 5.12.4 Overriding Dispose If you're inheriting from a base class that implements IDisposable, you mustimplement IDisposable also. Always call your base class's Dispose(bool) so itcleans up. Confidential e-Zest Solutions Ltd. Page 52 of 54
  • 53. publicclassDisposableBase : IDisposable { ~DisposableBase() { Dispose(false); } publicvoid Dispose() { Dispose(true); GC.SuppressFinalize(this); } protectedvirtualvoid Dispose(bool disposing) { // ... } } publicclassDisposableSubclass : DisposableBase { protectedoverridevoid Dispose(bool disposing) { try { if (disposing) { // Clean up managed resources. } Confidential e-Zest Solutions Ltd. Page 53 of 54
  • 54. // Clean up native resources. } finally { base.Dispose(disposing); } } } Confidential e-Zest Solutions Ltd. Page 54 of 54