Professional Documents
Culture Documents
Chapter 9 (Part 2)
Chapter 9 (Part 2)
Attributes
Attributes are used to associate some important information with methods,Properties and types There are Two types of attributes int C#
You can create your own custom attributes by defining an attribute class, a class that derives directly or indirectly from System.Attribute (which makes identifying attribute definitions in metadata fast and easy). Suppose you want to tag classes and structs with the name of the programmer who wrote the class or struct. You might define a custom Author attribute class:
using System; [AttributeUsage(AttributeTargets.Class|Attribut eTargets.Struct)] public class Author : Attribute { public Author(string name) { this.name = name; version = 1.0; } public double version; string name; }
AttributeUsage has a named parameter, AllowMultiple, with which you can make a custom attribute single-use or multiuse.
[AttributeUsage(AttributeTargets.Class|Attribut eTargets.Struct, AllowMultiple=true)] // multiuse attribute public class Author : Attribute { ... }
Reflection ApI
Reflection provides objects (of type Type) that encapsulate assemblies, modules and types. You can use reflection to dynamically create an instance of a type, bind the type to an existing object, or get the type from an existing object and invoke its methods or access its fields and properties.
// Using GetType to obtain type information: int i = 42; System.Type type = i.GetType(); System.Console.WriteLine(type);
Unsafe Code
The unsafe keyword denotes an unsafe context, which is required for any operation involving pointers. You can use the unsafe modifier in the declaration of a type or a member. The entire textual extent of the type or member is therefore considered an unsafe context. For example, the following is a method declared with the unsafe modifier:
Declaring Pointers
// cs_unsafe_keyword.cs // compile with: / unsafe using System; class UnsafeTest { // unsafe method: takes pointer to int: unsafe static void SquarePtrParam (int* p) { *p *= *p; } unsafe public static void Main() { int i = 5; // unsafe method: uses address-of operator (&) SquarePtrParam (&i); Console.WriteLine (i); } }
Delegates
Overview
A delegate is a reference type that defines a method signature A delegate instance holds one or more methods
Essentially an object-oriented function pointer Methods can be static or non-static Methods can return a value
Delegates
Overview
// Declare
static void DemoDelegates() { Del delInst = new Del(Math.Sin); // Instantiate double x = delInst(1.0); // Invoke }
Delegates
Multicast Delegates
delegates must contain only methods that return void, else there is a run-time exception are invoked sequentially, in the order
added
The += and -= operators are used to add and remove delegates, respectively += and -= operators are thread-safe
Delegates
Multicast Delegates
delegate void SomeEvent(int x, int y); static void Foo1(int x, int y) { Console.WriteLine("Foo1"); } static void Foo2(int x, int y) { Console.WriteLine("Foo2"); } public static void Main() { SomeEvent func = new SomeEvent(Foo1); func += new SomeEvent(Foo2); func(1,2); // Foo1 and Foo2 are called func -= new SomeEvent(Foo1); func(2,3); // Only Foo2 is called }
Delegates
and Interfaces
Could always use interfaces instead of delegates Interfaces are more powerful
Multiple
methods Inheritance
Events
Overview
Event handling is a style of programming where one object notifies another that something of interest has occurred
A
Events allow you to tie your own code into the functioning of an independently created component Events are a type of callback mechanism
Events
Overview
user does something (clicks a button, moves a mouse, changes a value, etc.) and the program reacts in response
events Asynchronous operation completed Email message has arrived A web session has begun
Events
Overview
C# has native support for events Based upon delegates An event is essentially a field holding a delegate However, public users of the class can only register delegates
can only call += and -= They cant invoke the events delegate
They
Multicast delegates allow multiple objects to register with the same event
Events
Example: Component-Side
public class Button { public event EventHandler Click; protected void OnClick(EventArgs e) { // This is called when button is clicked if (Click != null) Click(this, e); }
Events
Example: User-Side
public class MyForm: Form { Button okButton; static void OkClicked(object sender, EventArgs e) { ShowMessage("You pressed the OK button"); } public MyForm() { okButton = new Button(...); okButton.Caption = "OK"; okButton.Click += new EventHandler(OkClicked); } }