|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Want a new Job?
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
IntroductionWriting consistent code comprehended by other developers is supposed to follow some coding style and practices, rather than inventing your own ones. These include naming conventions, on how you name your variables and functions, code and class layout including tabs, whitespace, brackets placement etc... Though C# is much easier to develop code with compared to C++ (as VS provides you even automatic indentation and code formating) there are some quick guidelines you should follow. There are also some great online resources you may use in addition to that article: Value and Reference SemanticsCompared to C++ in C# there is inherent value and reference semantics. As there are no pointers in safe code and everything is accessed with '.' there are value and reference types:
So having initialization of a value or reference type you get different results:
SomeStruct ss = new SomeStruct();
SomeClass sc = new SomeClass();
SomeStruct ss1 = ss; //you will have new ss1 object created
SomeClass sc1 = sc; //you get sc reference in sc1!!!
Spaces, Braces, Tabs, Code LayoutNo need to worry about, VS will do all formatting for you automatically like the one snippet below, so you are prevented from incorrectly layouting your code. Very nice feature for C#, hope there will be the same tool for C++ language.
public int SaveDictionary(String fileName)
{
try
{
using (StreamWriter sw = new StreamWriter(fileName))
{
foreach (String word in this.stats.Keys)
{
sw.WriteLine(word);
List<WordFreqPair> wfpList = this.stats[word];
for (int i = 0; i < wfpList.Count; i++)
sw.WriteLine(String.Format(" {0,-25} {1}", wfpList[i].Word, wfpList[i].Prob));
sw.WriteLine("");
}
}
return 0;
}
catch (Exception e)
{
Trace.WriteLine(String.Format("TextStatistics.SaveDictionary({0}) raised exception {1}", fileName, e.Message));
this.error = String.Format("TextStatistics.SaveDictionary({0}) raised exception {1}", fileName, e.Message);
return -1;
}
}
Naming Conventions.NET standards do not recommend using Hungarian prefixes, so avoid them. To refer
to member field inside class member function use this word
SomeClass { ... };
SomeEnum { Item1, Item2, ... };
SomeProperty { get; set }
double someVariable;
int someFunctionParameter;
const char SomeConstantVariable;
static readonly SomeReadOnlyStaticVariable;
Exception SomeNameException;
Attribute SomeNameAttribute;
Button cancelButton;
TextBox nameTextBox;
PictureBox namePictureBox;
Class LayoutIt is recommended to declare class internals in that order:
MiscellaneousOne class per source file (SomeName class should be declared in somename.cs file) Private members are private by default in class, avoid explicit private. For a single statement get/set property use that construction:
public int Foo
{
get { return this.foo; }
set { this.foo = value; }
}
Use {} for
if (someVar == true)
{
foo++;
}
Use @ instead of escape sequencies in strings - @"c:\somepath\file.txt" Use override instead of new
class SomeParent
{
//...
public int DoWork();
//...
}
class SomeOverride
{
//...
public override int DoWork();
//...
}
Initialize string to String.Empty rather than assigning it "". Use StringBuilder for composing complex strings rather than using string class operators. Document if the method returns copy of reference type. Do not compare to Provide private constructor if only static fields are in the class or declare static class. Const objects in class are static by default. Struct may have constructor with parameters only. Consider documenting your code so you will not be trying to recall what the method is supposed to do after some days have gone
/// <summary>
/// Save trimed text
/// </summary>
/// <param name="fileName">Trimed text file name</param>
/// <returns>zero upon success</returns>
public int SaveText(String fileName)
{
//...
}
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||