Introduction to C#




         Lecture 2
            FCIS
Summer 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 KeyUp
 private 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.

C# Summer course - Lecture 2

  • 1.
    Introduction to C# Lecture 2 FCIS Summer training 2010, 1st year.
  • 2.
    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
  • 3.
    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...
  • 4.
    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 ?
  • 5.
    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"
  • 6.
    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...
  • 7.
    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”); };
  • 8.
    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
  • 9.
    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); }
  • 10.
    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
  • 11.
    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);
  • 12.
    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
  • 13.
    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);
  • 14.
    The graphics classis 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.
  • 15.
    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.
  • 16.
    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.
  • 17.
    Obtaining a Graphicswithout 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()
  • 18.
    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
  • 19.
    KeyDown and KeyUp private 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"; } }
  • 20.
    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...)
  • 21.
    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.
  • 22.
    Sample program  The "MoveImageWithKeyboard" sample.
  • 23.
    Next time...  Creating your own classes.