5 // Patrik Torstensson (patrik.torstensson@labs2.com)
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;
20 public sealed class String : IConvertible, IComparable, ICloneable, IEnumerable {
23 static private int COMPARE_CASE = 0;
24 static private int COMPARE_INCASE = 1;
25 static private int COMPARE_ORDINAL = 2;
27 public static readonly String Empty = "";
29 public static bool Equals(String str1, String str2) {
30 if ((str1 as object) == (str2 as object))
33 if (null == str1 || null == str2)
36 if (str1.length != str2.length)
39 return InternalEquals(str1, str2);
42 public static bool operator == (String str1, String str2) {
43 return Equals(str1, str2);
46 public static bool operator != (String str1, String str2) {
47 return !Equals(str1, str2);
50 public override bool Equals(Object obj) {
57 string other = (string) obj;
58 if (length != other.length)
61 return InternalEquals(this, other);
64 public bool Equals(String value) {
68 if (length != value.length)
71 return InternalEquals(this, value);
74 [IndexerName("Chars")]
75 public extern char this[int index] {
76 [MethodImplAttribute(MethodImplOptions.InternalCall)]
80 public Object Clone() {
84 public TypeCode GetTypeCode () {
85 return TypeCode.String;
88 public void CopyTo(int sindex, char[] dest, int dindex, int count) {
89 // LAMESPEC: should I null-terminate?
92 throw new ArgumentNullException();
94 if (sindex < 0 || dindex < 0 || count < 0)
95 throw new ArgumentOutOfRangeException ();
97 if (sindex + count > Length)
98 throw new ArgumentOutOfRangeException ();
100 if (dindex + count > dest.Length)
101 throw new ArgumentOutOfRangeException ();
103 InternalCopyTo(sindex, dest, dindex, count);
106 public char[] ToCharArray() {
107 return ToCharArray(0, length);
110 public char[] ToCharArray(int sindex, int length) {
111 if (sindex < 0 || length < 0 || sindex + length > this.length)
112 throw new ArgumentOutOfRangeException ();
114 char [] tmp = new char[length];
116 InternalCopyTo(sindex, tmp, 0, length);
121 public String [] Split(params char [] separator) {
122 return Split(separator, Int32.MaxValue);
125 public String[] Split(char[] separator, int count) {
126 if (null == separator) {
127 separator = WhiteChars;
131 throw new ArgumentOutOfRangeException ();
134 return new String[0];
137 return new String[1] { ToString() };
139 return InternalSplit(separator, count);
142 public String Substring (int sindex) {
143 if (sindex < 0 || sindex > this.length) {
144 throw new ArgumentOutOfRangeException();
147 string tmp = InternalAllocateStr(this.length - sindex);
148 InternalStrcpy(tmp, 0, this, sindex, length - sindex);
153 public String Substring (int sindex, int length) {
154 if (length < 0 || sindex < 0 || sindex + length > this.length) {
155 throw new ArgumentOutOfRangeException();
161 string tmp = InternalAllocateStr(length);
162 InternalStrcpy(tmp, 0, this, sindex, length);
167 private static readonly char[] WhiteChars = { (char) 0x9, (char) 0xA, (char) 0xB, (char) 0xC, (char) 0xD, (char) 0x20, (char) 0xA0, (char) 0x2000, (char) 0x2001, (char) 0x2002, (char) 0x2003, (char) 0x2004, (char) 0x2005,
168 (char) 0x2006, (char) 0x2007, (char) 0x2008, (char) 0x2009, (char) 0x200A, (char) 0x200B, (char) 0x3000, (char) 0xFEFF };
170 public String Trim(params char[] chars) {
171 if (null == chars || chars.Length == 0)
174 return InternalTrim(chars, 0);
177 public String TrimStart(params char[] chars) {
178 if (null == chars || chars.Length == 0)
181 return InternalTrim(chars, 1);
184 public String TrimEnd(params char[] chars) {
185 if (null == chars || chars.Length == 0)
188 return InternalTrim(chars, 2);
191 public static int Compare(String s1, String s2) {
192 return Compare(s1, s2, false);
195 public static int Compare(String s1, String s2, bool inCase) {
201 } else if (null == s2)
204 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.length, s2.length), (inCase == true) ? COMPARE_INCASE : COMPARE_CASE);
208 public static int Compare(String s1, String s2, bool inCase, CultureInfo culture) {
209 return Compare(s1, s2, inCase);
212 public static int Compare(String s1, int i1, String s2, int i2, int length) {
213 return Compare(s1, i1, s2, i2, length, false);
216 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase) {
222 } else if (null == s2)
225 if (length < 0 || i1 < 0 || i2 < 0)
226 throw new ArgumentOutOfRangeException ();
228 if (i1 > s1.length || i2 > s2.length)
229 throw new ArgumentOutOfRangeException ();
234 return InternalCompare(s1, i1, s2, i2, length, (inCase == true) ? COMPARE_INCASE : COMPARE_CASE);
238 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase, CultureInfo culture) {
239 return Compare(s1, i1, s2, i2, length, inCase);
242 public int CompareTo(Object value) {
246 if (!(value is String))
247 throw new ArgumentException();
249 return String.Compare(this, (String) value, false);
252 public int CompareTo(String str) {
256 return Compare(this, str, false);
259 public static int CompareOrdinal(String s1, String s2) {
260 if (null == s1 || null == s2) {
261 if ((Object)s1 == (Object) s2) {
265 return (s1 == null) ? -1 : 1;
268 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.length, s2.length), COMPARE_ORDINAL);
271 public static int CompareOrdinal(String s1, int i1, String s2, int i2, int length) {
272 if (null == s1 || null == s2) {
273 if ((Object)s1 == (Object) s2) {
277 return (s1 == null) ? -1 : 1;
280 if (i1 < 0 || i2 < 0 || length < 0)
281 throw new ArgumentOutOfRangeException ();
283 if (i1 > s1.length || i2 > s2.length)
284 throw new ArgumentOutOfRangeException ();
286 return InternalCompare(s1, i1, s2, i2, length, COMPARE_ORDINAL);
289 public bool EndsWith(String value) {
291 throw new ArgumentNullException();
293 if (value.length > this.length) {
297 return (0 == Compare(this, length - value.length, value, 0, value.length));
300 public int IndexOfAny(char [] arr) {
302 throw new ArgumentNullException();
304 return InternalIndexOfAny(arr, 0, this.length);
307 public int IndexOfAny(char [] arr, int sindex) {
309 throw new ArgumentNullException();
310 if (sindex < 0 || sindex >= this.length)
311 throw new ArgumentOutOfRangeException();
313 return InternalIndexOfAny(arr, sindex, this.length - sindex);
316 public int IndexOfAny(char [] arr, int sindex, int count) {
318 throw new ArgumentNullException();
319 if (sindex < 0 || count < 0 || sindex + count > this.length)
320 throw new ArgumentOutOfRangeException ();
322 return InternalIndexOfAny(arr, sindex, count);
325 public int IndexOf(char value) {
326 return InternalIndexOf(value, 0, this.length);
329 public int IndexOf(String value) {
330 return IndexOf(value, 0, this.length);
333 public int IndexOf(char value, int sindex) {
334 if (sindex < 0 || sindex > this.length) {
335 throw new ArgumentOutOfRangeException();
338 if (sindex == this.length)
341 return InternalIndexOf(value, sindex, this.length - sindex);
344 public int IndexOf(String value, int sindex) {
345 if (sindex == this.length)
348 return IndexOf(value, sindex, this.length - sindex);
351 public int IndexOf(char value, int sindex, int count) {
352 if (sindex < 0 || count < 0 || sindex + count > this.length)
353 throw new ArgumentOutOfRangeException ();
355 if (sindex == 0 && this.length == 0)
358 return InternalIndexOf(value, sindex, count);
361 public int IndexOf(String value, int sindex, int count) {
363 throw new ArgumentNullException();
365 if (sindex < 0 || count < 0 || sindex + count > this.length)
366 throw new ArgumentOutOfRangeException ();
368 if (sindex == 0 && this.length == 0)
371 return InternalIndexOf(value, sindex, count);
374 public int LastIndexOfAny(char [] arr) {
376 throw new ArgumentNullException();
378 return InternalLastIndexOfAny(arr, this.length - 1, this.length);
381 public int LastIndexOfAny(char [] arr, int sindex) {
383 throw new ArgumentNullException();
385 if (sindex < 0 || sindex > this.length)
386 throw new ArgumentOutOfRangeException();
388 if (this.length == 0)
391 return InternalLastIndexOfAny(arr, sindex, sindex + 1);
394 public int LastIndexOfAny(char [] arr, int sindex, int count) {
396 throw new ArgumentNullException();
398 if (sindex < 0 || count < 0 || sindex > this.length || sindex - count < -1)
399 throw new ArgumentOutOfRangeException();
401 if (this.length == 0)
404 return InternalLastIndexOfAny(arr, sindex, count);
407 public int LastIndexOf(char value) {
408 return InternalLastIndexOf(value, this.length - 1, this.length);
411 public int LastIndexOf(String value) {
413 throw new ArgumentNullException();
415 if (value.length == 0)
418 if (this.length == 0)
421 return InternalLastIndexOf(value, this.length - 1, this.length);
424 public int LastIndexOf(char value, int sindex){
425 return LastIndexOf(value, sindex, sindex + 1);
428 public int LastIndexOf(String value, int sindex) {
429 return LastIndexOf(value, sindex, sindex + 1);
432 public int LastIndexOf(char value, int sindex, int count) {
433 if (sindex < 0 || count < 0)
434 throw new ArgumentOutOfRangeException ();
436 if (sindex >= this.length || sindex - count + 1 < 0)
437 throw new ArgumentOutOfRangeException ();
439 if (sindex == 0 && this.length == 0)
442 return InternalLastIndexOf(value, sindex, count);
445 public int LastIndexOf(String value, int sindex, int count) {
447 throw new ArgumentNullException();
449 if (sindex < 0 || sindex > this.length)
450 throw new ArgumentOutOfRangeException ();
452 if (count < 0 || sindex - count + 1 < 0)
453 throw new ArgumentOutOfRangeException ();
455 if (value.length > sindex)
458 if (value == String.Empty)
461 if (sindex == 0 && this.length == 0)
464 return InternalLastIndexOf(value, sindex, count);
467 public String PadLeft(int width) {
468 return PadLeft(width, ' ');
471 public String PadLeft(int width, char chr) {
473 throw new ArgumentException();
475 if (width < this.length)
476 return String.Copy(this);
478 return InternalPad(width, chr, false);
481 public String PadRight(int width) {
482 return PadRight(width, ' ');
485 public String PadRight(int width, char chr) {
487 throw new ArgumentException();
489 if (width < this.length)
490 return String.Copy(this);
492 return InternalPad(width, chr, true);
495 public bool StartsWith(String value) {
497 throw new ArgumentNullException();
499 if (this.length < value.length)
502 return (0 == Compare(this, 0, value, 0 , value.length));
506 public String Replace (char oldChar, char newChar) {
507 return InternalReplace(oldChar, newChar);
510 public String Replace(String oldValue, String newValue) {
511 if (null == oldValue)
512 throw new ArgumentNullException();
514 return InternalReplace(oldValue, newValue);
517 public String Remove(int sindex, int count) {
518 if (sindex < 0 || count < 0 || sindex + count > this.length)
519 throw new ArgumentOutOfRangeException ();
521 return InternalRemove(sindex, count);
524 public String ToLower() {
525 return InternalToLower();
528 [MonoTODO("By now, don't use culture info")]
529 public String ToLower(CultureInfo culture) {
530 return InternalToLower();
533 public String ToUpper() {
534 return InternalToUpper();
537 [MonoTODO("By now, don't use culture info")]
538 public String ToUpper(CultureInfo culture) {
539 return InternalToUpper();
542 public override String ToString() {
546 public String ToString(IFormatProvider provider) {
550 public String Trim() {
554 public static String Format(String format, Object arg0) {
555 return Format(null, format, new Object[] {arg0});
558 public static String Format(String format, Object arg0, Object arg1) {
559 return Format(null, format, new Object[] {arg0, arg1});
562 public static String Format(String format, Object arg0, Object arg1, Object arg2) {
563 return Format(null, format, new Object[] {arg0, arg1, arg2});
566 public static string Format (string format, params object[] args) {
567 return Format (null, format, args);
570 public static string Format (IFormatProvider provider, string format, params object[] args) {
571 if (format == null || args == null)
572 throw new ArgumentNullException ();
574 StringBuilder result = new StringBuilder ();
578 while (ptr < format.length) {
579 char c = format[ptr ++];
582 result.Append (format, start, ptr - start - 1);
584 // check for escaped open bracket
586 if (format[ptr] == '{') {
597 ParseFormatSpecifier (format, ref ptr, out n, out width, out left_align, out arg_format);
598 if (n >= args.Length)
599 throw new FormatException ("Index (zero based) must be greater than or equal to zero and less than the size of the argument list.");
603 object arg = args[n];
608 else if (arg is IFormattable)
609 str = ((IFormattable)arg).ToString (arg_format, provider);
611 str = arg.ToString ();
613 // pad formatted string and append to result
615 if (width > str.length) {
616 string pad = new String (' ', width - str.length);
632 else if (c == '}' && ptr < format.length && format[ptr] == '}') {
633 result.Append (format, start, ptr - start - 1);
637 throw new FormatException ("Input string was not in a correct format.");
641 if (start < format.length)
642 result.Append (format.Substring (start));
644 return result.ToString ();
647 public static String Copy (String str) {
649 throw new ArgumentNullException ();
651 int length = str.length;
653 String tmp = InternalAllocateStr(length);
654 InternalStrcpy(tmp, 0, str);
658 public static String Concat(Object obj) {
662 return obj.ToString();
665 public static String Concat(Object obj1, Object obj2)
673 return obj2.ToString ();
674 } else if (obj2 == null)
675 return obj1.ToString ();
677 s1 = obj1.ToString ();
678 s2 = obj2.ToString ();
679 String tmp = InternalAllocateStr (s1.Length + s2.Length);
680 InternalStrcpy (tmp, 0, s1);
681 InternalStrcpy (tmp, s1.length, s2);
686 public static String Concat(Object obj1, Object obj2, Object obj3)
692 s1 = obj1.ToString ();
697 s2 = obj2.ToString ();
702 s3 = obj3.ToString ();
704 return Concat (s1, s2, s3);
707 public static String Concat(String s1, String s2)
718 String tmp = InternalAllocateStr(s1.length + s2.length);
720 InternalStrcpy(tmp, 0, s1);
721 InternalStrcpy(tmp, s1.length, s2);
726 public static String Concat(String s1, String s2, String s3)
750 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length);
752 InternalStrcpy(tmp, 0, s1);
753 InternalStrcpy(tmp, s1.length, s2);
754 InternalStrcpy(tmp, s1.length + s2.length, s3);
759 public static String Concat(String s1, String s2, String s3, String s4) {
760 if (null == s1 && null == s2 && null == s3 && null == s4) {
764 if (null == s1) { s1 = String.Empty; }
765 if (null == s2) { s2 = String.Empty; }
766 if (null == s3) { s3 = String.Empty; }
767 if (null == s4) { s4 = String.Empty; }
769 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length + s4.length);
771 InternalStrcpy(tmp, 0, s1);
772 InternalStrcpy(tmp, s1.length, s2);
773 InternalStrcpy(tmp, s1.length + s2.length, s3);
774 InternalStrcpy(tmp, s1.length + s2.length + s3.length, s4);
779 public static String Concat(params Object[] args) {
781 int len, i, currentpos;
784 throw new ArgumentNullException ();
786 strings = new string [args.Length];
789 foreach (object arg in args) {
790 /* use Empty for each null argument */
792 strings[i] = String.Empty;
794 strings[i] = arg.ToString ();
795 len += strings[i].length;
804 String tmp = InternalAllocateStr(len);
805 for (i = 0; i < strings.Length; i++) {
806 InternalStrcpy(tmp, currentpos, strings[i]);
807 currentpos += strings[i].length;
813 public static String Concat(params String[] values) {
814 int len, i, currentpos;
817 throw new ArgumentNullException ();
820 foreach (string value in values)
821 len += value != null ? value.length : 0;
828 String tmp = InternalAllocateStr(len);
829 for (i = 0; i < values.Length; i++) {
830 if (values[i] == null)
833 InternalStrcpy(tmp, currentpos, values[i]);
834 currentpos += values[i].length;
840 public String Insert(int sindex, String value) {
842 throw new ArgumentNullException();
844 if (sindex < 0 || sindex > this.length)
845 throw new ArgumentOutOfRangeException();
847 return InternalInsert(sindex, value);
851 public static string Intern (string str) {
853 throw new ArgumentNullException ();
855 return InternalIntern(str);
858 public static string IsInterned (string str) {
860 throw new ArgumentNullException();
862 return InternalIsInterned(str);
865 public static string Join (string separator, string [] value) {
867 throw new ArgumentNullException ();
869 return Join(separator, value, 0, value.Length);
872 public static string Join(string separator, string[] value, int sindex, int count) {
874 throw new ArgumentNullException ();
876 if (sindex + count > value.Length)
877 throw new ArgumentOutOfRangeException ();
879 if (sindex == value.Length)
882 return InternalJoin(separator, value, sindex, count);
885 bool IConvertible.ToBoolean (IFormatProvider provider) {
886 return Convert.ToBoolean (this);
889 byte IConvertible.ToByte (IFormatProvider provider) {
890 return Convert.ToByte (this);
893 char IConvertible.ToChar (IFormatProvider provider) {
894 return Convert.ToChar (this);
897 DateTime IConvertible.ToDateTime (IFormatProvider provider) {
898 return Convert.ToDateTime (this);
901 decimal IConvertible.ToDecimal (IFormatProvider provider) {
902 return Convert.ToDecimal (this);
905 double IConvertible.ToDouble (IFormatProvider provider) {
906 return Convert.ToDouble (this);
909 short IConvertible.ToInt16 (IFormatProvider provider) {
910 return Convert.ToInt16 (this);
913 int IConvertible.ToInt32 (IFormatProvider provider) {
914 return Convert.ToInt32 (this);
917 long IConvertible.ToInt64 (IFormatProvider provider) {
918 return Convert.ToInt64 (this);
921 [CLSCompliant(false)]
922 sbyte IConvertible.ToSByte (IFormatProvider provider) {
923 return Convert.ToSByte (this);
926 float IConvertible.ToSingle (IFormatProvider provider) {
927 return Convert.ToSingle (this);
929 string IConvertible.ToString (IFormatProvider format) {
933 object IConvertible.ToType (Type conversionType, IFormatProvider provider) {
934 return Convert.ToType (this, conversionType, provider);
937 [CLSCompliant(false)]
938 ushort IConvertible.ToUInt16 (IFormatProvider provider) {
939 return Convert.ToUInt16 (this);
942 [CLSCompliant(false)]
943 uint IConvertible.ToUInt32 (IFormatProvider provider) {
944 return Convert.ToUInt32 (this);
947 [CLSCompliant(false)]
948 ulong IConvertible.ToUInt64 (IFormatProvider provider) {
949 return Convert.ToUInt64 (this);
952 TypeCode IConvertible.GetTypeCode () {
953 return TypeCode.String;
962 public CharEnumerator GetEnumerator () {
963 return new CharEnumerator (this);
966 IEnumerator IEnumerable.GetEnumerator () {
967 return new CharEnumerator (this);
970 private static void ParseFormatSpecifier (string str, ref int ptr, out int n, out int width, out bool left_align, out string format) {
971 // parses format specifier of form:
977 // N = argument number (non-negative integer)
979 n = ParseDecimal (str, ref ptr);
981 throw new FormatException ("Input string was not in a correct format.");
983 // M = width (non-negative integer)
985 if (str[ptr] == ',') {
986 // White space between ',' and number or sign.
988 while (Char.IsWhiteSpace (str [ptr]))
991 format = str.Substring (start, ptr - start);
993 left_align = (str [ptr] == '-');
997 width = ParseDecimal (str, ref ptr);
999 throw new FormatException ("Input string was not in a correct format.");
1007 // F = argument format (string)
1009 if (str[ptr] == ':') {
1011 while (str[ptr] != '}')
1014 format += str.Substring (start, ptr - start);
1019 if (str[ptr ++] != '}')
1020 throw new FormatException ("Input string was not in a correct format.");
1022 catch (IndexOutOfRangeException) {
1023 throw new FormatException ("Input string was not in a correct format.");
1027 private static int ParseDecimal (string str, ref int ptr) {
1032 if (c < '0' || '9' < c)
1035 n = n * 10 + c - '0';
1046 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1047 unsafe public extern String(char *value);
1049 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1050 unsafe public extern String(char *value, int sindex, int length);
1052 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1053 unsafe public extern String(sbyte *value);
1055 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1056 unsafe public extern String(sbyte *value, int sindex, int length);
1058 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1059 unsafe public extern String(sbyte *value, int sindex, int length, Encoding enc);
1061 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1062 public extern String(char [] val, int sindex, int length);
1064 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1065 public extern String(char [] val);
1067 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1068 public extern String(char c, int count);
1070 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1071 public extern override int GetHashCode();
1073 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1074 private extern static string InternalJoin(string separator, string[] value, int sindex, int count);
1076 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1077 private extern String InternalInsert(int sindex, String value);
1079 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1080 private extern String InternalReplace(char oldChar, char newChar);
1082 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1083 private extern String InternalReplace(String oldValue, String newValue);
1085 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1086 private extern String InternalRemove(int sindex, int count);
1088 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1089 private extern void InternalCopyTo(int sindex, char[] dest, int dindex, int count);
1091 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1092 private extern String[] InternalSplit(char[] separator, int count);
1094 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1095 private extern String InternalTrim(char[] chars, int typ);
1097 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1098 private extern int InternalIndexOf(char value, int sindex, int count);
1100 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1101 private extern int InternalIndexOf(string value, int sindex, int count);
1103 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1104 private extern int InternalIndexOfAny(char [] arr, int sindex, int count);
1106 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1107 private extern int InternalLastIndexOf(char value, int sindex, int count);
1109 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1110 private extern int InternalLastIndexOf(String value, int sindex, int count);
1112 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1113 private extern int InternalLastIndexOfAny(char [] anyOf, int sindex, int count);
1115 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1116 private extern String InternalPad(int width, char chr, bool right);
1118 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1119 private extern String InternalToLower();
1121 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1122 private extern String InternalToUpper();
1124 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1125 private extern static String InternalAllocateStr(int length);
1127 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1128 private extern static void InternalStrcpy(String dest, int destPos, String src);
1130 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1131 private extern static void InternalStrcpy(String dest, int destPos, String src, int startPos, int count);
1133 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1134 private extern static string InternalIntern(string str);
1136 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1137 private extern static string InternalIsInterned(string str);
1139 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1140 private extern static int InternalCompare(String s1, int i1, String s2, int i2, int length, int mode);
1142 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1143 private extern static bool InternalEquals(String s1, String s2);