c# summer course - lecture 2

Post on 01-Nov-2014

881 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

C# summer training for FCIS, 2010. Lecture 2

TRANSCRIPT

Introduction to C#

Lecture 2

FCISSummer training 2010, 1st year.

Contents

References and reference types. Arrays in C# The List<T> generic collection. foreach Graphics and OnPaint( ) KeyDown, KeyUp and KeyPress Example: Controlling a picture w/ the keyboard

References In C#, classes are an example of reference

types. Variables whose type is a reference type follow

reference semantics: The variables stores a reference to the object, not the object itself.

Values who have a reference type and are not initialized have the value of null

In the assignment:

x = y

x does not take a copy of the object y refers to, but takes a copy of the reference.

Let's see this with the debugger...

References - quiz class Person {

public string name;

}

class Test {

static void Main() {

Person p1, p2, p3;

p1 = new Person( );

p1.Name = "Ramy";

p2 = p1;

p3 = p2;

p2 = new Person( );

p2.Name = "Saif";

p3.Name = "Samar";

}

}

What's the final value of p1.name, p2.name and p3.name ?

Value types Consider the following code:

Person x, y;

x = new Person( );

x.Name = “samy”;

y = x;

y.Name = "Maher";

Now what will be the value of x.Name? If Person is a class, then x and y will be references to

the same object, and x.Name will become "Maher" If Person is a struct, y=x will make a copy of x and

assign it to y, so y will be a different object. In this case, x.Name will remain "Samy" and y.Name

will be "Maher"

Value types This means that structs in C# are very different from

classes, while in C++ structs and classes are almost the same.

The C# basic data types (int, float...) are value types (in fact, they are considered structs by the language).

Many types in the .net libraries are value types, Like System.Drawing.Point and System.Drawing.Rectangle

The C# type system can convert value-typed objects into references by boxing and convert references into value-type objects by unboxing. But this is beyond the scope of this course...

Arrays C# arrays declare the full type before the array name

C++: int x[10];

C#: int[ ] x;

Since arrays are reference types; their value is null until initialized:

int[ ] x; // x is null

x = new int[10]; // x is now an array object

If we declare an array of reference types (e.g an array of buttons) then all elements are null until initialized:

Button[ ] arr = new Button[10];

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

arr[i] = new Button( );

}

C# has array literals:

int[] arr = {1, 2, 3, 4, 5};

Person[] team = new Person[] { new Person(“Ahmed”); new Person(“Omar”), new Person(“Kamal”); };

Generics and List<T> The List<T> class works like an array, but auto-expands when you add more

elements to it.

This is a generic class: To make instances of this class, you must specialize it by replacing the parameter T with a real type. For example:

List<int> myList;

myList = new List<int>;

List<Person> people = new List<Person>( );

Some useful methods and properties in List<T>:

void Add(T value)

bool Remove(T value) , void RemoveAt(int index)

void Clear( ), int IndexOf(T value)

The Count property

List<T> can be indexed with the [ ] operator like and array

List<T> has brothers and sisters in the .net libraries, like Stack<T>, Queue<T> and Dictionary<T1, T2>

Most of them live in the System.Collections.Generic namespace

Foreach Foreach is used to iterate over data in a collection

Syntax:

foreach(<Type> <var> in <collection>)

{

<code>

}

Example:

int[ ] arr = {1, 2, 3, 4}

foreach(int x in arr)

{

Console.WriteLine(x);

}

Foreach Foreach does not work only on arrays, it works on

many, many collection classes: It works on List<T> It works on combo box and list box items It works on all of .net's data structures It works in many other places...

When creating your own data structures, you can make them support foreach

The System.Drawing.Graphics class Graphics is a class that represents something with

drawing capabilities (screen, window, printer....) Some useful methods in this class: g.DrawLine(Pen p, Point pt1, Point pt2); g.DrawLine(Pen p, int x1, int y1, int x2, int y2); g.DrawRectangle(Pen p, Rectangle r); g.DrawRectangle(Pen p, int x, int y, int width,

int height); g.DrawEllipse(Pen p, Rectangle r); g.DrawEllipse(Pen p, int x, int y, int width,

int height);

Pen? A pen is an object used by Graphics to draw lines (like

a real pen). How to obtain a pen?

Use the ready-made pens like Pens.Black or Pens.Brown

Use one of the constructors for the class System.Drawing.Pen:

− Pen p = new Pen(Colors.White, 12); // Color and //width

− Pen p = new Pen(Color.FromArgb(234, 12, 124), 13); // Color and width also, color defined

// by RGB values, each from 0 to 255

More Graphics functions... g.FillRectangle(Brush b, Rectange r) g.FillRectangle(Brush b, int x, int y, int w, int h) g.FillEllipse(Brush b, Rectange r) g.FillEllipse(Brush b, int x, int y, int w, int h) To obtain a brush:

Use a ready-made brush like Brushes.Blue or Brushes.White

Use one of the classes that implement a brush interface:

− Brush b = new SolidBrush(Color.Yellow);− Brush b2 = new LinearGradientBrush(

new Point(0, 10),new Point(200, 10),

Color.Red,Color.Blue);

The graphics class is rich... Drawing images:

Bitmap b = Bitmap.FromFile("...."); g.DrawImage(b, 20, 30);

The Graphics class has many more drawing functions. And even the functions we explained, like DrawLine( ),

have many more varieties.

The paint event Some actions can invalidate the drawing on a form:

Minimizing and then maximizing the window. Moving another program in front of the window then

moving it away. Resizing the window. …

When this happens, the form call the paint event to redraw the window contents.

The paint event private void Form1_Paint(object sender, PaintEventArgs e)

{

}

An object of type PaintEventArgs is given to you in the paint event, it contains two important properties: ClipRectange : the rectangle in which to paint. Graphics : A graphics on which to draw the window

contents. You should use the provided graphics object to draw.

You don't need to use the ClipRectangle but it could lead to faster drawing.

Obtaining a Graphics without Paint I want to draw on the form, but not in the paint event How do I get a graphics? Ask the form to get one for you:

void button1_Click(object sender, EventArgs e)

{

Graphics g = this.CreateGraphics();

g.DrawLine(Pens.Black, 0, 0, 100, 100);

g.Dispose( );

} You should not dispose the graphics in the

PaintEventArgs, but you need to dispose it if you got it from CreateGraphics()

KeyDown and KeyUp The KeyDown event is called when the user pushes a

key on the keyboard. The KeyUp event is called when the user releases the

key. The event, like paint( ), has a parameter with additional

information. It's type is KeyEventArgs. KeyEventArgs has many useful properties, including:

Boolean properties called "Alt", "Control" and "Shift" to tell if those keys were pressed during the event.

A "KeyCode" property. Its type is the enumeration Keys

− In C#, enum values are in the form enumName.valueName

KeyDown and KeyUpprivate void Form1_KeyDown(object sender,

KeyEventArgs e)

{

if (e.KeyCode == Keys.Down)

{

text1.Text = "The down arrow was pressed";

}

if (e.Alt == true && e.KeyCode == Keys.Back)

{

text1.Text = "You pressed alt+backspace";

}

}

KeyPress The KeyPress event is called when a character is

generated by the keyboard. It has a KeyPressEventArgs parameter, this

parameter has a property called KeyChar Some differences from KeyDown/KeyUp:

KeyPress can generate several events if the key is held for a while.

KeyPress can generate only printable characters (e.g the page up key has KeyDown/KeyUp but no KeyPress).

The KeyChar parameter is of type char and not KeyCode. The KeyChar differs by keyboard state (e.g it can be a capital or small letter, or an Arabic letter...)

Remarks from MSDN Key events occur in the following order:

1. KeyDown

2. KeyPress

3. KeyUp The KeyChar property is read/write. It can be used to

modify the keypress event data. To make the form handle keyboard events before its

controls, set the form's KeyPreview property to true. After that, the system will also send the event to the

control, unless you set e.Handled property in your form's event-handling method to true.

Sample program The "MoveImageWithKeyboard" sample.

Next time...

Creating your own classes.

top related