Professional Documents
Culture Documents
C# Language Fundamentals
OBJECTIVES
Basic C# Class Constructors Basic Input and Output Value Types and Reference Types Iteration Statements Control Flow Statements Static Methods and Parameter passing Methods Arrays, Strings, and String Manipulations Enumerations and Structures
2
Main() method based on 2 questions Do you need to process any user-specified command-line parameters? Do you want to return a value to the systen when Main() has completed.
6
Creating Objects
Works almost same as C++ "new" is the de facto standard to create an object instance Example ( illegal ) Correct version
HelloClass c1; c1.SayHi(); HelloClass c1 = new HelloClass(); c1.SayHi();
C# object variables are references to the objects in memory and not the actual objects Garbage collection is taken care by .NET
11
CONSTRUCTORS
Enables an object to initialize itself when it is created Same as the class name C# class automatically provided with free default constructor C# also provides additional constructors They do not specify a return type, not even void.
12
EXAMPLE
(Point.cs)
class Point { public Point() { Console.WriteLine("Default Constructor"); } public Point(int px, int py) { x = px; y = py; } public int x; public int y; } class PointApp { public static void Main(string[ ] args) { Point p1 = new Point(); // default constructor called Point p2; p2 = new Point(10, 20); // one arg constructor called
Overloaded CONSTRUCTORS
Used when objects are required to perform similar tasks but using different i/p parameters Process of polymorphism Create an overloaded constructor - provide several different constructor definition with different parameter lists Example:
14
Example
using System; class Room { public double length; public double breadth; public Room (double x, double y) // constuctor1 { length =x; breadth = y; }
public Room (double x) // constructor 2
length = breadth = x;
}
15
Static Members
Static members a member that is common to all objects accessed without using a particular object. i.e. , the member belongs to the class rather than the objects created from the class. Use keyword static. static int count; static int max (int x, int y); Static variables & static methods are referred as class variables & class methods
16
Static Members
Static methods have several restrictions
They can only call other static methods They can only access static data They cannot refer this or base in any way
18
Static Constructors
Is called before any object of the class is created Usually used to do any work that needs to be done once Used to assign initial values to static data members Declare by static keyword Eg: Class abc { static abc() // no parameters { } } No access modifies on static constructors A class can have only one static constructor
19
Static Classes
Class defined using static keyword When it is defined static, object users cannot create an instance ( i.e. no use of new keyword), & it can contain only static members & fields. static class UtilityClass { public static void PrintTime() { Console.WriteLine(DateTime.Now.ToShortTimeString()); } public static void PrintDate() { Console.WriteLine(DateTime.Today.ToShortDateString()); } } static void Main(string[] args) { UtilityClass.PrintDate(); UtilityClass u = new UtilityClass(); // Compiler error! 20 ...
Copy Constructors
Copy constructor creates an object by copying variables C# does not provide a copy constructor, so must provide it ourselves to the class Eg: Pass an Item object to the Item constructor so that the new Item object has the same values as the old one Public Item (Item item) { code = item.code; price = item.price; } Copy constructor is invoked by initializing an object of type Item & passing it the object to be copied Item item2 = new Item(item1); 21 Now, item2 is a copy of item1
Destructors
It is opposite to a constructor, Is called when object is no more required Same as class name & preceded by a tilde(~) , No return type Eg: Class Fun { ~Fun() { .. } } Wont have arguments C# uses a garbage collector, running on a separate thread, to execute all destructors on exit [so does not support delete keywor The process of calling a destructor when an object is reclaimed by 22 the garbage collector is called finalization.
Default Values
The member variables of class types are automatically set to an appropriate default value. the rules are simple: bool types are set to false. Numeric data is set to 0 (or 0.0 in the case of floating-point data types). string types are set to null. char types are set to '\0'. Reference types are set to null.
23
Default Values
Public variables/members are automatically get default values
Example
class Default { public int x; public object obj; public static void Main (string [ ] args) { Default d = new Default(); // Check the default value } }
Local members/variables (within the method) must assign an initial value before use them.
public static void Main (string [ ] args) { int x; Console.WriteLine(x); // Error }
24
Variable initialization
C# allows you to assign a types member data to an initial value at the time of declaration // This technique is useful when you don't want to accept default values class Test { public int myInt = 9; public string myStr = "My initial value."; .. }
25
Example
class ConstData { public const string BestNbaTeam = "Timberwolves"; public const double SimplePI = 3.14; public const bool Truth = true; public const bool Falsity = !Truth; }
27
28
Access Specifiers
public void MyMethod() { } private void MyMethod() { } protected void MyMethod() { } internal void MyMethod() { }
Accessible anywhere Accessible only from the class where defined Accessible from its own class and its descendent Accessible within the same Assembly
void MyMethod() { } private by default protected internal void MyMethod() { } Access is limited to the current assembly or types derived from the containing class
29
}
}
31
Basic IO
// IO.cs using System; class BasicIO { public static void Main(string[ ] args) { int theInt = 20; float theFloat = 20.2F; // double theFloat = 20.2; is OK string theStr = "BIT"; Console.WriteLine("Int: {0}", theInt); Console.WriteLine("Float: {0}", theFloat); Console.WriteLine("String: {0}", theStr); // array of objects object[ ] obj = {"BIT", 20, 20.2}; Console.WriteLine("String: {0}\n Int: {1}\n Float: {2}\n", obj); } }
C Format: $9,999.00 D Format: 9999 E Format: 9.999000e+003 F Format: 9999.00 G Format: 9999 N Format: 9,999.00 X Format: 270f
33
C# Iteration Constructs
for loop foreach-in loop while loop do-while loop
34
You can use "goto", "break", "continue", etc like other languages
35
37
Control Statements
if, if-else Statements Relational operators like ==, !=, <, >, <=, >=, etc are all allowed in C# Conditional operators like &&, ||, ! are also allowed in C# Beware of the difference between int and bool in C# Example
string s = "a b c"; if (s.Length) { . }
Error!
38
goto Statement
goto label; Explicit fall-through in a switch statement can be achieved by using goto statement Example: switch(country)
{ case "India": HiIndia(); goto case "USA"; case "USA": HiUSA(); break; default: break; }
40
C# Operators
All operators that you have used in C and C++ can also be used in C# Example: +, -, *, /, %, ?:, ->, etc Special operators in C# are : typeof, is and as The is operator is used to verify at runtime whether an object is compatible with a given type The as operator is used to downcast between types The typeof operator is used to represent runtime type information of a class
41
Example - is
public void DisplayObject(object obj) { if (obj is int) Console.WriteLine("The object is of type integer"); else Console.WriteLine("It is not int"); }
42
Example - as
Using as, you can convert types without raising an exception In casting, if the cast fails an InvalidCastException is raised But in as no exception is raised, instead the reference will be set to null
static void ChaseACar(Animal anAnimal) { Dog d = anAnimal as Dog; // Dog d = (Dog) anAnimal; if (d != null) d.ChaseCars(); else Console.WriteLine("Not a Dog"); }
43
Example - typeof
Instance Level
MyClass m = new MyClass(); Console.WriteLine(m.GetType());
Output
Typeof.MyClass
Class Level
Type myType = typeof(MyClass); Console.WriteLine(myType);
Output
Typeof.MyClass
44
More on as eprator
The as operator is similar to a cast operation; however, if the conversion is not possible, as returns null instead of raising an exception i.e. it is equal to :expression is type ? (type)expression : (type)null as operator only performs reference conversions and boxing conversions.
45
More Example - as
class MainClass { static void Main() { object[] objArray = new object[4]; objArray[2] = "hello"; objArray[3] = 123; objArray[4] = 123.4; objArray[5] = null; for (int i = 0; i < objArray.Length; ++i) { string s = objArray[i] as string; Console.Write("{0}:", i); if (s != null) Console.WriteLine("'" + s + "'"); else Console.WriteLine("not a string"); } } }
2:not a string
3:not a string
46
48
49
50
class outclass { public static void Fill(out int a, out string, out bool c) { a = 9; b = your string; c = true; static void Main(string[ ] args) { int i; string str; bool b; Fill(out i, out str, out b); Console.WriteLine(Int is :{0}, i); Console.WriteLine(Int is :{0}, str); Console.WriteLine(Int is :{0}, b); } }
52
54
Example
using System; class Params { public static void DispArrInts(string msg, params int[ ] list) { Console.WriteLine(msg); for (int i = 0; i < list.Length; i++) Console.WriteLine(list[i]); } static void Main(string[ ] args) { int[ ] intArray = new int[ ] {1, 2, 3}; DispArrInts("List1", intArray); DispArrInts("List2", 4, 5, 6, 7); // you can send more elements DispArrInts("List3", 8,9); // you can send less elements } }
55
57
58
Example - 1
public void SomeMethod() { int i = 30; // i is 30 int j = i; // j is also 30 int j = 99; // still i is 30, changing j will not change i }
59
Example - 2
struct Foo { public int x, y; } public void SomeMethod() { Foo f1 = new Foo(); // assign values to x and y Foo f2 = f1; // Modifying values of f2 members will not change f1 members . }
60
Reference Types
Class types are always reference types These are allocated on the garbage-collected heap Assignment of reference types will reference the same object Example:
class Foo { public int x, y; }
Now the statement Foo f2 = f1; has a reference to the object f1 and any changes made for f2 will change f1
61
Example
// ValRef.cs // This is a Reference type because it is a class
x=
valWithRef2
structData = 777 refType
Calling Program
// Pass by Value Console.WriteLine("Passing By Value..........."); Person geetha = new Person("Geetha", 25); geetha.PrintPerson(); PersonByValue(geetha); geetha.PrintPerson();
// Pass by Reference Console.WriteLine("Passing By Reference........"); Person r = new Person("Geetha", 25); r.PrintPerson(); Passing By Reference........ Geetha is 25 years old PersonByRef(ref r); Nikki is 90 years old r.PrintPerson();
66
Can this type function as a base to other types? What is the default parameter passing behavior? Can I define constructors for this type?
No. Value types are always sealed and cannot be extended. Variables are passed by value.
Yes. If the type is not sealed, it may function as a base to other types. Variables are passed by reference
Yes, but the default Yes constructor is reserved (i.e., custom constructors must all have arguments). When they fall out of When the managed the defining scope. heap is garbage collected. 68
Stack int 42
69
Reference Type
These types are allocated in a managed Heap Objects of these types are indirectly referenced Garbage collection is handled by .NET
Reference Variables
Shape rect = new Shape();
Objects Shape
Shape
Static Methods
What does 'static' method mean? Methods marked as 'static' may be called from class level This means, there is no need to create an instance of the class (i.e. an object variable) and then call. This is similar to Console.WriteLine() public static void Main() why static? At run time Main() call be invoked without any object variable of the enclosing class
71
Example
public class MyClass { public static void MyMethod() {} } public class StaticMethod { public static void Main(string[ ] args) { MyClass.MyMethod(); } }
If MyMethod() is not declared as static, then MyClass obj = new MyClass(); obj.MyMethod();
72
73
UnBoxing
Converting the value in an object reference (held in heap) into the corresponding value type (stack) Only unbox the variable that has previously been boxed Example: object objAge; int Age = (int) objAge; // OK string str = (string) objAge; // Wrong!
Enumerations in C#
The internal type used for enumeration is System.Int32 Valid types: byte, sbyte, short, ushort, int, uint, long, ulong Eg: enum pos:byte { off, on}
Using Enumerations Colors c; c = Colors.Blue; Console.WriteLine(c); // Blue
75
76
Contd.
Class Enumtest { public static void main() { area a1 = new area(); a1.areashape(15, area.Shape.circle); a1.areashape(15, area.Shape.square); a1.areashape(15, (area.Shape) 1); a1.areashape(15, (area.Shape) 10); } }
77
GetName()
Retrieves the name for the constant in the enumeration Returns the type of enumeration
(Colors))); // System.Int32
GetUnderlyingType() Console.WriteLine(Enum.GetUnderlyingType(typeof
GetValues()
IsDefined() Parse()
Gives an array of values of the constants in enumeration To check whether a constant exists in enum
if (Enum.IsDefined(typeof(Colors), "Blue") .
Example [enumeration]
Array obj = Enum.GetValues(typeof(Colors)); foreach(Colors x in obj) { Console.WriteLine(x.ToString()); Console.WriteLine("int = {0}", Enum.Format(typeof(Colors), x, "D")); } Output
Red int = 0 Blue int = 1 Green int = 2
79
System.Object
Every C# data type is derived from the base class called System.Object
class HelloClass { .... } // implicitly derive system.object is same as class HelloClass : System.Object { ....} // explicitly deriving
80
Example
Instance level members are declared using virtual keyword namespace System
{
public Object(); public virtual Boolean Equals(Object(obj); public virtual Int32 GetHashCode(); public Type GetType();
.. } }
81
GetHashCode()
GetType() ToString() Finalize()
MemberwiseClone()
Example
// ObjTest.cs using System; class ObjTest { public static void Main (string [ ] args) { ObjTest c1 = new ObjTest();
Console.WriteLine("ToString: {0}", c1.ToString()); Console.WriteLine("GetHashCode: {0}", c1.GetHashCode()); Console.WriteLine("GetType: {0}", c1.GetType().BaseType); // create second object ObjTest c2 = c1; object o = c2; if (o.Equals(c1) && c2.Equals(o)) Console.WriteLine("Same Instance"); } }
83
84
Overriding ToString()
To format the string returned by System.Object.ToString()
using System.Text;
class Person { public override string ToString() { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[FName = {0}", this.firstName); sb.AppendFormat("LName = {0}", this.lastName); sb.AppendFormat("SSN = {0}", this.SSN); sb.AppendFormat("Age = {0}]", this.age); return sb.ToString(); } }
85
Overriding Equals()
Equals() returns true if and only if the two objects being compared reference the same object in memory We can override this behavior and design when two objects have the same value (value-based). That is, when name, SSN, age of two objects are equal, then return true else return false.
86
Example
class Person { public override bool Equals(object o) { Person temp = (Person) o; if (temp.firstName == this.firstName && temp.lastName == this.lastName && temp.SSN == this.SSN && temp.age == this.age) return true; else return false; } }
Overriding GetHashCode()
When a class override Equals(), it should also override GetHashCode() Returns All custom types will be put in a System.Collections.Hashtable type. The Equals() and GetHashCode() methods will be called behind the scene to determine the correct type to return from the container Generation of hash code can be customized. In our example we shall use SSN a String member that is expected to be unique Example: refer to: Override.cs
public override int GetHashCode()
{ return SSN.GetHashCode(); }
C# Data Types
C# Alias
sbyte
byte short ushort int uint long ulong char float
System Type
System.SByte
System.Byte System.Int16 System.UInt16 System.Int32 System.UInt32 System.UInt64 System.UInt64 System.Char System.Single
Range
-128 to 127
0 to 255 -32768 to 32767 0 to 65535 -2,147,438,648 to +2,147,438,647 0 to 4,294,967,295 -9,223,372,036,854,775,808 to +9,.. 0 to 18,446,744,073,709,551,615 U10000 to U1FFFF 1.510-45 to 3.41038
double bool
decimal string object
System.Double System.Boolean
System.Decimal System.String System.Object
Decimal
Double Int16 Int32 Int64
MulticastDelegate
SByte
Contd..
All value types permitted to create a system type using the new keyword. It sets default value to the variable. Eg: bool b1=new bool(); // b1 = false bool b2=false; Integer data type properties UInt16.MaxValue UInt16.MinValue Eg: static void Main(string[] args) { System.UInt16 myuint=30000; Console.WriteLine(Max value:{0}, UInt16.MaxValue); Console.WriteLine(Max value:{0}, UInt16.MinValue);
}
91
Contd
Double
Members of System.Boolean
Valid assignment is true or false. Cant assign values like (-1,0,1) bool.FalseString bool.TrueString
Members of System.Char
92
Contd
Parsing values from String data
Parsing technique is used to convert textual data into a numerical value Eg: static vaoid Main(string[] args) { bool mybool = bool.parse(true); Console.WriteLine(value of mybool: {0}, mybool); int myint = int.parse(8); Console.WriteLine(value of myint: {0}, myint); .. }
93
Contd
System.DateTime and System.TimeSpan
DateTime type represents specific date & time value Static void Main() {.. DateTime dt=new DateTime(2004, 10, 17) Console.WriteLine(The day of {0} is {1}, dt.Date, dt.DayOfWeek); dt. = dt.Addmonths(2) . }
94
Contd
TimeSpan structure allows to define & transform units of time using various members. static void Main(string[] args) {.. TimeSpan ts=new TimeSpan(4,30,0); Console.WriteLine(ts); Console.WriteLine(ts.subtract(new TimeSpan(0,15,0))); . }
95
Returns a string that represents a substring Create a copy of string in upper or lower case 96
Escape characters
Character \ \ \\ \a \n ]r \t Meaning Single quote Doubl quote Insert backslash Beep New Line Carriage return Horizontal tab
98
Verbatim Strings
@ prefixed string literals notation termed as verbatim string Using verbatim string Disable the process of literals escap characters Console.WriteLine(@C:\myapp\bin\debug); Preserve white space for strings the flow over multiple lines String mystring= @ This is a very very long string; Console.Write(mystring); Insert a double quote by doubling tokel Console.WriteLine(@ this is verbatim string);
99
System.Text.StringBuilder
Like Java, C# strings are immutable. This means, strings can not be modified once established For example, when you send ToUpper() message to a string object, you are not modifying the underlying buffer of the existing string object. Instead, you return a fresh copy of the buffer in uppercase It is not efficient, sometimes, to work on copies of strings solution? Use StringBuilder from System.Text! System.Text.Stringbuilder provides members like Append, Formet, Insert & Remove
Note: A String is called immutable because its value cannot be modified once it has been created. Methods that appear to modify a String actually return a new String containing the modification. If it is necessary to modify the actual contents of a stringlike object, use the System.Text.StringBuilder class.
100
Example
using System; using System.Text; class MainClass { public static void Main() { StringBuilder myBuffer = new StringBuilder("Buffer"); Console.WriteLine(Capacity of the string:{0}, myBuffer.Capacity); myBuffer.Append( " is created"); Console.WriteLine(Capacity of the string:{0}, myBuffer.Capacity); Console.WriteLine(myBuffer);
}
}
101
Stack Class.
class StaticMethod { public static void Main(string[] args) { Console.WriteLine("Stack Contents:"); Stack.Push("BIT"); Stack.Push("GAT"); Stack.Show(); Console.WriteLine("Item Popped=> " + Stack.Pop()); Console.WriteLine("Stack Contents:"); Stack.Show(); } }
Arrays in C#
C# arrays are derived from System.Array base class Memory for arrays is allocated in heap Arrays always have a lower bound of zero Example
Int [ ] counter; // array declaration string [ ] strArray = new string[10]; // string array int [ ] intArray = new int [10]; // integer array Person[ ] Staff = new Person[2]; // object array strAarray[0] = "BIT"; // assign some value int [ ] Age = new int[3] {25, 45, 30}; // array initialization
104
Arrays in C#
Assign an array object to another eg: int [ ] a ={1,2,3}; int [ ] b; b=a; Array can also hold reference type elements but they contain only references to the elements & not the actual values.
105
106
Multidimensional Arrays
Rectangular Array
int[ , ] myMatrix; // declare a rectangular array int[ , ] myMatrix = new int[2, 2] { { 1, 2 }, { 3, 4 } }; // initialize myMatrix[1,2] = 45; // access a cell
Jagged Array
int[ ][ ] myJaggedArr = new int[2][ ]; // 2 rows and variable columns for (int i=0; i < myJaggedArr.Length; i++) myJaggedArr[i] = new int[i + 7]; Note that, 1st row will have 7 columns and 2nd row will have 8 columns 107
GetLength( ) Length
GetLowerBound( ) GetUpperBound( ) GetValue( ) SetValue( ) Reverse( ) Sort( )
Example
Using System; Class sortReverse { public static void Main(string[ ] args) { int[ ] x= {30, 10, 80, 90,20}; Console.WriteLine("Array before sorting"); foreach(int I in x) Console.WriteLine( +i); Console.WriteLine();; Array.sort(x); Array.Reverse(x); Console.WriteLine("Array after sorting"); foreach(int I in x) Console.WriteLine( +i); Console.WriteLine();; } }
109
Example
public static int[ ] ReadArray( ) // reads the elements of the array { int[ ] arr = new int[5]; for (int i = 0; i < arr.Length; i++) arr[i] = arr.Length - i; return arr; } public static int[ ] SortArray(int[ ] a) { System.Array.Sort(a); // sorts an array return a; }
110
Calling Program
public static void Main(string[ ] args) { int[ ] intArray; intArray = ReadArray( ); // read the array elements Console.WriteLine("Array before sorting"); for (int i = 0; i < intArray.Length; i++) Console.WriteLine(intArray[i]); intArray = SortArray(intArray); // sort the elements Console.WriteLine("Array after sorting"); for (int i = 0; i < intArray.Length; i++) Console.WriteLine(intArray[i]); }
111
String Manipulations in C#
A string is a sequential collection of Unicode characters, typically used to represent text, while a String is a sequential collection of System.Char objects that represents a string. If it is necessary to modify the actual contents of a string-like object, use the System.Text.StringBuilder class. Members of String perform either an ordinal or linguistic operation on a String.
ordinal: acts on the numeric value of each Char object. linguistic: acts on the value of the String taking into account culture-specific casing, sorting, formatting, and parsing rules.
Sort rules determine the alphabetic order of Unicode characters and how two strings compare to each other.
For example, the Compare method performs a linguistic comparison while the CompareOrdinal method performs an ordinal comparison. Consequently, if the current culture is U.S. English, the Compare method considers 'a' less than 'A' while the CompareOrdinal method considers 'a' greater than 'A'.
112
Strings
For string comparisons, use
Compare, CompareOrdinal, CompareTo(), Equals, EndsWith, and StartsWith Use IndexOf, IndexOfAny, LastIndexOf, and LastIndexOfAny Copy and CopyTo Substring and Split
To copy a string a substring, use To create one or more strings, use To change the case, use
ToLower and ToUpper
Insert, Replace, Remove, PadLeft, PadRight, Trim, TrimEnd, and TrimStart
114
Insert() - Inserts a specified instance of String at a specified index position in this instance.
Structures in C#
Structures can contain constructors (must have arguments). We can't redefine default constructors It can implement interfaces Can have methods in fact, many! There is no System.Structure class!
116
Example
using System; struct STUDENT { public int RegNo; public string Name; public int Marks; public STUDENT(int r, string n, int m) { RegNo = r; Name = n; Marks = m; } } class MainClass { public static void Main() { STUDENT Geetha; Geetha.RegNo = 111; Geetha.Name = "Geetha"; Geetha.Marks = 77; STUDENT SomeOne = new STUDENT(222,"Raghu",90); }
118
Example
Assume that you are developing a collection of graphic classes: Square, Circle, and Hexagon To organize these classes and share, two approaches could be used:
// shapeslib.cs using MyShapes; {
public class Square { } public class Circle { } public class Hexagon { }
}
120
Alternate Approach
// Square.cs using System; namespace MyShapes { class Square { } } // Circle.cs using System; namespace MyShapes { class Circle { } } // Heagon.cs using System; namespace MyShapes { class Hexagon { } }
All the three classes Square, Circle, and Hexagon are put in the namespace
MyShapes using System; using MyShapes; namespace MyApplication { class ShapeDemo { .. Square sq = new Square(); Circle Ci = new Circle(); Heagone he = new Heagon(); . } } defined in MyShapes namespace
The class Square is define in both the namespaces (MyShapes and My3DShpaes) To resolve this name clash, use
My3DShapes. Square Sq = new My3DShapes.Square();
Qualify the name of the class with the appropriate namespace The default namespace given in VS IDE is the name of the project
122
Namespace MyaApp { class ShapeTester { Public static void Main() { A.Hexagon h=new A.Hexagon(); A.Circle c = new A.Circle() A h2=new a(); // creating an object using alias }}}
123
Neated Namespaces
Eg: to create a higher level namespace that contains exisiting My3DShapes namespace, update the previous codes as follows: Usinf System; namespaceNest { Namespace My3DShapes; { class Square { } class Circle { } class Hexagon { } }} Or Using System; Namespace Nest.My3DShapes { class Square { } class Circle { } class Hexagon { } }}
124
End of
Chapter 3