only for RuBoard - do not distribute or recompile |
C# offers a wide range of string-handling features. Support is provided for both mutable and immutable strings, extensible string formatting, locale-aware string comparisons, and multiple string encoding systems.
This section introduces and demonstrates the most common types you'll use when working with strings. Unless otherwise stated, the types mentioned in this section all exist in the System or System.Text namespaces.
A C# string represents an immutable sequence of characters and aliases the System.String class. Strings have comparison, appending, inserting, conversion, copying, formatting, indexing, joining, splitting, padding, trimming, removing, replacing, and searching methods. The compiler converts + operations on operands where the left operand is a string to Concat methods and preevaluates and interns string constants wherever possible.
Strings are immutable, which means they can't be modified after creation. Consequently, many of the methods that initially appear to modify a string actually create a new string:
string a = "Heat"; string b = a.Insert(3, "r"); Console.WriteLine(b); // Prints Heart
If you need a mutable string, see the StringBuilder class.
In addition, the immutability of strings enable all strings in an application to be interned. Interning describes the process whereby all the constant strings in an application are stored in a common place, and any duplicate strings are eliminated. This saves space at runtime but creates the possibility that multiple string references will point at the same spot in memory. This can be the source of unexpected results when comparing two constant strings, as follows:
string a = "hello"; string b = "hello"; Console.WriteLine(a == b); // True for String only Console.WriteLine(a.Equals(b)); // True for all objects Console.WriteLine(Object.ReferenceEquals(a, b)); // True!!
The Format method provides a convenient way to build strings that embed string representations of a variable number of parameters. Each parameter can be of any type, including both predefined types and user-defined types.
The Format method takes a format-specification string and a variable number of parameters. The format-specification string defines the template for the string and includes format specifications for each of the parameters. The syntax of a format specifier looks like this:
{ParamIndex[,MinWidth][:FormatString]}
The zero-based index of the parameter to be formatted.
The minimum number of characters for the string representation of the parameter, to be padded by spaces if necessary (negative is left-justified, positive is right-justified).
If the parameter represents an object that implements IFormattable, the FormatString is passed to the ToString method on IFormattable to construct the string. If not, the ToString method on Object is used to construct the string.
|
In the following example, we embed a basic string representation of the account variable (param 0) and a monetary string representation of the cash variable (param 1, C=Currency):
using System; class TestFormatting { static void Main( ) { int i = 2; decimal m = 42.73m; string s = String.Format("Account {0} has {1:C}.", i, m); Console.WriteLine(s); // Prints "Account 2 has $42.73" } }
Consistent with all other indexing in the CLR, the characters in a string are accessed with a zero-based index:
using System; class TestIndexing { static void Main( ) { string s = "Going down?"; for (int i=0; i<s.Length; i++) Console.WriteLine(s[i]); // Prints s vertically } }
Strings can be converted between different character encodings using the Encoding type. The Encoding type can't be created directly, but the ASCII, Unicode, UTF7, UTF8, and BigEndianUnicode static properties on the Encoding type return correctly constructed instances.
Here is an example that converts an array of bytes into a string using the ASCII encoding:
using System; using System.Text; class TestEncoding { static void Main( ) { byte[] ba = new byte[] { 67, 35, 32, 105, 115, 32, 67, 79, 79, 76, 33 }; string s = Encoding.ASCII.GetString(ba); Console.WriteLine(s); } }
The StringBuilder class is used to represent mutable strings. It starts at a predefined size (16 characters by default) and grows dynamically as more string data is added. It can either grow unbounded or up to a configurable maximum. For example:
using System; using System.Text; class TestStringBuilder { static void Main( ) { StringBuilder sb = new StringBuilder("Hello, "); sb.Append("World?"); sb[12] = '!'; Console.WriteLine(sb); // Hello, World! } }
only for RuBoard - do not distribute or recompile |