You want to ensure that the data entered by a user and assigned to a string does not exceed a certain number of characters.
Use
the overloaded constructor of the StringBuilder
class, which accepts a maximum capacity. The following code creates a
StringBuilder
object that has a maximum size of 10
characters:
System.Text.StringBuilder sbMax = new System.Text.StringBuilder(10, 10); sbMax.Append("123456789"); sbMax.Append("0");
This code creates a StringBuilder
object,
sbMax
, which has a maximum length of
10
characters. Nine characters are appended to
this string and then a tenth character is appended without a problem.
However, if the next line of code is executed:
sbMax.Append("#");
The length of sbMax
goes beyond
10
characters and an
ArgumentOutOfRangeException
is thrown.
The string
object is immutable and, as such, does
not have a built-in method to prevent its length from going beyond a
certain point. Fortunately, the StringBuilder
object contains an overloaded constructor that allows the maximum
size of its string to be set. The StringBuilder
constructor that we are concerned with is defined as follows:
public StringBuilder(intinitialCapacity
, intmaxCapacity
)
For most applications, the initialCapacity
and maxCapacity
can be identical. This way
gives you the best performance, overall. If these two parameters are
not identical, it is critical that these two parameters can coexist.
Take, for example, the following code:
System.Text.StringBuilder sbMax = new System.Text.StringBuilder(3, 12); sbMax.Append("1234567890"); sbMax.Append("0"); sbMax.Append("#");
which will throw an ArgumentOutOfRangeException
as
the final #
character is appended. This
configuration incorrectly allows a maximum of only 11 characters
instead of the 12 indicated.
The following line of code:
System.Text.StringBuilder sbMax = new System.Text.StringBuilder(30, 12);
also throws an ArgumentOutOfRangeException
. This
time, the initialCapacity
parameter is
larger than maxCapacity
, causing the
exception. While you may not be explicitly writing these values for
your application, if you are calculating them using some type of
expression, you may run into these problems.
To
handle an attempt to append characters to the
StringBuilder
string, forcing it beyond the
maximum size, wrap any code to append text to the
StringBuilder
object in a
try
-catch
block:
try { sbMax.Append("New String"); } catch(ArgumentOutOfRangeException rangeE) { // Handle overrun here }
In addition to the Append
method, you should also
wrap any AppendFormat
, Insert
,
and Replace
methods of the
StringBuilder
object in a
try
-catch
block. Any of these
methods can allow characters to be added to the
StringBuilder
string, potentially causing its
length to exceed its maximum specified length.