summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--csharp.html.markdown548
1 files changed, 548 insertions, 0 deletions
diff --git a/csharp.html.markdown b/csharp.html.markdown
new file mode 100644
index 00000000..e079571e
--- /dev/null
+++ b/csharp.html.markdown
@@ -0,0 +1,548 @@
+---
+
+language: c#
+contributors:
+ - ["Irfan Charania", "https://github.com/irfancharania"]
+filename: LearnCSharp.cs
+
+---
+
+C# is an elegant and type-safe object-oriented language that enables developers to build a variety of secure and robust applications that run on the .NET Framework.
+
+[Read more here.](http://msdn.microsoft.com/en-us/library/vstudio/z1zx9t92.aspx)
+
+```c#
+// Single-line comments start with //
+/*
+Multi-line comments look like this
+*/
+/// <summary>
+/// This is an XML documentation comment
+/// </summary>
+
+// Specify namespaces application will be using
+using System;
+using System.Collections.Generic;
+
+
+// defines scope to organize code into "packages"
+namespace Learning
+{
+ // Each .cs file should at least contain a class with the same name as the file
+ // you're allowed to do otherwise, but shouldn't for sanity.
+ public class LearnCSharp
+ {
+ // A console application must have a main method as an entry point
+ public static void Main(string[] args)
+ {
+ // Use Console.WriteLine to print lines
+ Console.WriteLine("Hello World");
+ Console.WriteLine(
+ "Integer: " + 10 +
+ " Double: " + 3.14 +
+ " Boolean: " + true);
+
+ // To print without a new line, use Console.Write
+ Console.Write("Hello ");
+ Console.Write("World");
+
+
+ ///////////////////////////////////////////////////
+ // Types & Variables
+ //
+ // Declare a variable using <type> <name>
+ ///////////////////////////////////////////////////
+
+ // Sbyte - Signed 8-bit integer
+ // (-128 <= sbyte <= 127)
+ sbyte fooSbyte = 100;
+
+ // Byte - Unsigned 8-bit integer
+ // (0 <= byte <= 255)
+ byte fooByte = 100;
+
+ // Short - Signed 16-bit integer
+ // (-32,768 <= short <= 32,767)
+ short fooShort = 10000;
+
+ // Ushort - Unsigned 16-bit integer
+ // (0 <= ushort <= 65,535)
+ ushort fooUshort = 10000;
+
+ // Integer - Signed 32-bit integer
+ // (-2,147,483,648 <= int <= 2,147,483,647)
+ int fooInt = 1;
+
+ // Uinteger - Unsigned 32-bit integer
+ // (0 <= uint <= 4,294,967,295)
+ uint fooUint = 1;
+
+ // Long - Signed 64-bit integer
+ // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807)
+ long fooLong = 100000L;
+ // L is used to denote that this variable value is of type long or ulong
+ // anything without is treated as int or uint depending on size.
+
+ // Ulong - Unsigned 64-bit integer
+ // (0 <= ulong <= 18,446,744,073,709,551,615)
+ ulong fooUlong = 100000L;
+
+ // Float - Single-precision 32-bit IEEE 754 Floating Point
+ // Precision: 7 digits
+ float fooFloat = 234.5f;
+ // f is used to denote that this variable value is of type float;
+ // otherwise it is treated as double.
+
+ // Double - Double-precision 64-bit IEEE 754 Floating Point
+ // Precision: 15-16 digits
+ double fooDouble = 123.4;
+
+ // Bool - true & false
+ bool fooBoolean = true;
+ bool barBoolean = false;
+
+ // Char - A single 16-bit Unicode character
+ char fooChar = 'A';
+
+ // Strings
+ string fooString = "My string is here!";
+ Console.WriteLine(fooString);
+
+ // formatting
+ string fooFormattedString = string.Format("Check Check, {0} {1}, {0} {1:0.0}", 1, 2);
+ Console.WriteLine(fooFormattedString);
+
+ // formatting dates
+ DateTime fooDate = DateTime.Now;
+ Console.WriteLine(fooDate.ToString("hh:mm, dd MMM yyyy"));
+
+ // \n is an escaped character that starts a new line
+ string barString = "Printing on a new line?\nNo Problem!";
+ Console.WriteLine(barString);
+
+ // it can be written prettier by using the @ symbol
+ string bazString = @"Here's some stuff
+ on a new line!";
+ Console.WriteLine(bazString);
+
+ // quotes need to be escaped
+ // use \" normally
+ string quotedString = "some \"quoted\" stuff";
+ Console.WriteLine(quotedString);
+
+ // use "" when strings start with @
+ string quotedString2 = @"some MORE ""quoted"" stuff";
+ Console.WriteLine(quotedString2);
+
+ // Use const or read-only to make a variable immutable
+ // const values are calculated at compile time
+ const int HOURS_I_WORK_PER_WEEK = 9001;
+
+ // Nullable types
+ // any type can be made nullable by suffixing a ?
+ // <type>? <var name> = <value>
+ int? nullable = null;
+ Console.WriteLine("Nullable variable: " + nullable);
+
+ // ?? is syntactic sugar for specifying default value
+ // in case variable is null
+ int notNullable = nullable ?? 0;
+ Console.WriteLine("Not nullable variable: " + notNullable);
+
+ // Var - compiler will choose the most appropriate type based on value
+ var fooImplicit = true;
+
+ ///////////////////////////////////////////////////
+ // Data Structures
+ ///////////////////////////////////////////////////
+ Console.WriteLine("\n->Data Structures");
+
+ // Arrays
+ // The array size must be decided upon declaration
+ // The format for declaring an array is follows:
+ // <datatype>[] <var name> = new <datatype>[<array size>];
+ int[] intArray = new int[10];
+ string[] stringArray = new string[1];
+ bool[] boolArray = new bool[100];
+
+ // Another way to declare & initialize an array
+ int[] y = { 9000, 1000, 1337 };
+
+ // Indexing an array - Accessing an element
+ Console.WriteLine("intArray @ 0: " + intArray[0]);
+
+ // Arrays are zero-indexed and mutable.
+ intArray[1] = 1;
+ Console.WriteLine("intArray @ 1: " + intArray[1]); // => 1
+
+ // Lists
+ // Lists are used more frequently than arrays as they are more flexible
+ // The format for declaring a list is follows:
+ // List<datatype> <var name> = new List<datatype>();
+ List<int> intList = new List<int>();
+ List<string> stringList = new List<string>();
+
+ // Another way to declare & initialize a list
+ List<int> z = new List<int> { 9000, 1000, 1337 };
+
+ // Indexing a list - Accessing an element
+ // Lists are zero-indexed and mutable.
+ Console.WriteLine("z @ 0: " + z[2]);
+
+ // Lists don't default to a value;
+ // A value must be added before accessing the index
+ intList.Add(1);
+ Console.WriteLine("intList @ 0: " + intList[0]);
+
+
+ // Others data structures to check out:
+ //
+ // Stack/Queue
+ // Dictionary
+ // Read-only Collections
+ // Tuple (.Net 4+)
+
+
+ ///////////////////////////////////////
+ // Operators
+ ///////////////////////////////////////
+ Console.WriteLine("\n->Operators");
+
+ int i1 = 1, i2 = 2; // Shorthand for multiple declarations
+
+ // Arithmetic is straightforward
+ Console.WriteLine("1+2 = " + (i1 + i2)); // => 3
+ Console.WriteLine("2-1 = " + (i2 - i1)); // => 1
+ Console.WriteLine("2*1 = " + (i2 * i1)); // => 2
+ Console.WriteLine("1/2 = " + (i1 / i2)); // => 0 (0.5 truncated down)
+
+ // Modulo
+ Console.WriteLine("11%3 = " + (11 % 3)); // => 2
+
+ // Comparison operators
+ Console.WriteLine("3 == 2? " + (3 == 2)); // => false
+ Console.WriteLine("3 != 2? " + (3 != 2)); // => true
+ Console.WriteLine("3 > 2? " + (3 > 2)); // => true
+ Console.WriteLine("3 < 2? " + (3 < 2)); // => false
+ Console.WriteLine("2 <= 2? " + (2 <= 2)); // => true
+ Console.WriteLine("2 >= 2? " + (2 >= 2)); // => true
+
+ // Bitwise operators!
+ /*
+ ~ Unary bitwise complement
+ << Signed left shift
+ >> Signed right shift
+ >>> Unsigned right shift
+ & Bitwise AND
+ ^ Bitwise exclusive OR
+ | Bitwise inclusive OR
+ */
+
+ // Incrementations
+ int i = 0;
+ Console.WriteLine("\n->Inc/Dec-rementation");
+ Console.WriteLine(i++); //i = 1. Post-Incrementation
+ Console.WriteLine(++i); //i = 2. Pre-Incrementation
+ Console.WriteLine(i--); //i = 1. Post-Decrementation
+ Console.WriteLine(--i); //i = 0. Pre-Decrementation
+
+
+ ///////////////////////////////////////
+ // Control Structures
+ ///////////////////////////////////////
+ Console.WriteLine("\n->Control Structures");
+
+ // If statements are c-like
+ int j = 10;
+ if (j == 10)
+ {
+ Console.WriteLine("I get printed");
+ }
+ else if (j > 10)
+ {
+ Console.WriteLine("I don't");
+ }
+ else
+ {
+ Console.WriteLine("I also don't");
+ }
+
+ // Ternary operators
+ // A simple if/else can be written as follows
+ // <condition> ? <true> : <false>
+ string isTrue = (true) ? "True" : "False";
+ Console.WriteLine("Ternary demo: " + isTrue);
+
+
+ // While loop
+ int fooWhile = 0;
+ while (fooWhile < 100)
+ {
+ //Console.WriteLine(fooWhile);
+ //Increment the counter
+ //Iterated 99 times, fooWhile 0->99
+ fooWhile++;
+ }
+ Console.WriteLine("fooWhile Value: " + fooWhile);
+
+ // Do While Loop
+ int fooDoWhile = 0;
+ do
+ {
+ //Console.WriteLine(fooDoWhile);
+ //Increment the counter
+ //Iterated 99 times, fooDoWhile 0->99
+ fooDoWhile++;
+ } while (fooDoWhile < 100);
+ Console.WriteLine("fooDoWhile Value: " + fooDoWhile);
+
+ // For Loop
+ int fooFor;
+ //for loop structure => for(<start_statement>; <conditional>; <step>)
+ for (fooFor = 0; fooFor < 10; fooFor++)
+ {
+ //Console.WriteLine(fooFor);
+ //Iterated 10 times, fooFor 0->9
+ }
+ Console.WriteLine("fooFor Value: " + fooFor);
+
+ // Switch Case
+ // A switch works with the byte, short, char, and int data types.
+ // It also works with enumerated types (discussed in Enum Types),
+ // the String class, and a few special classes that wrap
+ // primitive types: Character, Byte, Short, and Integer.
+ int month = 3;
+ string monthString;
+ switch (month)
+ {
+ case 1:
+ monthString = "January";
+ break;
+ case 2:
+ monthString = "February";
+ break;
+ case 3:
+ monthString = "March";
+ break;
+ default:
+ monthString = "Some other month";
+ break;
+ }
+ Console.WriteLine("Switch Case Result: " + monthString);
+
+
+ ///////////////////////////////////////
+ // Converting Data Types And Typcasting
+ ///////////////////////////////////////
+
+ // Converting data
+
+ // Convert String To Integer
+ // this will throw an Exception on failure
+ int.Parse("123");//returns an integer version of "123"
+
+ // try parse will default to type default on failure
+ // in this case: 0
+ int tryInt;
+ int.TryParse("123", out tryInt);
+
+ // Convert Integer To String
+ // Convert class has a number of methods to facilitate conversions
+ Convert.ToString(123);
+
+ ///////////////////////////////////////
+ // Classes And Functions
+ ///////////////////////////////////////
+
+ Console.WriteLine("\n->Classes & Functions");
+
+ // (definition of the Bicycle class follows)
+
+ // Use new to instantiate a class
+ Bicycle trek = new Bicycle();
+
+ // Call object methods
+ trek.speedUp(3); // You should always use setter and getter methods
+ trek.setCadence(100);
+
+ // ToString is a convention to display the value of this Object.
+ Console.WriteLine("trek info: " + trek.ToString());
+
+ // Instantiate another new Bicycle
+ Bicycle octo = new Bicycle(5, 10);
+ Console.WriteLine("octo info: " + octo.ToString());
+
+ // Instantiate a new Penny Farthing
+ PennyFarthing funbike = new PennyFarthing(1, 10);
+ Console.WriteLine("funbike info: " + funbike.ToString());
+
+ Console.Read();
+ } // End main method
+
+
+ } // End LearnCSharp class
+
+ // You can include other classes in a .cs file
+
+
+ // Class Declaration Syntax:
+ // <public/private/protected> class <class name>{
+ // //data fields, constructors, functions all inside.
+ // //functions are called as methods in Java.
+ // }
+
+ public class Bicycle
+ {
+ // Bicycle's Fields/Variables
+ public int cadence; // Public: Can be accessed from anywhere
+ private int _speed; // Private: Only accessible from within the class
+ protected int gear; // Protected: Accessible from the class and subclasses
+ internal int wheels; // Internal: Accessible from within the assembly
+ string name; // default: Only accessible from within this class
+
+ // readonly values are set at run time
+ // they can only be assigned upon declaration or in a constructor
+ readonly bool hasCardsInSpokes = false; // read-only private
+
+ // Constructors are a way of creating classes
+ // This is a default constructor
+ public Bicycle()
+ {
+ gear = 1;
+ cadence = 50;
+ _speed = 5;
+ name = "Bontrager";
+ }
+
+ // This is a specified constructor (it contains arguments)
+ public Bicycle(int startCadence, int startSpeed, int startGear, string name, bool hasCardsInSpokes)
+ {
+ this.gear = startGear;
+ this.cadence = startCadence;
+ this._speed = startSpeed;
+ this.name = name;
+ this.hasCardsInSpokes = hasCardsInSpokes;
+ }
+
+ // Constructors can be chained
+ public Bicycle(int startCadence, int startSpeed) :
+ this(startCadence, startSpeed, 0, "big wheels", true)
+ {
+ }
+
+ // Function Syntax:
+ // <public/private/protected> <return type> <function name>(<args>)
+
+ // classes can implement getters and setters for their fields
+ // or they can implement properties
+
+ // Method declaration syntax:
+ // <scope> <return type> <method name>(<args>)
+ public int getCadence()
+ {
+ return cadence;
+ }
+
+ // void methods require no return statement
+ public void setCadence(int newValue)
+ {
+ cadence = newValue;
+ }
+
+ // virtual keyword indicates this method can be overridden
+ public virtual void setGear(int newValue)
+ {
+ gear = newValue;
+ }
+
+ public void speedUp(int increment)
+ {
+ _speed += increment;
+ }
+
+ public void slowDown(int decrement)
+ {
+ _speed -= decrement;
+ }
+
+ // properties get/set values
+ // when only data needs to be accessed, consider using properties.
+ // properties may have either get or set, or both
+ private bool _hasTassles; // private variable
+ public bool hasTassles // public accessor
+ {
+ get { return _hasTassles; }
+ set { _hasTassles = value; }
+ }
+
+ private int _frameSize;
+ public int FrameSize
+ {
+ get { return _frameSize; }
+ // you are able to specify access modifiers for either get or set
+ // this means only Bicycle class can call set on Framesize
+ private set { _frameSize = value; }
+ }
+
+ //Method to display the attribute values of this Object.
+ public override string ToString()
+ {
+ return "gear: " + gear +
+ " cadence: " + cadence +
+ " speed: " + _speed +
+ " name: " + name +
+ " cards in spokes: " + (hasCardsInSpokes ? "yes" : "no") +
+ "\n------------------------------\n"
+ ;
+ }
+ } // end class Bicycle
+
+ // PennyFarthing is a subclass of Bicycle
+ class PennyFarthing : Bicycle
+ {
+ // (Penny Farthings are those bicycles with the big front wheel.
+ // They have no gears.)
+
+ // calling parent constructor
+ public PennyFarthing(int startCadence, int startSpeed) :
+ base(startCadence, startSpeed, 0, "PennyFarthing", true)
+ {
+ }
+
+ public override void setGear(int gear)
+ {
+ gear = 0;
+ }
+ }
+} // End Namespace
+
+```
+
+## Topics Not Covered
+
+ * Enums, Flags
+ * Attributes
+ * Generics (T), Delegates, Func, Actions, lambda expressions
+ * Exceptions, Interfaces, Abstraction
+ * LINQ
+ * ASP.NET (Web Forms/MVC/WebMatrix)
+ * Winforms
+ * Windows Presentation Foundation (WPF)
+
+
+
+## Further Reading
+
+ * [DotNetPerls](http://www.dotnetperls.com)
+ * [C# in Depth](http://manning.com/skeet2)
+ * [Programming C#](http://shop.oreilly.com/product/0636920024064.do)
+ * [LINQ](http://shop.oreilly.com/product/9780596519254.do)
+ * [MSDN Library](http://msdn.microsoft.com/en-us/library/618ayhy6.aspx)
+ * [ASP.NET MVC Tutorials](http://www.asp.net/mvc/tutorials)
+ * [ASP.NET Web Matrix Tutorials](http://www.asp.net/web-pages/tutorials)
+ * [ASP.NET Web Forms Tutorials](http://www.asp.net/web-forms/tutorials)
+ * [Windows Forms Programming in C#](http://www.amazon.com/Windows-Forms-Programming-Chris-Sells/dp/0321116208)
+
+
+
+[C# Coding Conventions](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx)