404
Part I: The C# Language
This is i: 7
This is i: 8
This is i: 9
The program first creates a StringWriter called strwtr and outputs to it using WriteLine( ).
Next, it creates a StringReader using the string contained in strwtr. This string is obtained 
by calling ToString( ) on strwtr. Finally, the contents of this string are read using ReadLine( ).
The File Class
The .NET Framework defines a class called File that you will find useful when working 
For example, File
delete a file. It pr
it exists, its time of cread-
only, hidden, and so on). File also includes some convenience methods that let you read from 
a file and write to a file. In addition, you can use a File method to open a file and obtain 
aFileStream reference to it. Although File contains far too many methods to examine 
each one, we will look at three. The first is Copy( ) and the other two are Exists( ) and 
GetLastAccessTime( ). These methods will give you an idea of the convenience that the 
File methods offer. File is definitely a class that you will want to explore.
N
OTE
N
OTE
Another class that defines several file-related methods is FileInfo. It differs from File in 
one important way: it provides instance methods and properties rather than static methods to 
perform file operations. Therefore, if you will be performing several file operations on the same 
file, then FileInfo might offer a more efficient solution.
Using Copy( ) to Copy a File
Earlier in this chapter you saw a program that copied a file by manually reading bytes from 
one file and writing them to another. Although such a task is not particularly difficult, it can 
be fully automated by using the Copy( ) method defined by File. It has the two versions 
shown here:
static void Copy(string sourceFileName, string destFileName)
static void Copy(string sourceFileName, string destFileName, boolean overwrite)
Copy( ) copies the file specified by sourceFileName to the file specified by destFileName. The 
first version copies the file only if destFileName does not already exist. In the second form, 
ifoverwrite is passed true, the copy will overwrite the destination file if it exists. Both can 
throw several types of exceptions, including IOException and FileNotFoundException.
The following program uses Copy( ) to copy a file. Both the source and destination 
filenames ar
the copy program shown earlier. It’s also more efficient.
/* Copy a file using File.Copy().
To use this program, specify the name of the source
file and the destination file. For example, to copy a
Pdf combine - Merge, append PDF files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Provide C# Demo Codes for Merging and Appending PDF Document
pdf merger; add pdf files together reader
Pdf combine - VB.NET PDF File Merge Library: Merge, append PDF files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET Guide and Sample Codes to Merge PDF Documents in .NET Project
acrobat combine pdf files; asp.net merge pdf files
P
A
R
T
I
Chapter 14: Using I/O 
405
P
A
R
T
I
P
A
R
T
I
file called FIRST.DAT to a file called SECOND.DAT, use
the following command line:
CopyFile FIRST.DAT SECOND.DAT
*/
using System;
using System.IO;
class CopyFile {
static void Main(string[] args) {
if(args.Length != 2) {
Console.WriteLine("Usage: CopyFile From To");
return;
}
// Copy the files.
try {
File.Copy(args[0], args[1]);
} catch(IOException exc) {
Console.WriteLine("Error Copying File\n" + exc.Message);
}
}
}
As you can see, this version of the program does not require that you create a 
FileStream or release resources. The Copy( ) method handles all this for you. Also notice 
that this version will not overwrite an existing file. You might want to try using the second 
version of Copy( ), which does allow the destination to be overwritten.
Using Exists( ) and GetLastAccessTime( )
UsingFile methods, it is quite easy to obtain information about a file. We will look at two 
such methods: Exists( ) and GetLastAccessTime( ). The Exists( ) method determines if a file 
exists.GetLastAccessTime( ) returns the date and time at which a file was last accessed. 
These two methods are shown here:
static bool Exists(string path)
static DateTime GetLastAccessTime(string path)
For both methods, path specifies the file about which to obtain information. Exists( ) returns true 
if the file exists and can be accessed by the calling process. GetLastAccessTime( ) returns a 
DateTime structure that contains the date and time the file was last accessed. (DateTime
is described later in this book, but its ToString( ) method automatically creates a human-
readable form of the date and time.) A number of exceptions relating to the use of an invalid 
argument or an invalid permission are possible. However, it will not throw an IOException.
The following program shows Exists( ) and GetLastAccessTime( ) in action. It determines 
if a file called test.txt exists. If it does, the time it was last accessed is displayed.
// Use Exists() and GetLastAccessTime().
using System;
using System.IO;
C# PDF: C#.NET PDF Document Merging & Splitting Control SDK
PDF Merging & Splitting Application. This C#.NET PDF document merger & splitter control toolkit is designed to help .NET developers combine PDF document files
combine pdf; c# merge pdf files
Online Merge PDF files. Best free online merge PDF tool.
RasterEdge C#.NET PDF document merging toolkit (XDoc.PDF) is designed to help .NET developers combine PDF document files created by different users to one PDF
combine pdf online; combine pdf files
406
Part I: The C# Language
class ExistsDemo {
static void Main() {
if(File.Exists("test.txt"))
Console.WriteLine("File exists. It was last accessed at " +
File.GetLastAccessTime("test.txt"));
else
Console.WriteLine("Does Not Exist");
}
}
Sample output is shown here:
File exists. It was last accessed at 11/1/2009 5:30:17 PM
You can also obtain a file’s time of creation by calling GetCreationTime( ) and the time 
at which it was last written to by calling GetLastWriteTime( ). UTC versions of these 
methods are also available. (UTC stands for coordinated universal time.) You might want to 
experiment with these.
Converting Numeric Strings to Their Internal Representation
Before leaving the topic of I/O, we will examine a technique useful when reading numeric 
strings. As you know, WriteLine( ) provides a convenient way to output various types of 
int and double.
Thus,WriteLine( ) automatically converts numeric values into their human-readable form. 
However, a parallel input method that reads and converts strings containing numeric 
values into their internal, binary format is not provided. For example, there is no version of 
Read( ) that reads from the keyboard a string such as “100” and then automatically converts 
it into its corresponding binary value that can be stored in an int variable. Instead, there are 
other ways to accomplish this task. Perhaps the easiest is to use a method that is defined for 
all of the built-in numeric types: Parse( ).
Befor
asint and double, are actually just aliases (that is, other names) for structures defined by 
the .NET Framework. In fact, the C# type and .NET structure type are indistinguishable. 
One is just another name for the other. Because C#’s built-in types are supported by 
structures, they have members defined for them.
For the numeric types, the .NET structure names and their C# keyword equivalents are 
given here:
.NET Structure Name
C# Name
Decimal
decimal
Double
double
Single
float
Int16
short
Int32
int
Int64
long
VB.NET PDF: Use VB.NET Code to Merge and Split PDF Documents
APIs for Merging PDF Documents in VB.NET. Private Sub Combine(source As List(Of BaseDocument), destn As Stream) Implements PDFDocument.Combine End Sub Private
pdf combine two pages into one; batch merge pdf
C# PowerPoint - Merge PowerPoint Documents in C#.NET
Combine and Merge Multiple PowerPoint Files into One Using C#. This part illustrates how to combine three PowerPoint files into a new file in C# application.
how to combine pdf files; scan multiple pages into one pdf
P
A
R
T
I
Chapter 14: Using I/O 
407
P
A
R
T
I
P
A
R
T
I
UInt16
ushort
UInt32
uint
UInt64
ulong
Byte
byte
SByte
sbyte
These structures are defined inside the System namespace. Thus, the fully qualified name 
forInt32 is System.Int32. These structures offer a wide array of methods that help fully 
integrate the built-in numeric types into C#’s object hierarchy. As a side benefit, the numeric 
structures also define a static method called Parse( ) that converts a numeric string into its 
corresponding binary equivalent.
There are several overloaded forms of Parse( ). The simplest version for each numeric 
structure is shown here. It performs the conversion using the default locale and numeric 
style.) Notice that each method returns a binary value that corresponds to the string.
Structure
Conversion Method
Decimal
static decimal Parse(string s)
Double
static double Parse(string s
Single
static float Parse(string s)
Int64
static long Parse(string s)
Int32
static int Parse(string s)
Int16
static short Parse(string s)
UInt64
static ulong Parse(string s)
UInt32
static uint Parse(string s)
UInt16
static ushort Parse(string s)
Byte
static byte Parse(string s)
SByte
static sbyte Parse(string s)
TheParse( ) methods will throw a FormatException if s does not contain a valid number 
as defined by the invoking type. ArgumentNullException is thrown if s is null, and 
OverflowException is thrown if the value in s exceeds the bounds of the invoking type.
The parsing methods give you an easy way to convert a numeric value, read as a string 
from the keyboard or a text file, into its proper internal format. For example, the following 
program averages a list of numbers entered by the user. It first asks the user for the number 
of values to be averaged. It then reads that number using ReadLine( ) and uses Int32.Parse( )
to convert the string into an integer. Next, it inputs the values, using Double.Parse( ) to 
convert the strings into their double equivalents.
// This program averages a list of numbers entered by the user.
using System;
using System.IO;
.NET Structure Name
C# Name
C# Word - Merge Word Documents in C#.NET
Combine and Merge Multiple Word Files into One Using C#. This part illustrates how to combine three Word files into a new file in C# application.
pdf merge; acrobat split pdf into multiple files
C# PDF File Split Library: Split, seperate PDF into multiple files
Split PDF document by PDF bookmark and outlines. Also able to combine generated split PDF document files with other PDF files to form a new PDF file.
pdf combine files online; pdf split and merge
408
Part I: The C# Language
class AvgNums {
static void Main() {
string str;
int n;
double sum = 0.0;
double avg, t;
Console.Write("How many numbers will you enter: ");
str = Console.ReadLine();
try {
n = Int32.Parse(str);
} catch(FormatException exc) {
Console.WriteLine(exc.Message);
return;
} catch(OverflowException exc) {
Console.WriteLine(exc.Message);
return;
}
Console.WriteLine("Enter " + n + " values.");
for(int i=0; i < n ; i++)  {
Console.Write(": ");
str = Console.ReadLine();
try {
t = Double.Parse(str);
} catch(FormatException exc) {
Console.WriteLine(exc.Message);
t = 0.0;
} catch(OverflowException exc) {
Console.WriteLine(exc.Message);
t = 0;
}
sum += t;
}
avg = sum / n;
Console.WriteLine("Average is " + avg);
}
}
Here is a sample run:
How many numbers will you enter: 5
Enter 5 values.
: 1.1
: 2.2
: 3.3
: 4.4
: 5.5
Average is 3.3
One other point: You must use the right parsing method for the type of value you 
are trying to convert. For example, trying to use Int32.Parse( ) on a string that contains 
a floating-point value will not produce the desired result.
VB.NET TIFF: Merge and Split TIFF Documents with RasterEdge .NET
filePath As [String], docList As [String]()) TIFFDocument.Combine(filePath, docList) End to provide powerful & profession imaging controls, PDF document, tiff
add pdf together one file; build pdf from multiple files
VB.NET PowerPoint: Merge and Split PowerPoint Document(s) with PPT
Just like we need to combine PPT files, sometimes, we also want to separate a Note: If you want to see more PDF processing functions in VB.NET, please follow
break pdf into multiple files; combine pdfs online
P
A
R
T
I
Chapter 14: Using I/O 
409
P
A
R
T
I
P
A
R
T
I
As explained, Parse( ) will throw an exception on failure. You can avoid generating 
an exception when converting numeric strings by using the TryParse( ) method, which is 
defined for all of the numeric structures. Here is an example. It shows one version of 
TryParse( ) as defined by Int32.
static bool TryParse(string s, out int result)
The numeric string is passed in s. The result is returned in result. It performs the conversion 
using the default locale and numeric style. (A second version of TryParse( ) is available that 
s does 
not contain a numeric string in the proper form, TryParse( ) returns false. Otherwise, it 
returns true. Therefore, you must check the return value to confirm that the conversion 
was successful.
This page intentionally left blank 
15
Delegates, Events, and 
Lambda Expressions
T
his chapter examines three innovative C# features: delegates, events, and lambda 
expressions. A delegateprovides a way to encapsulate a method. An eventis a 
notification that some action has occurred. Delegates and events are related because 
an event is built upon a delegate. Both expand the set of programming tasks to which C# 
can be applied. The lambdaexpression is a relatively new syntactic feature that offers a 
streamlined, yet powerful way to define what is, essentially, a unit of executable code. 
Lambda expressions are often used when working with delegates and events because a 
delegate can refer to a lambda expression. (Lambda expressions are also very important to 
LINQ, which is described in Chapter 19.) Also examined are anonymous methods, covariance, 
contravariance, and method group conversions.
Delegates
Let’s begin by defining the term delegate. In straightforward language, a delegate is an object 
that can refer to a method. Therefore, when you create a delegate, you are creating an object 
that can hold a reference to a method. Furthermore, the method can be called through this 
reference. In other words, a delegate can invoke the method to which it refers. As you will 
see, this is a very powerful concept.
ferent 
methods during the runtime of a program by simply changing the method to which the 
delegate r
compile time, but rather at runtime. This is the principal advantage of a delegate.
N
OTE
N
OTE
If you ar
function pointer in C/C++.
A delegate type is declared using the keyword delegate. The general form of a delegate 
declaration is shown here:
delegateret-type name(parameter-list);
411
CHAPTER
412
Part I: The C# Language
Here, ret-type is the type of value returned by the methods that the delegate will be calling. 
The name of the delegate is specified by name. The parameters required by the methods 
called through the delegate are specified in the parameter-list. Once created, a delegate 
instance can refer to and call methods whose return type and parameter list match those 
specified by the delegate declaration.
A key point to understand is that a delegate can be used to call any method that agrees 
with its signature and return type. Furthermore, the method can be either an instance method 
associated with an object or a static method associated with a class. All that matters is that 
the return type and signature of the method agree with those of the delegate.
Te:
// A simple delegate example.
using System;
// Declare a delegate type.
delegate string StrMod(string str);
class DelegateTest {
// Replaces spaces with hyphens.
static string ReplaceSpaces(string s) {
Console.WriteLine("Replacing spaces with hyphens.");
return s.Replace(' ', '-');
}
// Remove spaces.
static string RemoveSpaces(string s) {
string temp = "";
int i;
Console.WriteLine("Removing spaces.");
for(i=0; i < s.Length; i++)
if(s[i] != ' ') temp += s[i];
return temp;
}
// Reverse a string.
static string Reverse(string s) {
string temp = "";
int i, j;
Console.WriteLine("Reversing string.");
for(j=0, i=s.Length-1; i >= 0; i--, j++)
temp += s[i];
return temp;
}
static void Main() {
// Construct a delegate.
StrMod strOp = new StrMod(ReplaceSpaces);
string str;
P
A
R
T
I
Chapter 15: Delegates, Events, and Lambda Expressions 
413
P
A
R
T
I
P
A
R
T
I
// Call methods through the delegate.
str = strOp("This is a test.");
Console.WriteLine("Resulting string: " + str);
Console.WriteLine();
strOp = new StrMod(RemoveSpaces);
str = strOp("This is a test.");
Console.WriteLine("Resulting string: " + str);
Console.WriteLine();
strOp = new StrMod(Reverse);
str = strOp("This is a test.");
Console.WriteLine("Resulting string: " + str);
}
}
The output from the program is shown here:
Replacing spaces with hyphens.
Resulting string: This-is-a-test.
Removing spaces.
Resulting string: Thisisatest.
Reversing string.
Resulting string: .tset a si sihT
Let’s examine this program closely. The program declares a delegate type called 
StrMod, shown here:
delegate string StrMod(string str);
Notice that StrMod takes one string parameter and returns a string.
Next, in DelegateTest, three static methods are declared, each with a single parameter 
of type string and a return type of string. Thus, they match the StrMod delegate. These 
methods perform some type of string modification. Notice that ReplaceSpaces( ) uses one 
ofstring’s methods, called Replace( ), to replace spaces with hyphens.
InMain( ), a StrMod reference called strOp is created and assigned a reference to 
ReplaceSpaces( ). Pay close attention to this line:
StrMod strOp = new StrMod(ReplaceSpaces);
Notice how the method ReplaceSpaces( ) is passed as a parameter. Only its name is used; 
no parameters ar
specify only the name of the method to which you want the delegate to refer. Of course, the 
method’s signatur
time error will result.
Next,ReplaceSpaces( ) is called through the delegate instance strOp, as shown here:
str = strOp("This is a test.");
BecausestrOp refers to ReplaceSpaces( ),ReplaceSpaces( ) is invoked.
Documents you may be interested
Documents you may be interested