6 // Jeffrey Stedfast (fejj@ximian.com)
7 // Dan Lewis (dihlewis@yahoo.co.uk)
9 // (C) 2001 Ximian, Inc. http://www.ximian.com
14 using System.Collections;
15 using System.Globalization;
16 using System.Runtime.CompilerServices;
21 public sealed class String : IConvertible, IComparable, ICloneable, IEnumerable
23 [NonSerialized] private int length;
24 [NonSerialized] private char start_char;
26 private const int COMPARE_CASE = 0;
27 private const int COMPARE_INCASE = 1;
28 private const int COMPARE_ORDINAL = 2;
30 public static readonly String Empty = "";
32 public static unsafe bool Equals (string a, string b)
34 if ((a as object) == (b as object))
37 if (a == null || b == null)
48 fixed (char * s1 = &a.start_char, s2 = &b.start_char) {
49 // it must be one char, because 0 len is done above
54 int * sint1 = (int *) s1, sint2 = (int *) s2;
57 if (*sint1++ != *sint2++)
66 return *(char *) sint1 == *(char *) sint2;
70 public static bool operator == (String a, String b)
75 public static bool operator != (String a, String b)
77 return !Equals (a, b);
80 public override bool Equals (Object obj)
82 return Equals (this, obj as String);
85 public bool Equals (String value)
87 return Equals (this, value);
90 [IndexerName ("Chars")]
91 public extern char this [int index] {
92 [MethodImplAttribute (MethodImplOptions.InternalCall)]
96 public Object Clone ()
101 public TypeCode GetTypeCode ()
103 return TypeCode.String;
106 public void CopyTo (int sourceIndex, char[] destination, int destinationIndex, int count)
108 // LAMESPEC: should I null-terminate?
109 if (destination == null)
110 throw new ArgumentNullException ("destination");
112 if (sourceIndex < 0 || destinationIndex < 0 || count < 0)
113 throw new ArgumentOutOfRangeException ();
115 if (sourceIndex + count > Length)
116 throw new ArgumentOutOfRangeException ();
118 if (destinationIndex + count > destination.Length)
119 throw new ArgumentOutOfRangeException ();
121 InternalCopyTo (sourceIndex, destination, destinationIndex, count);
124 public char[] ToCharArray ()
126 return ToCharArray (0, length);
129 public char[] ToCharArray (int startIndex, int length)
131 if (startIndex < 0 || length < 0 || startIndex + length > this.length)
132 throw new ArgumentOutOfRangeException ();
134 char [] tmp = new char[length];
136 InternalCopyTo (startIndex, tmp, 0, length);
141 public String [] Split (params char [] separator)
143 return Split (separator, Int32.MaxValue);
146 public String[] Split (char[] separator, int count)
148 if (separator == null || separator.Length == 0)
149 separator = WhiteChars;
152 throw new ArgumentOutOfRangeException ();
155 return new String[0];
158 return new String[1] { ToString() };
160 return InternalSplit (separator, count);
163 public String Substring (int startIndex)
165 if (startIndex < 0 || startIndex > this.length)
166 throw new ArgumentOutOfRangeException ("startIndex");
168 string tmp = InternalAllocateStr (this.length - startIndex);
169 InternalStrcpy (tmp, 0, this, startIndex, length - startIndex);
174 public String Substring (int startIndex, int length)
176 if (length < 0 || startIndex < 0 || startIndex + length > this.length)
177 throw new ArgumentOutOfRangeException ();
182 string tmp = InternalAllocateStr (length);
183 InternalStrcpy (tmp, 0, this, startIndex, length);
188 private static readonly char[] WhiteChars = { (char) 0x9, (char) 0xA, (char) 0xB, (char) 0xC, (char) 0xD,
189 (char) 0x20, (char) 0xA0, (char) 0x2000, (char) 0x2001, (char) 0x2002, (char) 0x2003, (char) 0x2004,
190 (char) 0x2005, (char) 0x2006, (char) 0x2007, (char) 0x2008, (char) 0x2009, (char) 0x200A, (char) 0x200B,
191 (char) 0x3000, (char) 0xFEFF };
193 public String Trim (params char[] trimChars)
195 if (trimChars == null || trimChars.Length == 0)
196 trimChars = WhiteChars;
198 return InternalTrim (trimChars, 0);
201 public String TrimStart (params char[] trimChars)
203 if (trimChars == null || trimChars.Length == 0)
204 trimChars = WhiteChars;
206 return InternalTrim (trimChars, 1);
209 public String TrimEnd (params char[] trimChars)
211 if (trimChars == null || trimChars.Length == 0)
212 trimChars = WhiteChars;
214 return InternalTrim (trimChars, 2);
217 public static int Compare (String strA, String strB)
219 return Compare (strA, strB, false, CultureInfo.CurrentCulture);
222 public static int Compare (String strA, String strB, bool ignoreCase)
224 return Compare (strA, strB, ignoreCase, CultureInfo.CurrentCulture);
227 public static int Compare (String strA, String strB, bool ignoreCase, CultureInfo culture)
230 throw new ArgumentNullException ("culture");
239 else if (strB == null) {
243 CompareOptions compopts;
246 compopts = CompareOptions.IgnoreCase;
248 compopts = CompareOptions.None;
250 return culture.CompareInfo.Compare (strA, strB, compopts);
253 public static int Compare (String strA, int indexA, String strB, int indexB, int length)
255 return Compare (strA, indexA, strB, indexB, length, false, CultureInfo.CurrentCulture);
258 public static int Compare (String strA, int indexA, String strB, int indexB, int length, bool ignoreCase)
260 return Compare (strA, indexA, strB, indexB, length, ignoreCase, CultureInfo.CurrentCulture);
263 public static int Compare (String strA, int indexA, String strB, int indexB, int length, bool ignoreCase, CultureInfo culture)
266 throw new ArgumentNullException ("culture");
268 if ((indexA > strA.Length) || (indexB > strB.Length) || (indexA < 0) || (indexB < 0) || (length < 0))
269 throw new ArgumentOutOfRangeException ();
281 else if (strB == null) {
285 CompareOptions compopts;
288 compopts = CompareOptions.IgnoreCase;
290 compopts = CompareOptions.None;
292 /* Need to cap the requested length to the
293 * length of the string, because
294 * CompareInfo.Compare will insist that length
295 * <= (string.Length - offset)
300 if (length > (strA.Length - indexA)) {
301 len1 = strA.Length - indexA;
304 if (length > (strB.Length - indexB)) {
305 len2 = strB.Length - indexB;
308 return culture.CompareInfo.Compare (strA, indexA, len1, strB, indexB, len2, compopts);
311 public int CompareTo (Object value)
316 if (!(value is String))
317 throw new ArgumentException ();
319 return String.Compare (this, (String) value, false);
322 public int CompareTo (String strB)
327 return Compare (this, strB, false);
330 public static int CompareOrdinal (String strA, String strB)
338 else if (strB == null) {
342 /* Invariant, because that is cheaper to
343 * instantiate (and chances are it already has
346 return CultureInfo.InvariantCulture.CompareInfo.Compare (strA, strB, CompareOptions.Ordinal);
349 public static int CompareOrdinal (String strA, int indexA, String strB, int indexB, int length)
351 if ((indexA > strA.Length) || (indexB > strB.Length) || (indexA < 0) || (indexB < 0) || (length < 0))
352 throw new ArgumentOutOfRangeException ();
360 else if (strB == null) {
364 /* Need to cap the requested length to the
365 * length of the string, because
366 * CompareInfo.Compare will insist that length
367 * <= (string.Length - offset)
372 if (length > (strA.Length - indexA)) {
373 len1 = strA.Length - indexA;
376 if (length > (strB.Length - indexB)) {
377 len2 = strB.Length - indexB;
380 return CultureInfo.InvariantCulture.CompareInfo.Compare (strA, indexA, len1, strB, indexB, len2, CompareOptions.Ordinal);
383 public bool EndsWith (String value)
386 throw new ArgumentNullException ("value");
388 if (value == String.Empty)
391 if (value.length > this.length)
394 return (0 == Compare (this, length - value.length, value, 0, value.length));
397 public int IndexOfAny (char [] anyOf)
400 throw new ArgumentNullException ("anyOf");
402 return InternalIndexOfAny (anyOf, 0, this.length);
405 public int IndexOfAny (char [] anyOf, int startIndex)
408 throw new ArgumentNullException ("anyOf");
409 if (startIndex < 0 || startIndex >= this.length)
410 throw new ArgumentOutOfRangeException ("sourceIndex");
412 return InternalIndexOfAny (anyOf, startIndex, this.length - startIndex);
415 public int IndexOfAny (char [] anyOf, int startIndex, int count)
418 throw new ArgumentNullException ("anyOf");
419 if (startIndex < 0 || count < 0 || startIndex + count > this.length)
420 throw new ArgumentOutOfRangeException ();
422 return InternalIndexOfAny (anyOf, startIndex, count);
425 public int IndexOf (char value)
427 return IndexOf (value, 0, this.length);
430 public int IndexOf (String value)
432 return IndexOf (value, 0, this.length);
435 public int IndexOf (char value, int startIndex)
437 return IndexOf (value, startIndex, this.length - startIndex);
440 public int IndexOf (String value, int startIndex)
442 return IndexOf (value, startIndex, this.length - startIndex);
445 /* This method is culture-insensitive */
446 public int IndexOf (char value, int startIndex, int count)
448 if (startIndex < 0 || count < 0 || startIndex + count > this.length)
449 throw new ArgumentOutOfRangeException ();
451 if ((startIndex == 0 && this.length == 0) || (startIndex == this.length) || (count == 0))
454 for (int pos = startIndex; pos < startIndex + count; pos++) {
455 if (this[pos] == value)
461 /* But this one is culture-sensitive */
462 public int IndexOf (String value, int startIndex, int count)
465 throw new ArgumentNullException ("value");
467 if (startIndex < 0 || count < 0 || startIndex + count > this.length)
468 throw new ArgumentOutOfRangeException ();
470 if (value.length == 0)
473 if (startIndex == 0 && this.length == 0)
479 return CultureInfo.CurrentCulture.CompareInfo.IndexOf (this, value, startIndex, count);
482 public int LastIndexOfAny (char [] anyOf)
485 throw new ArgumentNullException ("anyOf");
487 return InternalLastIndexOfAny (anyOf, this.length - 1, this.length);
490 public int LastIndexOfAny (char [] anyOf, int startIndex)
493 throw new ArgumentNullException ("anyOf");
495 if (startIndex < 0 || startIndex > this.length)
496 throw new ArgumentOutOfRangeException ();
498 if (this.length == 0)
501 return InternalLastIndexOfAny (anyOf, startIndex, startIndex + 1);
504 public int LastIndexOfAny (char [] anyOf, int startIndex, int count)
507 throw new ArgumentNullException ("anyOf");
509 if (startIndex < 0 || count < 0 || startIndex > this.length || startIndex - count < -1)
510 throw new ArgumentOutOfRangeException ();
512 if (this.length == 0)
515 return InternalLastIndexOfAny (anyOf, startIndex, count);
518 public int LastIndexOf (char value)
520 if (this.length == 0)
523 return LastIndexOf (value, this.length - 1, this.length);
526 public int LastIndexOf (String value)
528 if (this.length == 0)
529 /* This overload does additional checking */
530 return LastIndexOf (value, 0, 0);
532 return LastIndexOf (value, this.length - 1, this.length);
535 public int LastIndexOf (char value, int startIndex)
537 return LastIndexOf (value, startIndex, startIndex + 1);
540 public int LastIndexOf (String value, int startIndex)
542 return LastIndexOf (value, startIndex, startIndex + 1);
545 /* This method is culture-insensitive */
546 public int LastIndexOf (char value, int startIndex, int count)
548 if (startIndex == 0 && this.length == 0)
551 if (startIndex < 0 || count < 0)
552 throw new ArgumentOutOfRangeException ();
554 if (startIndex >= this.length || startIndex - count + 1 < 0)
555 throw new ArgumentOutOfRangeException ();
557 for(int pos = startIndex; pos > startIndex - count; pos--) {
558 if (this [pos] == value)
564 /* But this one is culture-sensitive */
565 public int LastIndexOf (String value, int startIndex, int count)
568 throw new ArgumentNullException ("value");
570 if (value == String.Empty)
573 if (startIndex == 0 && this.length == 0)
576 // This check is needed to match undocumented MS behaviour
577 if (this.length == 0 && value.length > 0)
580 if (value.length > startIndex)
586 if (startIndex < 0 || startIndex > this.length)
587 throw new ArgumentOutOfRangeException ();
589 if (count < 0 || startIndex - count + 1 < 0)
590 throw new ArgumentOutOfRangeException ();
592 return CultureInfo.CurrentCulture.CompareInfo.LastIndexOf (this, value, startIndex, count);
595 public String PadLeft (int totalWidth)
597 return PadLeft (totalWidth, ' ');
600 public String PadLeft (int totalWidth, char paddingChar)
603 throw new ArgumentException ();
605 if (totalWidth < this.length)
606 return String.Copy (this);
608 return InternalPad (totalWidth, paddingChar, false);
611 public String PadRight (int totalWidth)
613 return PadRight (totalWidth, ' ');
616 public String PadRight (int totalWidth, char paddingChar)
619 throw new ArgumentException ();
621 if (totalWidth < this.length)
622 return String.Copy (this);
624 return InternalPad (totalWidth, paddingChar, true);
627 public bool StartsWith (String value)
630 throw new ArgumentNullException ("value");
632 if (value == String.Empty)
635 if (this.length < value.length)
638 return (0 == Compare (this, 0, value, 0 , value.length));
641 /* This method is culture insensitive */
642 public String Replace (char oldChar, char newChar)
644 return InternalReplace (oldChar, newChar);
647 /* This method is culture sensitive */
648 public String Replace (String oldValue, String newValue)
650 if (oldValue == null)
651 throw new ArgumentNullException ("oldValue");
653 if (oldValue == String.Empty)
654 throw new ArgumentException ("oldValue is the empty string.");
656 if (this == String.Empty)
659 if (newValue == null)
660 newValue = String.Empty;
662 return InternalReplace (oldValue, newValue, CultureInfo.CurrentCulture.CompareInfo);
665 public String Remove (int startIndex, int count)
667 if (startIndex < 0 || count < 0 || startIndex + count > this.length)
668 throw new ArgumentOutOfRangeException ();
670 return InternalRemove (startIndex, count);
673 public String ToLower ()
675 return InternalToLower (CultureInfo.CurrentCulture);
678 public String ToLower (CultureInfo culture)
680 return InternalToLower (culture);
683 public String ToUpper ()
685 return InternalToUpper (CultureInfo.CurrentCulture);
688 public String ToUpper (CultureInfo culture)
690 return InternalToUpper (culture);
693 public override String ToString ()
698 public String ToString (IFormatProvider provider)
703 public String Trim ()
708 public static String Format (String format, Object arg0)
710 return Format (null, format, new Object[] {arg0});
713 public static String Format (String format, Object arg0, Object arg1)
715 return Format (null, format, new Object[] {arg0, arg1});
718 public static String Format (String format, Object arg0, Object arg1, Object arg2)
720 return Format (null, format, new Object[] {arg0, arg1, arg2});
723 public static string Format (string format, params object[] args)
725 return Format (null, format, args);
728 public static string Format (IFormatProvider provider, string format, params object[] args)
730 StringBuilder b = new StringBuilder ();
731 FormatHelper (b, provider, format, args);
732 return b.ToString ();
735 internal static void FormatHelper (StringBuilder result, IFormatProvider provider, string format, params object[] args)
737 if (format == null || args == null)
738 throw new ArgumentNullException ();
742 while (ptr < format.length) {
743 char c = format[ptr ++];
746 result.Append (format, start, ptr - start - 1);
748 // check for escaped open bracket
750 if (format[ptr] == '{') {
761 ParseFormatSpecifier (format, ref ptr, out n, out width, out left_align, out arg_format);
762 if (n >= args.Length)
763 throw new FormatException ("Index (zero based) must be greater than or equal to zero and less than the size of the argument list.");
767 object arg = args[n];
772 else if (arg is IFormattable)
773 str = ((IFormattable)arg).ToString (arg_format, provider);
775 str = arg.ToString ();
777 // pad formatted string and append to result
779 if (width > str.length) {
780 string pad = new String (' ', width - str.length);
796 else if (c == '}' && ptr < format.length && format[ptr] == '}') {
797 result.Append (format, start, ptr - start - 1);
801 throw new FormatException ("Input string was not in a correct format.");
805 if (start < format.length)
806 result.Append (format.Substring (start));
809 public static String Copy (String str)
812 throw new ArgumentNullException ("str");
814 int length = str.length;
816 String tmp = InternalAllocateStr (length);
817 InternalStrcpy (tmp, 0, str);
821 public static String Concat (Object obj)
826 return obj.ToString ();
829 public static String Concat (Object obj1, Object obj2)
833 s1 = (obj1 != null) ? obj1.ToString () : null;
834 s2 = (obj2 != null) ? obj2.ToString () : null;
841 } else if (s2 == null)
844 String tmp = InternalAllocateStr (s1.Length + s2.Length);
845 InternalStrcpy (tmp, 0, s1);
846 InternalStrcpy (tmp, s1.length, s2);
851 public static String Concat (Object obj1, Object obj2, Object obj3)
857 s1 = obj1.ToString ();
862 s2 = obj2.ToString ();
867 s3 = obj3.ToString ();
869 return Concat (s1, s2, s3);
872 public static String Concat (Object obj1, Object obj2, Object obj3, Object obj4)
874 string s1, s2, s3, s4;
879 s1 = obj1.ToString ();
884 s2 = obj2.ToString ();
889 s3 = obj3.ToString ();
894 s4 = obj4.ToString ();
896 return Concat (s1, s2, s3, s4);
900 public static String Concat (String s1, String s2)
911 String tmp = InternalAllocateStr (s1.length + s2.length);
913 InternalStrcpy (tmp, 0, s1);
914 InternalStrcpy (tmp, s1.length, s2);
919 public static String Concat (String s1, String s2, String s3)
943 //return InternalConcat (s1, s2, s3);
944 String tmp = InternalAllocateStr (s1.length + s2.length + s3.length);
946 InternalStrcpy (tmp, 0, s1);
947 InternalStrcpy (tmp, s1.length, s2);
948 InternalStrcpy (tmp, s1.length + s2.length, s3);
953 public static String Concat (String s1, String s2, String s3, String s4)
955 if (s1 == null && s2 == null && s3 == null && s4 == null)
967 String tmp = InternalAllocateStr (s1.length + s2.length + s3.length + s4.length);
969 InternalStrcpy (tmp, 0, s1);
970 InternalStrcpy (tmp, s1.length, s2);
971 InternalStrcpy (tmp, s1.length + s2.length, s3);
972 InternalStrcpy (tmp, s1.length + s2.length + s3.length, s4);
977 public static String Concat (params Object[] args)
980 int len, i, currentpos;
983 throw new ArgumentNullException ("args");
985 strings = new string [args.Length];
988 foreach (object arg in args) {
989 /* use Empty for each null argument */
991 strings[i] = String.Empty;
993 strings[i] = arg.ToString ();
994 len += strings[i].length;
1003 String tmp = InternalAllocateStr (len);
1004 for (i = 0; i < strings.Length; i++) {
1005 InternalStrcpy (tmp, currentpos, strings[i]);
1006 currentpos += strings[i].length;
1012 public static String Concat (params String[] values)
1014 int len, i, currentpos;
1017 throw new ArgumentNullException ("values");
1020 foreach (string value in values)
1021 len += value != null ? value.length : 0;
1024 return String.Empty;
1028 String tmp = InternalAllocateStr (len);
1029 for (i = 0; i < values.Length; i++) {
1030 if (values[i] == null)
1033 InternalStrcpy (tmp, currentpos, values[i]);
1034 currentpos += values[i].length;
1040 public String Insert (int startIndex, String value)
1043 throw new ArgumentNullException ("value");
1045 if (startIndex < 0 || startIndex > this.length)
1046 throw new ArgumentOutOfRangeException ();
1048 return InternalInsert (startIndex, value);
1052 public static string Intern (string str)
1055 throw new ArgumentNullException ("str");
1057 return InternalIntern (str);
1060 public static string IsInterned (string str)
1063 throw new ArgumentNullException ("str");
1065 return InternalIsInterned (str);
1068 public static string Join (string separator, string [] value)
1071 throw new ArgumentNullException ("value");
1073 return Join (separator, value, 0, value.Length);
1076 public static string Join (string separator, string[] value, int startIndex, int count)
1079 throw new ArgumentNullException ("value");
1081 if (startIndex + count > value.Length)
1082 throw new ArgumentOutOfRangeException ();
1084 if (startIndex == value.Length)
1085 return String.Empty;
1087 return InternalJoin (separator, value, startIndex, count);
1090 bool IConvertible.ToBoolean (IFormatProvider provider)
1092 return Convert.ToBoolean (this);
1095 byte IConvertible.ToByte (IFormatProvider provider)
1097 return Convert.ToByte (this);
1100 char IConvertible.ToChar (IFormatProvider provider)
1102 return Convert.ToChar (this);
1105 DateTime IConvertible.ToDateTime (IFormatProvider provider)
1107 return Convert.ToDateTime (this);
1110 decimal IConvertible.ToDecimal (IFormatProvider provider)
1112 return Convert.ToDecimal (this);
1115 double IConvertible.ToDouble (IFormatProvider provider)
1117 return Convert.ToDouble (this);
1120 short IConvertible.ToInt16 (IFormatProvider provider)
1122 return Convert.ToInt16 (this);
1125 int IConvertible.ToInt32 (IFormatProvider provider)
1127 return Convert.ToInt32 (this);
1130 long IConvertible.ToInt64 (IFormatProvider provider)
1132 return Convert.ToInt64 (this);
1135 [CLSCompliant (false)]
1136 sbyte IConvertible.ToSByte (IFormatProvider provider)
1138 return Convert.ToSByte (this);
1141 float IConvertible.ToSingle (IFormatProvider provider)
1143 return Convert.ToSingle (this);
1146 string IConvertible.ToString (IFormatProvider format)
1151 object IConvertible.ToType (Type conversionType, IFormatProvider provider)
1153 return Convert.ToType (this, conversionType, provider);
1156 [CLSCompliant (false)]
1157 ushort IConvertible.ToUInt16 (IFormatProvider provider)
1159 return Convert.ToUInt16 (this);
1162 [CLSCompliant (false)]
1163 uint IConvertible.ToUInt32 (IFormatProvider provider)
1165 return Convert.ToUInt32 (this);
1168 [CLSCompliant (false)]
1169 ulong IConvertible.ToUInt64 (IFormatProvider provider)
1171 return Convert.ToUInt64 (this);
1174 TypeCode IConvertible.GetTypeCode ()
1176 return TypeCode.String;
1185 public CharEnumerator GetEnumerator ()
1187 return new CharEnumerator (this);
1190 IEnumerator IEnumerable.GetEnumerator ()
1192 return new CharEnumerator (this);
1195 private static void ParseFormatSpecifier (string str, ref int ptr, out int n, out int width,
1196 out bool left_align, out string format)
1198 // parses format specifier of form:
1204 // N = argument number (non-negative integer)
1206 n = ParseDecimal (str, ref ptr);
1208 throw new FormatException ("Input string was not in a correct format.");
1210 // M = width (non-negative integer)
1212 if (str[ptr] == ',') {
1213 // White space between ',' and number or sign.
1215 while (Char.IsWhiteSpace (str [ptr]))
1218 format = str.Substring (start, ptr - start);
1220 left_align = (str [ptr] == '-');
1224 width = ParseDecimal (str, ref ptr);
1226 throw new FormatException ("Input string was not in a correct format.");
1234 // F = argument format (string)
1236 if (str[ptr] == ':') {
1238 while (str[ptr] != '}')
1241 format += str.Substring (start, ptr - start);
1246 if (str[ptr ++] != '}')
1247 throw new FormatException ("Input string was not in a correct format.");
1249 catch (IndexOutOfRangeException) {
1250 throw new FormatException ("Input string was not in a correct format.");
1254 private static int ParseDecimal (string str, ref int ptr)
1260 if (c < '0' || '9' < c)
1263 n = n * 10 + c - '0';
1274 internal unsafe void InternalSetChar (int idx, char val)
1276 if ((uint) idx >= (uint) Length)
1277 throw new ArgumentOutOfRangeException ("idx");
1279 fixed (char * pStr = &start_char)
1285 internal unsafe void InternalSetLength (int newLength)
1287 if (newLength > length)
1288 throw new ArgumentOutOfRangeException ("newLength", "newLength as to be <= length");
1292 // zero terminate, we can pass string objects directly via pinvoke
1293 fixed (char * pStr = &start_char) {
1294 pStr [length] = '\0';
1298 [CLSCompliant (false), MethodImplAttribute (MethodImplOptions.InternalCall)]
1299 unsafe public extern String (char *value);
1301 [CLSCompliant (false), MethodImplAttribute (MethodImplOptions.InternalCall)]
1302 unsafe public extern String (char *value, int startIndex, int length);
1304 [CLSCompliant (false), MethodImplAttribute (MethodImplOptions.InternalCall)]
1305 unsafe public extern String (sbyte *value);
1307 [CLSCompliant (false), MethodImplAttribute (MethodImplOptions.InternalCall)]
1308 unsafe public extern String (sbyte *value, int startIndex, int length);
1310 [CLSCompliant (false), MethodImplAttribute (MethodImplOptions.InternalCall)]
1311 unsafe public extern String (sbyte *value, int startIndex, int length, Encoding enc);
1313 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1314 public extern String (char [] val, int startIndex, int length);
1316 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1317 public extern String (char [] val);
1319 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1320 public extern String (char c, int count);
1322 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1323 public extern override int GetHashCode ();
1325 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1326 private extern static string InternalJoin (string separator, string[] value, int sIndex, int count);
1328 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1329 private extern String InternalInsert (int sourceIndex, String value);
1331 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1332 private extern String InternalReplace (char oldChar, char newChar);
1334 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1335 private extern String InternalReplace (String oldValue, string newValue, CompareInfo comp);
1337 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1338 private extern String InternalRemove (int sIndex, int count);
1340 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1341 private extern void InternalCopyTo (int sIndex, char[] dest, int destIndex, int count);
1343 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1344 private extern String[] InternalSplit (char[] separator, int count);
1346 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1347 private extern String InternalTrim (char[] chars, int typ);
1349 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1350 private extern int InternalIndexOfAny (char [] arr, int sIndex, int count);
1352 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1353 private extern int InternalLastIndexOfAny (char [] anyOf, int sIndex, int count);
1355 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1356 private extern String InternalPad (int width, char chr, bool right);
1358 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1359 private extern String InternalToLower (CultureInfo culture);
1361 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1362 private extern String InternalToUpper (CultureInfo culture);
1364 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1365 internal extern static String InternalAllocateStr (int length);
1367 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1368 internal extern static void InternalStrcpy (String dest, int destPos, String src);
1370 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1371 internal extern static void InternalStrcpy (String dest, int destPos, String src, int sPos, int count);
1373 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1374 private extern static string InternalIntern (string str);
1376 [MethodImplAttribute (MethodImplOptions.InternalCall)]
1377 private extern static string InternalIsInterned (string str);