Strings
The following sections discuss the string data type, which is an alias for the String class.
Using Strings
A C# string is an array of characters that is declared by using the string keyword. A string literal is declared by using quotation marks, as shown in the following example:
string s = "Hello, World!";
|
You can extract substrings, and concatenate strings as in the following example:
string s1 = "orange";
string s2 = "red";
s1 += s2;
System.Console.WriteLine(s1); // outputs "orangered"
s1 = s1.Substring(2, 5);
System.Console.WriteLine(s1); // outputs "anger"
|
String objects are immutable: they cannot be changed after they have been created. Methods that act on strings actually return new string objects. In the previous example, when the contents of s1 and s2 are concatenated to form a single string, the two strings that contain "orange" and "red" are both unmodified. The += operator creates a new string that contains the combined contents. The result is that s1 now refers to a different string completely. A string that contains just "orange" still exists, but is no longer referenced when s1 is concatenated.
Note:
|
Use caution when you create references to strings. If you create a reference to a string, and then "modify" the string, the reference will continue to point to the original object, not the new object that was created when the string was modified. The following code illustrates the danger:
|
string s1 = "Hello";
string s2 = s1;
s1 += " and goodbye.";
Console.WriteLine(s2); //outputs "Hello"
|
Строки
В следующих разделах рассматривается тип данных string, являющийся псевдонимом класса String.
Использование строк
Строка в C# — это массив знаков, объявленный с помощью ключевого слова string. Строковый литерал объявляется с помощью кавычек, как показано в следующем примере.
string s = "Hello, World!";
|
Можно извлекать подстроки и объединять строки, как показано в следующем примере.
--
Строковые объекты являются неизменяемыми: после создания их нельзя изменить. Методы, работающие со строками, возвращают новые строковые объекты. В предыдущем примере, когда содержимое строк s1 и s2 объединяется в одну строку, две строки, содержащие текст "orange" и "red", не изменяются. Оператор += создает новую строку с объединенным содержимым. В результате s1 ссылается на совершенно новую строку. Строка, которая содержит слово "orange", по-прежнему существует, но на нее уже нет ссылки после объединения s1.
Примечание.
|
Будьте внимательны при создании ссылок на строки. Если создать ссылку на строку, а затем "изменить" строку, то ссылка будет по-прежнему указывать на исходный объект, а не на новый объект, который был создан при изменении строки. Следующий код иллюстрирует эту особенность:
|
string s1 = "Hello";
string s2 = s1;
s1 += " and goodbye.";
Console.WriteLine(s2); //outputs "Hello"
|
Because modifications to strings involve creating new string objects, for performance reasons, large amounts of concatenation or other involved string manipulation should be performed with the StringBuilder class, as in the following example:
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("one ");
sb.Append("two ");
sb.Append("three");
string str = sb.ToString();
System.Console.WriteLine(str);
// Outputs: one two three
|
Working with Strings
Escape Characters
Escape characters such as "\n" (new line) and "\t" (tab) can be included in strings. The line:
string hello = "Hello\nWorld!";
|
is the same as:
Hello
World!
If you want to include a backward slash, it must be preceded with another backward slash. The following string:
string filePath = "\\\\My Documents\\";
|
is actually the same as:
\\My Documents\
Поскольку при изменениях строк создаются новые строковые объекты, то, в целях повышения производительности, большие объемы работы со строками (включая их объединение и другие операции) следует выполнять в классе StringBuilder, как показано в следующем примере.
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("one ");
sb.Append("two ");
sb.Append("three");
string str = sb.ToString();
System.Console.WriteLine(str);
// Outputs: one two three
|
Работа со строками
Escape-знаки
Строки могут содержать escape-знаки, такие как "\n" (новая строка) и "\t" (табуляция). Строка:
string hello = "Hello\nWorld!";
|
эквивалентна строке:
Hello
World!
Если требуется добавить в строку обратную косую черту, перед ней нужно поставить еще одну обратную косую черту. Следующая строка:
string filePath = "\\\\My Documents\\";
|
эквивалентна строке:
\\My Documents\
Verbatim Strings: The @ Symbol
The @ symbol tells the string constructor to ignore escape characters and line breaks. The following two strings are therefore identical:
string p1 = "\\\\My Documents\\My Files\\";
string p2 = @"\\My Documents\My Files\";
|
In a verbatim string, you escape the double quotation mark character with a second double quotation mark character, as in the following example:
string s = @"You say ""goodbye"" and I say ""hello""";
|
Accessing Individual Characters
Individual characters that are contained in a string can be accessed by using methods such as SubString() and Replace().
string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2)); // outputs "C#"
System.Console.WriteLine(s3.Replace("C#", "Basic")); // outputs "Visual Basic Express"
|
It is also possible to copy the characters into a character array, as in the following example:
string s4 = "Hello, World";
char[] arr = s4.ToCharArray(0, s4.Length);
foreach (char c in arr)
{
System.Console.Write(c); // outputs "Hello, World"
}
|
Individual characters from a string can be accessed with an index, as in the following example:
string s5 = "Printing backwards";
for (int i = 0; i < s5.Length; i++)
{
System.Console.Write(s5[s5.Length - i - 1]); // outputs "sdrawkcab gnitnirP"
}
|
Точные строки: символ @
Символ @ служит для того, чтобы конструктор строк пропускал escape-знаки и переносы строки. Следующие две строки являются идентичными:
string p1 = "\\\\My Documents\\My Files\\";
string p2 = @"\\My Documents\My Files\";
|
Чтобы поставить в точной строке знак двойных кавычек, нужно использовать по два таких знака, как показано в следующем примере:
string s = @"You say ""goodbye"" and I say ""hello""";
|
Доступ к отдельным знакам
К отдельным знакам, содержащимся в строке, можно получить доступ с помощью таких методов как SubString() и Replace().
string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2)); // outputs "C#"
System.Console.WriteLine(s3.Replace("C#", "Basic")); // outputs "Visual Basic Express"
|
Также можно скопировать символы строки в массив символов, как показано в следующем примере.
string s4 = "Hello, World";
char[] arr = s4.ToCharArray(0, s4.Length);
foreach (char c in arr)
{
System.Console.Write(c); // outputs "Hello, World"
}
|
Доступ к отдельным знакам в строке возможен с помощью индекса, как показано в следующем примере.
string s5 = "Printing backwards";
for (int i = 0; i < s5.Length; i++)
{
System.Console.Write(s5[s5.Length - i - 1]); // outputs "sdrawkcab gnitnirP"
}
|
Changing Case
To change the letters in a string to uppercase or lowercase, use ToUpper() or ToLower(), as in the following example:
string s6 = "Battle of Hastings, 1066";
System.Console.WriteLine(s6.ToUpper()); // outputs "BATTLE OF HASTINGS 1066"
System.Console.WriteLine(s6.ToLower()); // outputs "battle of hastings 1066"
|
Comparisons
The simplest way to compare two strings is to use the == and != operators, which perform a case-sensitive comparison.
string color1 = "red";
string color2 = "green";
string color3 = "red";
if (color1 == color3)
{
System.Console.WriteLine("Equal");
}
if (color1 != color2)
{
System.Console.WriteLine("Not equal");
}
|
String objects also have a CompareTo() method that returns an integer value that is based on whether one string is less-than (<), equal to (==) or greater-than (>) another. When comparing strings, the Unicode value is used, and lowercase has a smaller value than uppercase. For more information about the rules for comparing strings, see CompareTo()()().
// Enter different values for string1 and string2 to
// experiement with behavior of CompareTo
string string1 = "ABC";
string string2 = "abc";
int result = string1.CompareTo(string2);
if (result > 0)
{
System.Console.WriteLine("{0} is greater than {1}", string1, string2);
}
else if (result == 0)
{
System.Console.WriteLine("{0} is equal to {1}", string1, string2);
}
else if (result < 0)
{
System.Console.WriteLine("{0} is less than {1}", string1, string2);
}
// Outputs: ABC is less than abc
|
Смена регистра
Чтобы изменить регистр букв в строке (сделать их заглавными или строчными), следует использовать ToUpper() или ToLower(), как показано в следующем примере.
string s6 = "Battle of Hastings, 1066";
System.Console.WriteLine(s6.ToUpper()); // outputs "BATTLE OF HASTINGS 1066"
System.Console.WriteLine(s6.ToLower()); // outputs "battle of hastings 1066"
|
Сравнения
Самый простой способ сравнения двух строк — использовать операторы == и !=, осуществляющие сравнение с учетом регистра.
string color1 = "red";
string color2 = "green";
string color3 = "red";
if (color1 == color3)
{
System.Console.WriteLine("Equal");
}
if (color1 != color2)
{
System.Console.WriteLine("Not equal");
}
|
Для строковых объектов также существует метод CompareTo(), возвращающий целочисленное значение, зависящее от того, одна строка меньше (<), равна (==) или больше другой (>). При сравнении строк используется значение Юникода, при этом значение строчных букв меньше, чем значение заглавных. Дополнительные сведения о правилах сравнения строк см. в разделах CompareTo()()().
--
To search for a string inside another string, use IndexOf(). IndexOf() returns -1 if the search string is not found; otherwise, it returns the zero-based index of the first location at which it occurs.
string s9 = "Battle of Hastings, 1066";
System.Console.WriteLine(s9.IndexOf("Hastings")); // outputs 10
System.Console.WriteLine(s9.IndexOf("1967")); // outputs -1
|
Splitting a String into Substrings
Splitting a string into substrings, such as splitting a sentence into individual words, is a common programming task. The Split() method takes a char array of delimiters, for example, a space character, and returns an array of substrings. You can access this array with foreach, as in the following example:
char[] delimit = new char[] { ' ' };
string s10 = "The cat sat on the mat.";
foreach (string substr in s10.Split(delimit))
{
System.Console.WriteLine(substr);
}
|
This code outputs each word on a separate line, as in the following example:
The
cat
sat
on
the
mat.
Null Strings and Empty Strings
An empty string is an instance of a System..::.String object that contains zero characters. Empty strings are used often in various programming scenarios to represent a blank text field. You can call methods on empty strings because they are valid System..::.String objects. Empty strings are initialized as follows:
By contrast, a null string does not refer to an instance of a System..::.String object and any attempt to call a method on a null string causes a NullReferenceException. However, you can use null strings in concatenation and comparison operations with other strings. The following examples illustrate some cases in which a reference to a null string does and does not cause an exception to be thrown:
string str = "hello";
string nullStr = null;
string emptyStr = "";
string tempStr = str + nullStr; // tempStr = "hello"
bool b = (emptyStr == nullStr);// b = false;
emptyStr + nullStr = ""; // creates a new empty string
int len = nullStr.Length; // throws NullReferenceException
|
Чтобы найти строку внутри другой строки следует использовать IndexOf(). Метод IndexOf() возвращает значение -1, если искомая строка не найдена; в противном случае возвращается индекс первого вхождения искомой строки (отсчет ведется с нуля).
string s9 = "Battle of Hastings, 1066";
System.Console.WriteLine(s9.IndexOf("Hastings")); // outputs 10
System.Console.WriteLine(s9.IndexOf("1967")); // outputs -1
|
Разделение строки на подстроки
Разделение строки на подстроки, аналогичное разделению предложения на отдельные слова, является распространенной задачей в программировании. Метод Split() получает массив разделителей типа char (например, разделителем может быть пробел) и возвращает массив подстрок. Для доступа к этому массиву можно использовать foreach, как показано в следующем примере:
--
Этот код выводит каждое слово в отдельной строке, как показано в следующем примере:
The
cat
sat
on
the
mat.
Строки с нулевыми значениями и пустые строки
Пустая строка — это экземпляр объекта System..::.String, содержащий 0 знаков. Пустые строки часто используются в различных сценариях программирования, представляя пустое текстовое поле. Для пустых строк можно вызывать методы, потому что такие строки являются допустимыми объектами System..::.String. Пустые строки инициализируются следующим образом:
Строки со значениями null (с нулевыми значениями), напротив, не ссылаются на экземпляр объекта System..::.String, любая попытка вызвать метод, используя в качестве объекта строку со значением null, приведет к ошибке NullReferenceException. Однако такие строки можно использовать в операциях объединения и сравнения с другими строками. В следующих примерах показаны некоторые случаи, в которых ссылка на строку со значением null вызывает либо не вызывает исключение:
--
Using StringBuilder
The StringBuilder class creates a string buffer that offers better performance if your program performs many string manipulations. The StringBuilder string also enables you to reassign individual characters, something the built-in string data type does not support. This code, for example, changes the content of a string without creating a new string:
System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();
//Outputs Cat: the ideal pet
|
In this example, a StringBuilder object is used to create a string from a set of numeric types:
class TestStringBuilder
{
static void Main()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
// Create a string composed of numbers 0 - 9
for (int i = 0; i < 10; i++)
{
sb.Append(i.ToString());
}
System.Console.WriteLine(sb); // displays 0123456789
// Copy one character of the string (not possible with a System.String)
sb[0] = sb[9];
System.Console.WriteLine(sb); // displays 9123456789
}
}
|
Использование класса StringBuilder13
Класс StringBuilder создает строковый буфер, который позволяет повысить производительность, если в программе обрабатывается много строк. Класс StringBuilder также позволяет заново присваивать отдельные знаки, что не поддерживается встроенным строковым типом данных. Например, данный код заменяет содержимое строки без создания новой строки:
System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();
//Outputs Cat: the ideal pet
|
В этом примере объект StringBuilder используется для создания строки из набора числовых типов:
class TestStringBuilder
{
static void Main()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
// Create a string composed of numbers 0 - 9
for (int i = 0; i < 10; i++)
{
sb.Append(i.ToString());
}
System.Console.WriteLine(sb); // displays 0123456789
// Copy one character of the string (not possible with a System.String)
sb[0] = sb[9];
System.Console.WriteLine(sb); // displays 9123456789
}
}
|
How to: Parse Strings Using the Split Method
The following code example demonstrates how a string can be parsed using the String..::.Split method. This method works by returning an array of strings, where each element is a word. As input, Split takes an array of chars that indicate which characters are to be used as delimiters. In this example, spaces, commas, periods, colons, and tabs are used. An array containing these delimiters is passed to Split, and each word in the sentence is displayed separately using the resulting array of strings.
Example
class TestStringSplit
{
static void Main()
{
char[] delimiterChars = { ' ', ',', '.', ':', '\t' };
string text = "one\ttwo three:four,five six seven";
System.Console.WriteLine("Original text: '{0}'", text);
string[] words = text.Split(delimiterChars);
System.Console.WriteLine("{0} words in text:", words.Length);
foreach (string s in words)
{
System.Console.WriteLine(s);
}
}
}
|
Original text: 'one two three:four,five six seven'
7 words in text:
one
two
three
four
five
six
seven
|
Анализ строк с помощью метода разделения
Следующий пример кода демонстрирует возможность анализа строки при помощи метода String..::.Split. Работа метода заключается в возврате массива строк, в котором каждый элемент представляет слово. В качестве ввода Split принимает массив символов, определяющих какие символы должны использоваться в качестве разделителей. В этом примере используются пробелы, запятые, точки, двоеточия и табуляция. Массив, содержащий эти разделители, передается в Split, и каждое слово в предложении выводится отдельно при помощи результирующего массива строк.
Пример
class TestStringSplit
{
static void Main()
{
char[] delimiterChars = { ' ', ',', '.', ':', '\t' };
string text = "one\ttwo three:four,five six seven";
System.Console.WriteLine("Original text: '{0}'", text);
string[] words = text.Split(delimiterChars);
System.Console.WriteLine("{0} words in text:", words.Length);
foreach (string s in words)
{
System.Console.WriteLine(s);
}
}
}
|
Original text: 'one two three:four,five six seven'
7 words in text:
one
two
three
four
five
six
seven
|
How to: Search Strings Using String Methods
The string type, which is an alias for the System..::.String class, provides a number of useful methods for searching the contents of a string. The following example uses the IndexOf, LastIndexOf, StartsWith, and EndsWith methods.
Example
class StringSearch
{
static void Main()
{
string str =
"Extension methods have all the capabilities of regular static methods.";
// Write the string and include the quotation marks
System.Console.WriteLine("\"{0}\"",str);
bool test1 = str.StartsWith("extension");
System.Console.WriteLine("starts with \"extension\"? {0}", test1);
bool test2 = str.StartsWith("extension",
System.StringComparison.OrdinalIgnoreCase);
System.Console.WriteLine("starts with \"extension\"? {0} (ignoring case)",
test2);
bool test3 = str.EndsWith(".");
System.Console.WriteLine("ends with '.'? {0}", test3);
int first = str.IndexOf("method");
int last = str.LastIndexOf("method");
string str2 = str.Substring(first, last - first);
System.Console.WriteLine("between two \"method\" words: '{0}'", str2);
// Keep the console window open in debug mode
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
|
'A silly sentence used for silly purposes.'
starts with 'a silly'? False
starts with 'a silly'? True (ignore case)
ends with '.'? True
between two 'silly' words: 'silly sentence used for '
|
Навигация по содержимому строки с помощью строковых методов
Тип string, являющийся псевдонимом класса System..::.String, позволяет использовать несколько полезных методов для навигации по содержимому строки. В следующем примере используются методы IndexOf, LastIndexOf, StartsWith и EndsWith.
Пример
---
How to: Search Strings Using Regular Expressions
The System.Text.RegularExpressions..::.Regex class can be used to search strings. These searches can range in complexity from very simple to making full use of regular expressions. The following are two examples of string searching by using the Regex class.
Example
The following code is a console application that performs a simple case-insensitive search of the strings in an array. The static method Regex..::.IsMatch performs the search given the string to search and a string that contains the search pattern. In this case, a third argument is used to indicate that case should be ignored. For more information, see System.Text.RegularExpressions..::.RegexOptions.
class TestRegularExpressions
{
static void Main()
{
string[] sentences =
{
"cow over the moon",
"Betsy the Cow",
"cowering in the corner",
"no match here"
};
string sPattern = "cow";
foreach (string s in sentences)
{
System.Console.Write("{0,24}", s);
if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern,
System.Text.RegularExpressions.RegexOptions.IgnoreCase))
{
System.Console.WriteLine(" (match for '{0}' found)", sPattern);
}
else
{
System.Console.WriteLine();
}
}
}
}
|
cow over the moon (match for 'cow' found)
Betsy the Cow (match for 'cow' found)
cowering in the corner (match for 'cow' found)
no match here
|
Анализ строк с помощью регулярных выражений14
Класс System.Text.RegularExpressions..::.Regex можно использовать для поиска строк. Поиск может отличаться по сложности и быть как простым, так и интенсивно использовать регулярные выражения. Ниже приведены два примера поиска строк с помощью класса Regex.
Пример
Следующий пример кода является консольным приложением, которое выполняет простой поиск строк в массиве без учета регистра. Статический метод Regex..::.IsMatch выполняет поиск заданной строки и строки, содержащей шаблон поиска. В этом случае третий аргумент указывает, что регистр знаков следует игнорировать.
---
The following code is a console application that uses regular expressions to validate the format of each string in an array. The validation requires that each string take the form of a telephone number in which three groups of digits are separated by dashes, the first two groups contain three digits, and the third group contains four digits. This is done by using the regular expression ^\\d{3}-\\d{3}-\\d{4}$.
class TestRegularExpressionValidation
{
static void Main()
{
string[] numbers =
{
"123-456-7890",
"444-234-22450",
"690-203-6578",
"146-893-232",
"146-839-2322",
"4007-295-1111",
"407-295-1111",
"407-2-5555",
};
string sPattern = "^\\d{3}-\\d{3}-\\d{4}$";
foreach (string s in numbers)
{
System.Console.Write("{0,14}", s);
if (System.Text.RegularExpressions.Regex.IsMatch(s, sPattern))
{
System.Console.WriteLine(" - valid");
}
else
{
System.Console.WriteLine(" - invalid");
}
}
}
}
|
123-456-7890 - valid
444-234-22450 - invalid
690-203-6578 - valid
146-893-232 - invalid
146-839-2322 - valid
4007-295-1111 - invalid
407-295-1111 - valid
407-2-5555 - invalid
|
Следующий пример кода является консольным приложением, которое использует регулярные выражения для проверки формата каждой строки массива. Для выполнения проверки требуется преобразование каждой строки в формат телефонного номера, в котором три группы цифр разделены дефисами, первые две группы содержат три цифры, а третья группа — четыре цифры. Для этого используется регулярное выражение ^\\d{3}-\\d{3}-\\d{4}$.
----
How to: Join Multiple Strings
There are two ways to join multiple strings: using the + operator that the String class overloads, and using the StringBuilder class. The + operator is easy to use and makes for intuitive code, but it works in series; a new string is created for each use of the operator, so chaining multiple operators together is inefficient. For example:
string two = "two";
string str = "one " + two + " three";
System.Console.WriteLine(str);
|
Although four strings appear in the code, the three strings being joined and the final string containing all three, five strings are created in total because the first two strings are joined first, creating a string containing "one two." The third is appended separately, forming the final string stored in str.
Alternatively, the StringBuilder class can be used to add each string to an object that then creates the final string in one step. This strategy is demonstrated in the following example.
Example
The following code uses the Append method of the StringBuilder class to join three strings without the chaining effect of the + operator.
class StringBuilderTest
{
static void Main()
{
string two = "two";
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("one ");
sb.Append(two);
sb.Append(" three");
System.Console.WriteLine(sb.ToString());
string str = sb.ToString();
System.Console.WriteLine(str);
}
}
|
Объединение нескольких строк
Имеется несколько способов объединения нескольких строк: перегрузка оператора + для класса String и использование класса StringBuilder. Оператор + удобен в использовании и позволяет сформировать наглядный код, но он работает последовательно. При каждом использовании оператора создается новая строка, поэтому создание цепочки из нескольких операторов неэффективно. Пример.
string two = "two";
string str = "one " + two + " three";
System.Console.WriteLine(str);
|
Хотя в коде фигурируют четыре строки (три объединяемых строки и одна строка результата, содержащая все три), всего создается пять строк, поскольку сначала объединяются первые две строки, создавая одну результирующую строку. Третья строка присоединяется отдельно, формируя окончательную строку, хранящуюся в str.
Можно также использовать класс StringBuilder для добавления каждой строки в объект, который затем создает результирующую строку за одно действие. Этот подход показан в следующем примере.
Пример
В следующем коде используется метод "Append" класса StringBuilder для объединения трех строк без "эффекта цепочки" оператора +.
---
How to: Modify String Contents
Strings are immutable, so it is not possible to modify the contents of string. The contents of a string can, however, be extracted into a non-immutable form, modified, and then formed into a new string instance.
Example
The following example uses the ToCharArray method to extract the contents of a string into an array of the char type. Some of the elements of this array are then modified. The char array is then used to create a new string instance.
class ModifyStrings
{
static void Main()
{
string str = "The quick brown fox jumped over the fence";
System.Console.WriteLine(str);
char[] chars = str.ToCharArray();
int animalIndex = str.IndexOf("fox");
if (animalIndex != -1)
{
chars[animalIndex++] = 'c';
chars[animalIndex++] = 'a';
chars[animalIndex] = 't';
}
string str2 = new string(chars);
System.Console.WriteLine(str2);
}
}
|
The quick brown fox jumped over the fence
The quick brown cat jumped over the fence
|
Изменение содержимого строки
Строки являются неизменяемыми, поэтому их содержимое изменить невозможно. Однако содержимое строки можно извлечь в форму для редактирования, выполнить изменения, а затем передать в новый экземпляр строки.
Пример
В следующем примере для извлечения содержимого строки в массив типа char используется метод ToCharArray. Затем некоторые элементы массива изменяются. После этого массив char используется для создания нового экземпляра строки.
---
How to: Determine Whether a String Contains a Numeric Value
To determine whether a string is a valid representation of a specified numeric type, use the static TryParse method. This method is implemented by all primitive numeric types and also by types such as DateTime and IPAddress. The following example shows how to determine whether "108" is a valid int.
int i = 0;
string s = "108";
bool result = int.TryParse(s, out i); //i now = 108
|
If the string contains nonnumeric characters or the numeric value is too large or too small for the particular type you have specified, TryParse returns false and sets the out parameter to zero. Otherwise, it returns true and sets the out parameter to the numeric value of the string.
Note:
|
A string may contain only numeric characters and still not be valid for the type whose TryParse method that you use. For example, "256" is not a valid value for byte but it is valid for int. "98.6" is not a valid value for int but it is a valid decimal.
|
Определение наличия числового значения в строке
Чтобы определить, является ли строка допустимым представлением указанного числового типа, воспользуйтесь статическим методом TryParse. Этот метод реализован всеми простыми числовыми типами и такими типами, как DateTime и IPAddress. В следующем примере показано, как определить, является ли число 108 допустимым типом int.
int i = 0;
string s = "108";
bool result = int.TryParse(s, out i); //i now = 108
|
Если строка содержит нечисловые знаки, либо числовое значение слишком велико или мало для указанного типа, TryParse возвращает значение "false" и задает выходному параметру значение "0". В противном случае возвращается значение "true", а выходному параметру задается числовое значение строки.
Примечание.
|
Строка может содержать только числовые знаки и оставаться недопустимой для типа, где используется метод TryParse. Например, "256" не является допустимым значением для byte, однако оно допустимо для int. "98,6" не является допустимым значением для int, однако оно допустимо для decimal.
|
Example
The following examples show how to use TryParse with string representations of long, byte, and decimal values.
static void Main(string[] args)
{
string s = "1287543"; //"1287543.0" will return false for a long
long number1 = 0;
bool result = long.TryParse(s, out number1);
if (result == true)
Console.WriteLine("number1 now = {0}", number1);
else
Console.WriteLine("s is not a valid long");
byte number2 = 0;
s = "255"; // A value of 256 will return false
result = byte.TryParse(s, out number2);
if (result == true)
Console.WriteLine("number2 now = {0}", number2);
else
Console.WriteLine("s is not a valid byte");
decimal number3 = 0;
s = "27.3"; //"27" is also a valid decimal
result = decimal.TryParse(s, out number3);
if (result == true)
Console.WriteLine("number3 now = {0}", number3);
else
Console.WriteLine("number3 is not a valid decimal");
}
|
Robust Programming
Primitive numeric types also implement the Parse static method, which throws an exception if the string is not a valid number. TryParse is generally more efficient because it just returns false if the number is not valid.
Security
Always use the TryParse or Parse methods to validate user input from controls such as text boxes and combo boxes.
Пример
В следующем примере показано использование TryParse со строковыми представлениями значений long, byte и decimal.
--
Надежное программирование
Простые числовые типы также реализуют статический метод Parse, который вызывает исключение, если строка не является допустимым числом. TryParse обычно более эффективен, поскольку он просто возвращает значение "false", если число не является допустимым.
Безопасность
Для проверки данных, введенных пользователем в такие элементы управления, как текстовые поля и поля со списком, всегда следует использовать метод TryParse или Parse.
|