/*
Mastering Visual C# .NET
by Jason Price, Mike Gunderloy
Publisher: Sybex;
ISBN: 0782129110
*/
/*
Example13_9.cs illustrates a custom exception
*/
using System;
// declare the CustomException class
class CustomException : ApplicationException
{
public CustomException(string Message) : base(Message)
{
// set the HelpLink and Source properties
this.HelpLink = "See the Readme.txt file";
this.Source = "My Example13_9 Program";
}
}
public class Example13_9
{
public static void Main()
{
try
{
// throw a new CustomException object
Console.WriteLine("Throwing a new CustomException object");
throw new CustomException("My CustomException message");
}
catch (CustomException e)
{
// display the CustomException object's properties
Console.WriteLine("HelpLink = " + e.HelpLink);
Console.WriteLine("Message = " + e.Message);
Console.WriteLine("Source = " + e.Source);
Console.WriteLine("StackTrace = " + e.StackTrace);
Console.WriteLine("TargetSite = " + e.TargetSite);
}
}
}
Language Basics
Exception handle with your own exception class
/*
Learning C#
by Jesse Liberty
Publisher: O'Reilly
ISBN: 0596003765
*/
using System;
namespace ExceptionHandling
{
// custom exception class
class MyCustomException :
System.ApplicationException
{
public MyCustomException(string message):
base(message) // pass the message up to the base class
{
}
}
public class TesterExceptionHandling
{
public void Run()
{
try
{
Console.WriteLine("Open file here");
double a = 0;
double b = 5;
Console.WriteLine ("{0} / {1} = {2}",
a, b, DoDivide(a,b));
Console.WriteLine (
"This line may or may not print");
}
// most derived exception type first
catch (System.DivideByZeroException e)
{
Console.WriteLine(
"
DivideByZeroException! Msg: {0}",
e.Message);
Console.WriteLine(
"
HelpLink: {0}
", e.HelpLink);
}
// catch custom exception
catch (MyCustomException e)
{
Console.WriteLine(
"
MyCustomException! Msg: {0}",
e.Message);
Console.WriteLine(
"
HelpLink: {0}
", e.HelpLink);
}
catch // catch any uncaught exceptions
{
Console.WriteLine(
"Unknown exception caught");
}
finally
{
Console.WriteLine ("Close file here.");
}
}
// do the division if legal
public double DoDivide(double a, double b)
{
if (b == 0)
{
DivideByZeroException e =
new DivideByZeroException();
e.HelpLink=
"http://www.libertyassociates.com";
throw e;
}
if (a == 0)
{
// create a custom exception instance
MyCustomException e =
new MyCustomException(
"Can't have zero divisor");
e.HelpLink =
"http://www.libertyassociates.com/NoZeroDivisor.htm";
throw e;
}
return a/b;
}
static void Main()
{
Console.WriteLine("Enter Main...");
TesterExceptionHandling t = new TesterExceptionHandling();
t.Run();
Console.WriteLine("Exit Main...");
}
}
}
Shows how multiple objects may subscribe to the same event
/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa
Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/
// Subscrib.cs -- Shows how multiple objects may subscribe to the same
// event.
//
// Compile this program with the following command line:
// C:>csc Subscrib.cs
using System;
namespace nsEvents
{
public class Subscrib
{
// Declare an instance of the clsDelegate class. The event variable
// is not static.
static public clsDelegate dlg = new clsDelegate ();
static public void Main ()
{
// Add clsMain to the event list
dlg.DoEvent += new clsDelegate.StringHandler (ShowEvent);
// Create subscribers for the event
clsSubscriber sub = new clsSubscriber ();
clsNextSubscriber sub2 = new clsNextSubscriber ();
// Fire the event.
dlg.FireEvent ("Fired from Main()");
}
static public void ShowEvent (string str)
{
Console.WriteLine ("Main handled event: " + str);
}
}
public class clsDelegate
{
// Declare a delegate for the event
public delegate void StringHandler (string str);
// A variable to hold the delegate
public event StringHandler DoEvent;
// This method will trigger the event.
public void FireEvent (string str)
{
if (DoEvent != null)
DoEvent (str);
}
}
public class clsSubscriber
{
public clsSubscriber ()
{
Subscrib.dlg.DoEvent +=
new clsDelegate.StringHandler (SubscribeEvent);
}
public void SubscribeEvent (string str)
{
Console.WriteLine ("Subscriber handled event: " + str);
}
}
public class clsNextSubscriber
{
public clsNextSubscriber ()
{
Subscrib.dlg.DoEvent +=
new clsDelegate.StringHandler (SubscribeEvent);
}
public void SubscribeEvent (string str)
{
Console.WriteLine ("Next Subscriber handled event: " + str);
}
}
}
Demonstrate passing an object to an event handler and performing the proper cast in the method
/*
C# Programming Tips & Techniques
by Charles Wright, Kris Jamsa
Publisher: Osborne/McGraw-Hill (December 28, 2001)
ISBN: 0072193794
*/
// ObjEvent.cs -- Demonstrate passing an object to an event handler and
// performing the proper cast in the method.
//
// Compile this program with the following command line:
// C:>csc ObjEvent.cs
using System;
namespace nsEvents
{
public class ObjEvent1
{
public delegate void EventHandler (object obj);
public event EventHandler EvInvoke;
public void FireEvent (object obj)
{
if (obj != null)
EvInvoke (obj);
}
static public void Main ()
{
ObjEvent1 main = new ObjEvent1 ();
main.EvInvoke = new ObjEvent1.EventHandler (ObjEvent);
main.FireEvent (42);
main.FireEvent (42.0);
}
static void ObjEvent (object obj)
{
if (obj is double)
{
Console.WriteLine ("Received a double object: " + (double) obj);
}
else if (obj is int)
{
Console.WriteLine ("Received an int object: " + (int) obj);
}
}
}
}
illustrates the use of an event
/*
Mastering Visual C# .NET
by Jason Price, Mike Gunderloy
Publisher: Sybex;
ISBN: 0782129110
*/
/*
Example12_4.cs illustrates the use of an event
*/
using System;
// declare the MeltdownEventArgs class (implements EventArgs)
class MeltdownEventArgs : EventArgs
{
// declare a private field named message
private string message;
// define a constructor
public MeltdownEventArgs(string message)
{
this.message = message;
}
// define a property to get the message
public string Message
{
get
{
return message;
}
}
}
// declare the Reactor class
class Reactor
{
// declare a private field named temperature
private int temperature;
// declare a delegate class named MeltdownHandler
public delegate void MeltdownHandler(
object reactor,
MeltdownEventArgs myMEA
);
// declare an event named OnMeltdown
public event MeltdownHandler OnMeltdown;
// define a property to set the temperature
public int Temperature
{
set
{
temperature = value;
// if the temperature is too high, the reactor melts down
if (temperature > 1000)
{
MeltdownEventArgs myMEA =
new MeltdownEventArgs("Reactor meltdown in progress!");
OnMeltdown(this, myMEA);
}
}
}
}
// declare the ReactorMonitor class
class ReactorMonitor
{
// define a constructor
public ReactorMonitor(Reactor myReactor)
{
myReactor.OnMeltdown +=
new Reactor.MeltdownHandler(DisplayMessage);
}
// define the DisplayMessage() method
public void DisplayMessage(
object myReactor, MeltdownEventArgs myMEA
)
{
Console.WriteLine(myMEA.Message);
}
}
public class Example12_4
{
public static void Main()
{
// create a Reactor object
Reactor myReactor = new Reactor();
// create a ReactorMonitor object
ReactorMonitor myReactorMonitor = new ReactorMonitor(myReactor);
// set myReactor.Temperature to 100 degrees Centigrade
Console.WriteLine("Setting reactor temperature to 100 degrees Centigrade");
myReactor.Temperature = 100;
// set myReactor.Temperature to 500 degrees Centigrade
Console.WriteLine("Setting reactor temperature to 500 degrees Centigrade");
myReactor.Temperature = 500;
// set myReactor.Temperature to 2000 degrees Centigrade
// (this causes the reactor to meltdown)
Console.WriteLine("Setting reactor temperature to 2000 degrees Centigrade");
myReactor.Temperature = 2000;
}
}
Calling Native DLL Functions
/*
A Programmer's Introduction to C# (Second Edition)
by Eric Gunnerson
Publisher: Apress L.P.
ISBN: 1-893115-62-3
*/
// 31 - InteropCalling Native DLL Functions
// copyright 2000 Eric Gunnerson
using System.Runtime.InteropServices;
public class CallingNativeDLLFunctions
{
[DllImport("user32.dll")]
public static extern int MessageBox(int h, string m,
string c, int type);
public static void Main()
{
int retval = MessageBox(0, "Hello", "Caption", 0);
}
}
Creates a library assembly
/*
Mastering Visual C# .NET
by Jason Price, Mike Gunderloy
Publisher: Sybex;
ISBN: 0782129110
*/
/*
Example16_2.cs creates a library assembly
*/
// compile with: csc /target:library Example16_2.cs
using System;
using System.Reflection;
using System.Windows.Forms;
[assembly:AssemblyVersionAttribute("1.0.0.0")]
[assembly:AssemblyTitleAttribute("Example 16.2")]
public class Example16_2
{
string privateString;
public string inString
{
get
{
return privateString;
}
set
{
privateString = inString;
}
}
public void upper(out string upperString)
{
upperString = privateString.ToUpper();
}
}