684
Part II: Exploring the C# Library
public static GCNotificationStatus
WaitForFullGCApproach( )
Waits for the notification that a full garbage-collection cycle is 
about to occur. GCNotificationStatus is an enumeration 
defined in System.
public static GCNotificationStatus
WaitForFullGCApproach(int
millisecondsTimeout)
Waits up to millisecondsTimeout milliseconds for the 
notification that a full garbage-collection cycle is about to 
occur. GCNotificationStatus is an enumeration defined in 
System.
public static GCNotificationStatus
WaitForFullGCComplete( )
Waits for the notification that a full garbage-collection cycle has 
completed. GCNotificationStatus is an enumeration defined 
inSystem.
public static GCNotificationStatus
WaitForFullGCComplete(int
millisecondsTimeout)
Waits up to millisecondsTimeout milliseconds for the 
notification that a full garbage-collection cycle has completed. 
GCNotificationStatus is an enumeration defined in 
System.
public static void
WaitForPendingFinalizers( )
Halts execution of the invoking thread until all pending finalizers 
(i.e., destructors) have been called.
T
ABLE
21-15  Methods Defi ned by GC (continued)
Method
Meaning
For most applications, you will not use any of the capabilities of GC. However, in 
Collect( ) to 
force garbage collection to occur at a time of your choosing. Normally, garbage collection 
occurs at times unspecified by your program. Since garbage collection takes time, you might 
es. You can 
also register for notifications about the approach and completion of garbage collection.
There are two methods that are especially important if you have unmanaged code in 
your project. AddMemoryPressure( ) and RemoveMemoryPressure( ). These are used to 
indicate that a large amount of unmanaged memory has been allocated or released by the 
program. They are important because the memory management system has no oversight 
on unmanaged memory. If a program allocates a large amount of unmanaged memory, then 
performance might be affected because the system has no way of knowing that free memory 
has been reduced. By calling AddMemoryPressure( ) when allocating large amounts of 
unmanaged memory, you let the CLR know that memory has been reduced. By calling 
RemoveMemoryPressure( ), you let the CLR know the memory has been freed. Remember: 
RemoveMemoryPressure( ) must be called only to indicate that memory reported by a call 
toAddMemoryPressure( ) has been released.
Object
Object is the class that underlies the C# object type. The members of Object were discussed 
in Chapter 11, but because of its central role in C#, its methods are repeated in Table 21-16 
for your convenience. Object defines one constructor, which is shown here:
public Object( )
It constructs an empty object.
Asp.net merge pdf files - Merge, append PDF files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Provide C# Demo Codes for Merging and Appending PDF Document
split pdf into multiple files; merge pdf online
Asp.net merge pdf files - 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
break pdf file into multiple files; batch combine pdf
P
A
R
T
I
I
Chapter 21: Exploring the System Namespace  
685
Tuple
.NET Framework 4.0 adds a convenient way to create groups (tuples) of objects. At the core 
is the static class Tuple, which defines several Create( ) methods that create tuples, and 
variousTuple<...> classes that encapsulate tuples. For example, here is a version of Create( )
that returns a tuple with three members:
public static Tuple<T1, T2, T3>
Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
Notice that the method returns a Tuple<T1, T2, T3> object. This object encapsulates item1,
item2, and item3. In general, tuples are useful whenever you want to treat a group of values 
as a unit. For example, you might pass a tuple to a method, return a tuple from a method, or 
store tuples in a collection or array.
The IComparable and IComparable<T> Interfaces
Many classes will need to implement either the IComparable or IComparable<T> interface 
because they enable one object to be compared to another (for the purpose of ordering) by 
various methods defined by the .NET Framework. Chapter 18 introduced the IComparable
andIComparable<T> interfaces, where they were used to enable two objects of a generic 
type parameter to be compared. They were also mentioned in the discussion of Array,
earlier in this chapter. However, because of their importance and applicability to many 
situations, they are formally examined here.
IComparable
int CompareTo(object obj)
This method compares the invoking object against the value in obj. It returns greater than zero 
if the invoking object is greater than obj, zero if the two objects are equal, and less than 
zero if the invoking object is less than obj.
Method
Purpose
public virtual bool Equals(object obj)
Returns true if the invoking object is the same as the one referred 
to by obj. Returns false otherwise.
public static bool Equals(object objA, object objB)
Returns true if objA is the same as objB. Returns false otherwise.
protected Finalize( )
Performs shutdown actions prior to garbage collection. In C#, 
Finalize( ) is accessed through a destructor.
public virtual int GetHashCode( )
Returns the hash code associated with the invoking object.
public Type GetType( )
Obtains the type of an object at runtime.
protected object MemberwiseClone( )
Makes a “shallow copy” of the object. This is one in which the 
members are copied, but objects referred to by members are not.
public static bool ReferenceEquals(object objA,
object objB)
Returns true if objA and objB refer to the same object. Returns 
false otherwise.
public virtual string ToString( )
Returns a string that describes the object.
T
ABLE
21-16  Methods Defi ned by Object 
VB.NET PDF- HTML5 PDF Viewer for VB.NET Project
PDF; Merge PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission Settings. FREE TRIAL: HOW TO: XDoc.HTML5 Viewer for C#▶: C# ASP.NET:
asp.net merge pdf files; acrobat combine pdf files
Online Merge PDF files. Best free online merge PDF tool.
Thus, C#.NET PDF document merge library control can Download and try RasterEdge.XDoc. PDF for .NET and imaging solutions, available for ASP.NET AJAX, Silverlight
add two pdf files together; batch pdf merger online
686
Part II: Exploring the C# Library
The generic version of IComparable is declared like this:
public interface IComparable<in T>
In this version, the type of data being compared is passed as a type argument to T. This 
causes the declaration of CompareTo( ) to be changed, as shown next:
int CompareTo(T other)
Here, the type of data that CompareTo( ) operates on can be explicitly specified. This makes 
IComparable<T> type-safe. For this reason, IComparable<T> is now preferable to 
IComparable.
The IEquatable<T> Interface
IEquatable<T>
be compared for equality. It defines only one method, Equals( ), which is shown here:
bool Equals(T other)
The method returns true if other is equal to the invoking object and false otherwise.
IEquatable<T> is implemented by several classes and structures in the .NET 
Framework, including the numeric structures and the String class. When implementing 
IEquatable<T>,you will usually also need to override Equals(Object) and GetHashCode( )
defined by Object.
TheIConvertible Interface
The IConvertible interface is implemented by all of the value-type structures, string, and 
DateTime. It specifies various type conversions. Normally, classes that you create will not 
need to implement this interface.
The ICloneable Interface
By implementing the ICloneable interface, you enable a copy of an object to be made. 
ICloneable defines only one method, Clone( ), which is shown here:
object Clone( )
This method makes a copy of the invoking object. How you implement Clone( ) determines 
how the copy is made. In general, there are two types of copies: deep and shallow. When a 
deep copy is made, the copy and original are completely independent. Thus, if the original 
object contained a reference to another object O, then a copy of O will also be made. In a 
shallow copy, members are copied, but objects referred to by members are not. If an object 
refers to some other object O, then after a shallow copy, both the copy and the original will 
refer to the same O, and any changes to O affect both the copy and the original. Usually, you 
will implement Clone( ) so that it performs a deep copy. Shallow copies can be made by 
usingMemberwiseClone( ), which is defined by Object.
Here is an example that illustrates ICloneable. It creates a class called Test that contains 
a reference to an object of a class called X.Test uses Clone( ) to create a deep copy.
VB.NET PDF Convert to HTML SDK: Convert PDF to html files in vb.
Embed converted html files in html page or iframe. Export PDF form data to html form in .NET WinForms and ASP.NET. Turn PDF images to HTML images in VB.NET.
adding pdf pages together; .net merge pdf files
C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
PDF; Merge PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission Settings. FREE TRIAL: HOW TO: XDoc.HTML5 Viewer for C#▶: C# ASP.NET:
acrobat combine pdf; pdf mail merge plug in
P
A
R
T
I
I
Chapter 21: Exploring the System Namespace  
687
// Demonstrate ICloneable.
using System;
class X {
public int a;
public X(int x) { a = x; }
}
class Test : ICloneable {
public X o;
public int b;
public Test(int x, int y) {
o = new X(x);
b = y;
}
public void Show(string name) {
Console.Write(name + " values are ");
Console.WriteLine("o.a: {0}, b: {1}", o.a, b);
}
// Make a deep copy of the invoking object.
public object Clone() {
Test temp = new Test(o.a, b);
return temp;
}
}
class CloneDemo {
static void Main() {
Test ob1 = new Test(10, 20);
ob1.Show("ob1");
Console.WriteLine("Make ob2 a clone of ob1.");
Test ob2 = (Test) ob1.Clone();
ob2.Show("ob2");
Console.WriteLine("Changing ob1.o.a to 99 and ob1.b to 88.");
ob1.o.a = 99;
ob1.b = 88;
ob1.Show("ob1");
ob2.Show("ob2");
}
}
The output is shown here:
ob1 values are o.a: 10, b: 20
Make ob2 a clone of ob1.
VB.NET PDF File Split Library: Split, seperate PDF into multiple
Split PDF file into two or multiple files in ASP.NET webpage online. Support to break a large PDF file into smaller files in .NET WinForms.
acrobat reader merge pdf files; merge pdf
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit PDF
HTML5 Viewer for C# .NET. Related Resources. To view, convert, edit, process, protect, sign PDF files, please refer to XDoc.PDF SDK for .NET overview.
pdf combine pages; acrobat merge pdf
688
Part II: Exploring the C# Library
ob2 values are o.a: 10, b: 20
Changing ob1.o.a to 99 and ob1.b to 88.
ob1 values are o.a: 99, b: 88
ob2 values are o.a: 10, b: 20
As the output shows, ob2 is a clone of ob1, but ob1 and ob2 are completely separate objects. 
Changing one does not affect the other. This is accomplished by constructing a new Test
object, which allocates a new X object for the copy. The new X instance is given the same 
value as the X object in the original.
To implement a shallow copy, simply have Clone( ) call MemberwiseClone( ) defined 
byObject. For example, try changing Clone( ) in the preceding program as shown here:
// Make a shallow copy of the invoking object.
public object Clone() {
Test temp = (Test) MemberwiseClone();
return temp;
}
After making this change, the output of the program will look like this:
ob1 values are o.a: 10, b: 20
Make ob2 a clone of ob1.
ob2 values are o.a: 10, b: 20
Changing ob1.o.a to 99 and ob1.b to 88.
ob1 values are o.a: 99, b: 88
ob2 values are o.a: 99, b: 20
Notice that o in ob1 and o in ob2 both refer to the same X object. Changing one affects both. 
Of course, the int field b in each is still separate because the value types are not accessed via 
references.
IFormatProvider and IFormattable
TheIFormatProvider interface defines one method called GetFormat( ), which returns an 
object that controls the formatting of data into a human-readable string. The general form of 
GetFormat( ) is shown here:
object GetFormat(Type formatType)
Here, formatType specifies the format object to obtain.
TheIFormattable interface supports the formatting of human-readable output. 
IFormattable defines this method:
string ToString(string format, IFormatProvider formatProvider)
Here, format specifies formatting instructions and formatProvider specifies the format 
provider.
N
OTE
N
OTE
Formatting is described in detail in Chapter 22.
VB.NET Create PDF from Word Library to convert docx, doc to PDF in
PDF; Merge PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission Settings. FREE TRIAL: HOW TO: XDoc.HTML5 Viewer for C#▶: C# ASP.NET:
pdf merge documents; pdf merger
C# PDF Convert to SVG SDK: Convert PDF to SVG files in C#.net, ASP
Instantly convert all PDF document pages to SVG image files in C#.NET class application. Perform high-fidelity PDF to SVG conversion in both ASP.NET web and
c# merge pdf; break a pdf into multiple files
P
A
R
T
I
I
Chapter 21: Exploring the System Namespace  
689
IObservable<T> and IObserver<T>
IObservable<T> and IObserver<T>. In the observer pattern, one class (the observable) 
pregistering an 
object of the observing class with an object of the observable class. An observer is registered 
by calling Subscribe( ), which is specified by IObservable<T>, passing in the IObserver<T>
object that will receive notification. More than one observer can be registered to receive 
notifications. To send notifications to all registered observers, three methods defined by 
IObserver<T> are used. OnNext( ) sends data to the observer, OnError( ) indicates an error, 
andOnCompleted( ) indicates the observable object has stopped sending notifications.
This page intentionally left blank 
22
Strings and Formatting
T
his chapter examines the String class, which underlies C#’s string type. As all 
programmers know, string handling is a part of almost any program. For this reason, 
theString class defines an extensive set of methods, properties, and fields that give 
you detailed control of the construction and manipulation of strings. Closely related to 
string handling is the formatting of data into its human-readable form. Using the formatting 
Strings in C#
An overview of C#’s string handling was presented in Chapter 7, and that discussion is 
not repeated here. However, it is worthwhile to review how strings are implemented in 
C# before examining the String class.
In all computer languages, a string is a sequence of characters, but precisely how such 
a sequence is implemented varies from language to language. In some computer languages, 
such as C++, strings are arrays of characters, but this is not the case with C#. Instead, C# 
strings are objects of the built-in string data type. Thus, string is a reference type. Moreover, 
string is C#’s name for System.String, the standard .NET string type. Thus, a C# string has 
access to all of the methods, properties, fields, and operators defined by String.
Once a string has been created, the character sequence that comprises a string cannot 
be altered. This restriction allows C# to implement strings more efficiently. Though this 
restriction pr
a variation on one that already exists, simply create a new string that contains the desired 
changes, and discar
ar
discarded strings. It must be made clear, however, that string reference variables may, of 
course, change the object to which they refer. It is just that the character sequence of a 
specificstring object cannot be changed after it is created.
To create a string that can be changed, C# offers a class called StringBuilder, which is in 
theSystem.Text namespace. For most purposes, however, you will want to use string, not 
StringBuilder.
691
CHAPTER
692
Part II: Exploring the C# Library
The String Class
String is defined in the System namespace. It implements the IComparable,
IComparable<string>,ICloneable,IConvertible,IEnumerable,IEnumerable<char>,
andIEquatable<string> interfaces. String is a sealed class, which means that it cannot 
be inherited. String provides string-handling functionality for C#. It underlies C#’s 
built-instring type and is part of the .NET Framework. The next few sections examine 
String in detail.
The String Constructors
TheString class defines several constructors that allow you to construct a string in a variety 
of ways. To create a string from a character array, use one of these constructors:
public String(char[ ] value)
public String(char[ ] value, int startIndex, int length)
The first form constructs a string that contains the characters in value. The second form uses 
length characters from value, beginning at the index specified by startIndex.
You can create a string that contains a specific character repeated a number of times 
using this constructor:
public String(char c, int count)
Here, c specifies the character that will be repeated count times.
You can construct a string given a pointer to a character array using one of these 
constructors:
public String(char* value)
public String(char* value, int startIndex, int length)
The first form constructs a string that contains the characters pointed to by value. It is 
assumed that value points to a null-terminated array, which is used in its entirety. The 
second form uses length characters from the array pointed to by value, beginning at the 
index specified by startIndex. Because they use pointers, these constructors can be used 
only in unsafe code.
You can construct a string given a pointer to an array of bytes using one of these 
constructors:
public String(sbyte* value)
public String(sbyte* value, int startIndex, int length)
public String(sbyte* value, int startIndex, int length, Encoding enc)
The first form constructs a string that contains the bytes pointed to by value. It is 
assumed that value points to a null-terminated array, which is used in its entirety. The 
second form uses length characters from the array pointed to by value, beginning at the 
index specified by startIndex. The third form lets you specify how the bytes are encoded. 
TheEncoding class is in the System.Text namespace. Because they use pointers, these 
constructors can be used only in unsafe code.
A string literal automatically creates a string object. For this reason, a string object is 
often initialized by assigning it a string literal, as shown here:
string str = "a new string";
P
A
R
T
I
I
Chapter 22: Strings and Formatting  
693
The String Field, Indexer, and Property
TheString class defines one field, shown here:
public static readonly string Empty
Emptyfers 
from a null String reference, which simply refers to no object.
There is one read-only indexer defined for String, which is shown here:
public char this[int index] { get; }
indexing for strings begins at zero. Since String objects are immutable, it makes sense that 
String supports a read-only indexer.
There is one read-only property:
public int Length { get; }
Length returns the number of characters in the string.
The String Operators
TheString class overloads two operators: = = and !=. To test two strings for equality, use the 
= = operator. Normally, when the = = operator is applied to object references, it determines 
if both references refer to the same object. This differs for objects of type String. When the 
= = is applied to two String references, the contents of the strings, themselves, are compared 
for equality. The same is true for the != operator: the contents of the strings are compared. 
However, the other relational operators, such as < or >=, compare the references, just like 
they do for other types of objects. To determine if one string is greater than or less than 
another, use the Compare( ) or CompareTo( ) method defined by String.
not the case with the = = and!=operators. They simply compare the ordinal values of the 
characters within the strings. (In other words, they compare the binary values of the characters, 
unmodified by cultural norms.) Thus, these operators are case-sensitive and culture-insensitive.
The String Methods
TheString class defines a large number of methods, and many of the methods have two 
or more overloaded forms. For this reason it is neither practical nor useful to list them 
all. Instead, several of the more commonly used methods will be presented, along with 
examples that illustrate them.
Comparing Strings
Perhaps the most fr
another. Befor
comparison can reflect the customs and norms of a given culture, which is often the cultural 
setting in force when the program executes. This is the default behavior of some, but not all, of 
settings, using only the ordinal values of the characters that comprise the string. In general, 
string comparisons that are culture-sensitive use dictionary order (and linguistic features) to 
determine whether one string is greater than, equal to, or less than another. Ordinal string 
comparisons simply order strings based on the unmodified value of each character.
Documents you may be interested
Documents you may be interested