0% found this document useful (0 votes)
18 views

Lect 25-26 (Introduction To CSharp)

C# is introduced as a component oriented, object-oriented language that is part of the C/C++ family. Key aspects of C# discussed include everything being an object, robust and durable software through features like garbage collection, and preservation of investment through interoperability. The document provides examples of C# programs, data types, arrays, control flow, expressions and operators, and exception handling.

Uploaded by

Git gamel
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
18 views

Lect 25-26 (Introduction To CSharp)

C# is introduced as a component oriented, object-oriented language that is part of the C/C++ family. Key aspects of C# discussed include everything being an object, robust and durable software through features like garbage collection, and preservation of investment through interoperability. The document provides examples of C# programs, data types, arrays, control flow, expressions and operators, and exception handling.

Uploaded by

Git gamel
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 75

CS-306 Web Engineering

LECTURE 25 (INTRODUCTION TO C#)


Awais Mehmood
Department of Computer Science
University of Engineering and Technology, Taxila
[email protected]

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA., PAKISTAN 1


C# - The big ideas!
 The first component-oriented language in the C/C++ family
 Everything really is an object
 Next generation robust and durable software
 Preservation of investment

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


A Component Oriented Language
C# is the first “component oriented” language in the C/C++ family
Component concepts are first class:
◦ Properties, methods, events
◦ Design-time and run-time attributes
◦ Integrated documentation using XML
Enables one-stop programming
◦ No header files, IDL, etc.
◦ Can be embedded in web pages

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Everything really is an object
Traditional views
◦ C++, Java: Primitive types are “magic” and do not interoperate with
objects
◦ Smalltalk, Lisp: Primitive types are objects, but at great performance cost
C# unifies with no performance cost
◦ Deep simplicity throughout system
Improved extensibility and reusability
◦ New primitive types: Decimal, SQL…
◦ Collections, etc., work for all types

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Robust and durable software
Garbage collection
◦ No memory leaks and stray pointers
Exceptions
◦ Error handling is not an afterthought
Type-safety
◦ No uninitialized variables, unsafe casts

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Preservation of Investment
C++ heritage
◦ Namespaces, enums, unsigned types, pointers (in unsafe code), etc.
Interoperability
◦ C# implementation talks to XML, SOAP, COM, DLLs, & any .NET language
Millions of lines of C# code in .NET
◦ Short learning curve
◦ Increased productivity

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Writing a Hello World program
using System;

class Hello
{
static void Main() {
Console.WriteLine("Hello world");
}
}

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


C# Program Structure
Namespaces
◦ Contain types and other namespaces
Type declarations
◦ Classes, structs, interfaces, enums, and delegates
Members
◦ Constants, fields, methods, properties, indexers, events, operators,
constructors, destructors
Organization
◦ No header files, code written “in-line”

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


C# Program Structure
using System;

namespace System.Collections
{
public class Stack
{
Entry top;

public void Push(object data) {


top = new Entry(top, data);
}

public object Pop() {


if (top == null) throw new InvalidOperationException();
object result = top.data;
top = top.next;
return result;
}
}
}

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Type System
Value types
◦ Directly contain data
◦ Cannot be null
Reference types
◦ Contain references to objects
◦ Can be null int i = 123;
string s = "Hello world";

i 123

s "Hello world"

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Type System
Value types
◦ Primitives int i;
◦ Enums enum State { Off, On }
◦ Structs struct Point { int x, y; }
Reference types
◦ Classes class Foo: Bar, IFoo {...}
◦ Interfaces interface IFoo: IBar {...}
◦ Arrays string[] a = new string[10];
◦ Delegates delegate void Empty();

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Predefined Types
C# predefined types
◦ Reference object, string
◦ Signed sbyte, short, int, long
◦ Unsigned byte, ushort, uint, ulong
◦ Character char
◦ Floating-point float, double, decimal
◦ Logical bool
Predefined types are simply aliases for system-provided types
◦ For example, int == System.Int32

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


C# Primitive C# Alias Description
Boolean bool Indicates a true or false value. The if, while, and do-while
constructs require expressions of type Boolean.
Byte byte Numeric type indicating an unsigned 8-bit value.
Char char Character type that holds a 16-bit Unicode character.
Decimal decimal High-precession numerical type for financial or scientific
applications.
Double double Double precision floating point numerical value.
Single float Single precision floating point numerical value.
Int32 int Numerical type indicating a 32-bit signed value.
Int64 long Numerical type indicating a 64-bit signed value.
SByte sbyte Numerical type indicating an 8-bit signed value.
Int16 short Numerical type indicating a 16-bit signed value.
UInt32 uint Numerical type indicating a 32-bit unsigned value.
UInt64 ulong Numerical type indicating a 64-bit unsigned value.
UInt16 ushort Numerical type indicating a 16-bit unsigned value.
String string Immutable string of character values
Object object The base type of all type in any managed code.

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Arrays
Array declaration and initialization is similar to other languages
// A one dimensional array of 10 Bytes
Byte[] bytes = new Byte[10];

// A two dimensional array of 4 Int32s


Int32[,] ints = new Int32[5,5];

// A one dimensional array of references to Strings


String[] strings = new String[10];

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Arrays
The array itself is an object
◦ Automatically derived from the Array class in the FCL (Framework
Class Library)
◦ This enables a number of useful methods of Array class to be used
◦ Finding the length of an array
◦ Finding the number of dimensions of an array, etc.
Arrays are reference types although,
◦ Their elements can be value types, or reference types

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Control Flow
Control flow statements in C# are the same as for C++ and Java
◦ if {} else{}
◦ for {}
◦ do{} while()
◦ etc
However, there is one additional new one in C#!
◦ foreach

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Foreach
foreach simplifies the code for iterating through an array

foreach (type identifier in arrayName)

◦ There is no loop counter


◦ If the loop counter variable is required in the loop, then a for
construct must be used
◦ The type must match the type of elements in the array
◦ The array cannot be updated inside the loop

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


//Foreach - Example
using System;

public class ForEachTest


{
static void Main(string[] args)
{
int[] array ={ 0, 2, 4, 6, 8, 10, 12, 14};

int total = 0;

foreach (int n in array)


{
total += n;
Console.WriteLine("adding “ +n+ ", Total = " + total);
}
Console.WriteLine("Array total= " + total);
} DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Output

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Expressions and Operators
◦ C# is a strongly typed language
◦ Variables are declared before use
◦ Implicit type conversions that don’t lose precision will be carried out
◦ Unlike C++ (but like Java) C# has a Boolean type
◦ Thus the following code generates a compilation error

Int32 x = 10;
while(x--)
DoSomething();

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Expressions and Operators
C# has the standard set of operators we are familiar with
Also it has operators such as is and typeof for testing variable type
information
C# provides operator overload functions
◦ as does C++ but not Java

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Operator category Operators
Arithmetic + - * / %
Logical (boolean and bitwise) & | ^ ! ~ && || true false
String concatenation +
Increment, decrement ++ --
Shift << >>
Relational == != < > <= >=
Assignment = += -= *= /= %=
&= |= ^= <<= >>=
Member access .
Indexing []
Cast ()
Conditional (Ternary) ?:
Delegate concatenation and removal + -
Object creation New
Type information is sizeof typeof
Overflow exception control checked unchecked
Indirection and Address * -> [] &
Exception Handling
◦This is always done in C# using structured exception handling
◦ Use of the try{} catch{} mechanism as in Java and C++
◦ Functions should throw exceptions
◦ This is done universally by methods in FCL classes

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


public static void ExceptionExample()
{
// try-catch
try{
Int32 index = 10;
while(index-- != 0)
Console.WriteLine(100/index);
}
catch(DivideByZeroException) {
Console.WriteLine("A divide by zero exception!");
}
Console.WriteLine("Exception caught; code keeps running");

// try-finally
try{
return;
}
finally {
Console.WriteLine("Code in finally blocks always runs");
}
}
Output

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Classes
Single inheritance
Multiple interface implementation
Class members
◦ Constants, fields, methods, properties, indexers, events, operators,
constructors, destructors
◦ Static and instance members
◦ Nested types (inner classes)
Member access
◦ public, protected, internal, private

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Structs
Like classes, except
◦ Stored in-line, not heap allocated
◦ Assignment copies data, not reference
◦ No inheritance
Ideal for light weight objects
◦ Complex, point, rectangle, color
◦ int, float, double, etc., are all structs
Benefits
◦ No heap allocation, less GC pressure
◦ More efficient use of memory
DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Classes and Structs
class CPoint { int x, y; ... }
struct SPoint { int x, y; ... }

CPoint cp = new CPoint(10, 20);


SPoint sp = new SPoint(10, 20);
10
sp
20

cp CPoint
10
20

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Interfaces
Multiple inheritance
Can contain methods, properties, indexers, and events
Private interface implementations
interface IDataBound
{
void Bind(IDataBinder binder);
}

class EditBox: Control, IDataBound


{
void IDataBound.Bind(IDataBinder binder) {...}
}
DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Enums
Strongly typed
◦ No implicit conversions to/from int
◦ Operators: +, -, ++, --, &, |, ^, ~
Can specify underlying type enum Color: byte
◦ Byte, short, int, long {
Red = 1,
Green = 2,
Blue = 4,
Black = 0,
White = Red | Green | Blue,
}
DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Delegates
Object oriented function pointers
Multiple receivers
◦ Each delegate has an invocation list
Foundation for events

delegate double Func(double x);

Func func = new Func(Math.Sin);


double x = func(1.0);

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


using System;
delegate int NumberChanger(int n);
namespace DelegateApp {
class TestDelegate {
static int num = 10;

public static int AddNum(int p) {


num += p;
return num;
}
public static int MultNum(int q) {
num *= q;
return num;
}
public static int getNum() {
return num;
}
DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
static void Main(string[] args) {
Console.WriteLine("Value of Num before: {0}", getNum());

//create delegate instances


NumberChanger add = new NumberChanger(AddNum);
NumberChanger mult = new NumberChanger(MultNum);

//calling the methods using the delegate objects


add(25);
Console.WriteLine("Value of Num after AddNum: {0}", getNum());
mult(5);
Console.WriteLine("Value of Num after MultNum: {0}", getNum());
Console.ReadKey();
}
}
}
DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Output

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Unified Type System
Everything is an object
◦ All types ultimately inherit from object
◦ Any piece of data can be stored, transported, and manipulated with no
extra work

object

Stream Hashtable int double

MemoryStream FileStream

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Unified Type System
Boxing (Up-casting)
◦ Allocates box, copies value into it
Unboxing (Down-casting)
◦ Checks type of box, copies value out int i = 123;
object obj = i;
int j = (int)obj;

i 123

o System.Int32
123
j 123

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Component Development
What defines a component?
◦ Properties, methods, events
◦ Integrated help and documentation
◦ Design-time information
Components are easy to build and consume

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


public class HealthComponent
{ private int health The Health
healtpublic HealthComponent(int initialHealth)
{
Component
health = initialHealth;
}
public void TakeDamage(int damage)
{
health -= damage;
Console.WriteLine($"Health reduced by {damage}. Current health: {health}“
}
public void Heal(int amount)
{
health += amount;
Console.WriteLine($"Health increased by {amount}. Current health: {health}");
}

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


public class Player
{
private HealthComponent healthComponent; The Player Class
public Player()
{
healthComponent = new HealthComponent(100);
}
public void TakeDamage(int damage)
{
healthComponent.TakeDamage(damage);
}
public void Heal(int amount)
{
healthComponent.Heal(amount);
}
}

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


The Main Program
public class Program
{
public static void Main()
{
Player player = new Player();
player.TakeDamage(20);
player.Heal(10);
}
}
This example demonstrates the component-oriented approach by separating concerns related to health into a dedicated
HealthComponent. This allows for modularity and reusability, as the HealthComponent can be used in other entities or systems
throughout the codebase.

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Properties
Properties are “smart fields”
◦ Natural syntax, accessors, inlining public class Button: Control
{
private string caption;

public string Caption {


get {
return caption;
}
set {
caption = value;
Repaint();
}
} Button b = new Button();
} b.Caption = "OK";
String s = b.Caption;
Events Handling
Define and register event handler
public class MyForm: Form
{
Button okButton;

public MyForm() {
okButton = new Button(...);
okButton.Caption = "OK";
okButton.Click += new EventHandler(OkButtonClick);
}

void OkButtonClick(object sender, EventArgs e) {


ShowMessage("You pressed the OK button");
}
}
CS-306 Web Engineering
LECTURE 26 (WRITING APPLICATIONS C#)
Awais Mehmood
Department of Computer Science
University of Engineering and Technology, Taxila
[email protected]

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA., PAKISTAN 45


C#
 C# derives it’s power from .NET and the framework class library
 The most similar language to C# is Java
 There are several striking similarities
 BUT there is one fundamental difference
 Java runs on a virtual machine and is interpreted
 C# programs run in native machine code
 This is because of the power of .NET and leads to much more
efficient programs

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Writing applications in C#
An application in C# can be one of three types
◦ Console application (.exe)
◦ Windows application (.exe)
◦ Library of Types (.dll)
The .dll is not executable
These 3 types exclude the more advanced web-based applications

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Writing applications in C#
After we have looked at the more detailed structure and syntax of C#
programs, we will show a simple example of each type
In each case we will use the command line compiler (csc) to create the
binary (assembly)
◦ Later in this lecture we will look at using Visual Studio to create our
applications

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Writing applications in C#
Example 1 – A console application
◦ This example inputs a number from the console and displays the square root
back to the console
◦ Uses a simple iterative algorithm rather than calling a Math library function

How to compile using CSC

c:\windows\Microsoft.NET\Framework\v3.5\bin\csc.exe /t:exe
/out:MyApplication.exe MyApplication.cs

Or
CSC ApplicationName.cs
DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
using System;
class Square_Root
{
static void Main(string[] args)
{
double a,root;
do
{
Console.Write("Enter a number: ");
a=Convert.ToDouble(Console.ReadLine());
if (a<0)
Console.WriteLine(“Enter a positive number!");
} while (a<0);
root=a/2;
double root_old;
do
{
root_old=root;
root=(root_old+a/root_old)/2;
} while (Math.Abs(root_old-root)>1.0E-6);
Console.WriteLine("The square root of " + a + " is " + root);
}
} DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Writing applications in C#
We can see that everything in a C# application is in a class
In this case the class defines a program entry point Main
◦ This makes the application binary an executable
Note the use of the System namespace
◦ Classes referred to, such as Console and Math, are actually
System.Console and System.Math

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Writing applications in C#
Example 2 – A windows application
◦A simple GUI displaying a menu
◦ This example displays a window with couple of menu buttons
◦ Clicking on a menu button displays a pop-up dialog box

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


using System;
using System.Drawing;
using System.Windows.Forms;

class App{
public static void Main(){
Application.Run(new MenuForm());
}
}

class MenuForm:Form{
public MenuForm(){
this.ContextMenu = new ContextMenu(SetupMenu());
this.Menu = new MainMenu(SetupMenu());
}

MenuItem[] SetupMenu(){
MenuItem file = new MenuItem("&File");
file.MenuItems.Add("Exit", new EventHandler(OnExit));
MenuItem messages = new MenuItem("&Message Boxes");
EventHandler handler = new EventHandler(OnMessageBox);
messages.MenuItems.Add("Message Box 1", handler);
messages.MenuItems.Add("Message Box 2", handler);
return new MenuItem[]{file,
DEPARTMENT OFmessages};
COMPUTER SCIENCE, UET TAXILA
void OnExit(Object sender, EventArgs args){
this.Close();
}

void OnMessageBox(Object sender, EventArgs args){


MenuItem item = sender as MenuItem;
MessageBox.Show(this, "You selected menu item -
"+item.Text);
}
}

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Writing applications in C#

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


using System;
using System.Windows.Forms;

public class MyForm : Form


{
private Button myButton;
public MyForm()
{
// Create a button
myButton = new Button();
myButton.Text = "Click Me!";
myButton.Click += MyButton_Click;

// Set the form properties


Text = "My Windows Application";
Controls.Add(myButton);
}
DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
private void MyButton_Click(object sender, EventArgs e)
{
MessageBox.Show("Button clicked!");
}
}

public class Program


{
public static void Main()
{
// Create and run the form
Application.Run(new MyForm());
}
}

To run code: csc /taget:winexe myButtonApp.cs


DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Writing applications in C#

This program is considerably more complex than the previous example


It uses the System.Drawing and System.Windows.Forms namespaces
◦ The (System.Windows.Forms).Form class is a standard outer graphics
container for most windows/GUI applications
It also uses event handling to respond to user interaction
◦ (menu button clicks)

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Writing applications in C#
Example 3 – A library
◦ We can take some of the code from example 1 for computing the square root
and make it a library
◦ It will not have a Main method
◦ We indicate that we are compiling to a .dll using the /Target:library option

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


using System;

public class Square_Root_Class


{
public static double calcRoot(double number)
{
double root;
root=number/2;
double root_old;
do
{
root_old=root;
root=(root_old+number/root_old)/2;
} while (Math.Abs(root_old-root)>1.0E-6);

return root;
}
} DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Writing applications in C#

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Writing applications in C#
We can now write a simple program containing a Main method
which uses this library class
◦ The only thing we need to do is to reference the library .dll using the /r switch
when we compile the application

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


using System;

class Square_Root
{
static void Main(string[] args)
{
double a,root;
do
{
Console.Write("Enter a number: ");
a=Convert.ToDouble(Console.ReadLine());
if (a<0)
Console.WriteLine("Please enter a positive number!");
} while (a<0);

root=Square_Root_Class.calcRoot(a);

Console.WriteLine("The square root of " + a + " is " + root);


}
}

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Writing applications in C#

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Visual Studio .NET
VS.NET is an Integrated Development Environment or IDE
◦ It includes a source code editor
◦ usually pretty fancy ones containing language help features
◦ Software project management tools
◦ Online-help and
◦ Debugging
◦ GUI design tools
◦ And lots more......

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Visual Studio .NET (Creating a new Project)
Creating a new project gives the user the option of the language and
project type
◦ Visual Basic, C++, C#, J#
◦ Console, Windows, Class Library, Active Web Page or Web Service

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Visual Studio .NET

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Visual Studio .NET (Solutions)
We can group our projects under a common solution
◦ Each application has just one solution but may comprise many
projects
◦ A single solution can comprise projects written in different languages
Each project contains a number of files including
◦ source files, executables and xml files containing information about the
project and resources

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Visual Studio .NET (Solutions)
We can add each of our previous 3 example applications (projects) to
a single solution Learning C Sharp
◦ Its a simple matter to flip between them and view the code from each project
by selecting the appropriate tab
◦ Each project must be built (compiled) before executing and any of the projects
in a solution can be selected to be executed

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Visual Studio .NET (Adding references)
It is a simple matter to reference a .dll from a project
We can check all the references that a project makes by expanding
the References menu item in the solution explorer
◦ Notice for the windows project, lots of FCL classes are referenced

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA
Visual Studio .NET (Visual Programming)
An important feature of VS is its ability to enable visual programming
◦ We can create sophisticated GUI’s without writing a line of code
◦ We simply add GUI components to an outer window (a Form) and
set up the properties of the components to get the required look
and feel
◦ VS allows us to easily switch between code and design views
◦ We will look more into visual programming in a future lecture

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


References
http://msdn.microsoft.com/net
◦ Download .NET SDK and documentation
http://msdn.microsoft.com/events/pdc
◦ Slides and info from .NET PDC
news://msnews.microsoft.com
◦ microsoft.public.dotnet.csharp.general

DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA


Thank you!
DEPARTMENT OF COMPUTER SCIENCE, UET TAXILA

You might also like