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 private const int COMPARE_CASE = 0;
24 private const int COMPARE_INCASE = 1;
25 private const 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 int len = str1.length;
38 if (len != str2.length)
41 for (int i = 0; i < len; i++)
42 if (str1 [i] != str2 [i])
48 public static bool operator == (String str1, String str2) {
49 return Equals(str1, str2);
52 public static bool operator != (String str1, String str2) {
53 return !Equals(str1, str2);
56 public override bool Equals(Object obj) {
57 return Equals (this, obj as String);
60 public bool Equals(String value) {
61 return Equals (this, value);
64 [IndexerName("Chars")]
65 public extern char this[int index] {
66 [MethodImplAttribute(MethodImplOptions.InternalCall)]
70 public Object Clone() {
74 public TypeCode GetTypeCode () {
75 return TypeCode.String;
78 public void CopyTo(int sindex, char[] dest, int dindex, int count) {
79 // LAMESPEC: should I null-terminate?
82 throw new ArgumentNullException();
84 if (sindex < 0 || dindex < 0 || count < 0)
85 throw new ArgumentOutOfRangeException ();
87 if (sindex + count > Length)
88 throw new ArgumentOutOfRangeException ();
90 if (dindex + count > dest.Length)
91 throw new ArgumentOutOfRangeException ();
93 InternalCopyTo(sindex, dest, dindex, count);
96 public char[] ToCharArray() {
97 return ToCharArray(0, length);
100 public char[] ToCharArray(int sindex, int length) {
101 if (sindex < 0 || length < 0 || sindex + length > this.length)
102 throw new ArgumentOutOfRangeException ();
104 char [] tmp = new char[length];
106 InternalCopyTo(sindex, tmp, 0, length);
111 public String [] Split(params char [] separator) {
112 return Split(separator, Int32.MaxValue);
115 public String[] Split(char[] separator, int count) {
116 if (null == separator) {
117 separator = WhiteChars;
121 throw new ArgumentOutOfRangeException ();
124 return new String[0];
127 return new String[1] { ToString() };
129 return InternalSplit(separator, count);
132 public String Substring (int sindex) {
133 if (sindex < 0 || sindex > this.length) {
134 throw new ArgumentOutOfRangeException();
137 string tmp = InternalAllocateStr(this.length - sindex);
138 InternalStrcpy(tmp, 0, this, sindex, length - sindex);
143 public String Substring (int sindex, int length) {
144 if (length < 0 || sindex < 0 || sindex + length > this.length) {
145 throw new ArgumentOutOfRangeException();
151 string tmp = InternalAllocateStr(length);
152 InternalStrcpy(tmp, 0, this, sindex, length);
157 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,
158 (char) 0x2006, (char) 0x2007, (char) 0x2008, (char) 0x2009, (char) 0x200A, (char) 0x200B, (char) 0x3000, (char) 0xFEFF };
160 public String Trim(params char[] chars) {
161 if (null == chars || chars.Length == 0)
164 return InternalTrim(chars, 0);
167 public String TrimStart(params char[] chars) {
168 if (null == chars || chars.Length == 0)
171 return InternalTrim(chars, 1);
174 public String TrimEnd(params char[] chars) {
175 if (null == chars || chars.Length == 0)
178 return InternalTrim(chars, 2);
181 public static int Compare(String s1, String s2) {
182 return Compare(s1, s2, false);
185 public static int Compare(String s1, String s2, bool inCase) {
191 } else if (null == s2)
194 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.length, s2.length), (inCase == true) ? COMPARE_INCASE : COMPARE_CASE);
198 public static int Compare(String s1, String s2, bool inCase, CultureInfo culture) {
199 return Compare(s1, s2, inCase);
202 public static int Compare(String s1, int i1, String s2, int i2, int length) {
203 return Compare(s1, i1, s2, i2, length, false);
206 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase) {
212 } else if (null == s2)
215 if (length < 0 || i1 < 0 || i2 < 0)
216 throw new ArgumentOutOfRangeException ();
218 if (i1 > s1.length || i2 > s2.length)
219 throw new ArgumentOutOfRangeException ();
224 return InternalCompare(s1, i1, s2, i2, length, (inCase == true) ? COMPARE_INCASE : COMPARE_CASE);
228 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase, CultureInfo culture) {
229 return Compare(s1, i1, s2, i2, length, inCase);
232 public int CompareTo(Object value) {
236 if (!(value is String))
237 throw new ArgumentException();
239 return String.Compare(this, (String) value, false);
242 public int CompareTo(String str) {
246 return Compare(this, str, false);
249 public static int CompareOrdinal(String s1, String s2) {
250 if (null == s1 || null == s2) {
251 if ((Object)s1 == (Object) s2) {
255 return (s1 == null) ? -1 : 1;
258 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.length, s2.length), COMPARE_ORDINAL);
261 public static int CompareOrdinal(String s1, int i1, String s2, int i2, int length) {
262 if (null == s1 || null == s2) {
263 if ((Object)s1 == (Object) s2) {
267 return (s1 == null) ? -1 : 1;
270 if (i1 < 0 || i2 < 0 || length < 0)
271 throw new ArgumentOutOfRangeException ();
273 if (i1 > s1.length || i2 > s2.length)
274 throw new ArgumentOutOfRangeException ();
276 return InternalCompare(s1, i1, s2, i2, length, COMPARE_ORDINAL);
279 public bool EndsWith(String value) {
281 throw new ArgumentNullException();
283 if (value.length > this.length) {
287 return (0 == Compare(this, length - value.length, value, 0, value.length));
290 public int IndexOfAny(char [] arr) {
292 throw new ArgumentNullException();
294 return InternalIndexOfAny(arr, 0, this.length);
297 public int IndexOfAny(char [] arr, int sindex) {
299 throw new ArgumentNullException();
300 if (sindex < 0 || sindex >= this.length)
301 throw new ArgumentOutOfRangeException();
303 return InternalIndexOfAny(arr, sindex, this.length - sindex);
306 public int IndexOfAny(char [] arr, int sindex, int count) {
308 throw new ArgumentNullException();
309 if (sindex < 0 || count < 0 || sindex + count > this.length)
310 throw new ArgumentOutOfRangeException ();
312 return InternalIndexOfAny(arr, sindex, count);
315 public int IndexOf(char value) {
316 return InternalIndexOf(value, 0, this.length);
319 public int IndexOf(String value) {
320 return IndexOf(value, 0, this.length);
323 public int IndexOf(char value, int sindex) {
324 if (sindex < 0 || sindex > this.length) {
325 throw new ArgumentOutOfRangeException();
328 if (sindex == this.length)
331 return InternalIndexOf(value, sindex, this.length - sindex);
334 public int IndexOf(String value, int sindex) {
335 if (sindex == this.length)
338 return IndexOf(value, sindex, this.length - sindex);
341 public int IndexOf(char value, int sindex, int count) {
342 if (sindex < 0 || count < 0 || sindex + count > this.length)
343 throw new ArgumentOutOfRangeException ();
345 if (sindex == 0 && this.length == 0)
348 return InternalIndexOf(value, sindex, count);
351 public int IndexOf(String value, int sindex, int count) {
353 throw new ArgumentNullException();
355 if (sindex < 0 || count < 0 || sindex + count > this.length)
356 throw new ArgumentOutOfRangeException ();
358 if (sindex == 0 && this.length == 0)
361 return InternalIndexOf(value, sindex, count);
364 public int LastIndexOfAny(char [] arr) {
366 throw new ArgumentNullException();
368 return InternalLastIndexOfAny(arr, this.length - 1, this.length);
371 public int LastIndexOfAny(char [] arr, int sindex) {
373 throw new ArgumentNullException();
375 if (sindex < 0 || sindex > this.length)
376 throw new ArgumentOutOfRangeException();
378 if (this.length == 0)
381 return InternalLastIndexOfAny(arr, sindex, sindex + 1);
384 public int LastIndexOfAny(char [] arr, int sindex, int count) {
386 throw new ArgumentNullException();
388 if (sindex < 0 || count < 0 || sindex > this.length || sindex - count < -1)
389 throw new ArgumentOutOfRangeException();
391 if (this.length == 0)
394 return InternalLastIndexOfAny(arr, sindex, count);
397 public int LastIndexOf(char value) {
398 return InternalLastIndexOf(value, this.length - 1, this.length);
401 public int LastIndexOf(String value) {
403 throw new ArgumentNullException();
405 if (value.length == 0)
408 if (this.length == 0)
411 return InternalLastIndexOf(value, this.length - 1, this.length);
414 public int LastIndexOf(char value, int sindex){
415 return LastIndexOf(value, sindex, sindex + 1);
418 public int LastIndexOf(String value, int sindex) {
419 return LastIndexOf(value, sindex, sindex + 1);
422 public int LastIndexOf(char value, int sindex, int count) {
423 if (sindex < 0 || count < 0)
424 throw new ArgumentOutOfRangeException ();
426 if (sindex >= this.length || sindex - count + 1 < 0)
427 throw new ArgumentOutOfRangeException ();
429 if (sindex == 0 && this.length == 0)
432 return InternalLastIndexOf(value, sindex, count);
435 public int LastIndexOf(String value, int sindex, int count) {
437 throw new ArgumentNullException();
439 if (sindex < 0 || sindex > this.length)
440 throw new ArgumentOutOfRangeException ();
442 if (count < 0 || sindex - count + 1 < 0)
443 throw new ArgumentOutOfRangeException ();
445 if (value.length > sindex)
448 if (value == String.Empty)
451 if (sindex == 0 && this.length == 0)
454 return InternalLastIndexOf(value, sindex, count);
457 public String PadLeft(int width) {
458 return PadLeft(width, ' ');
461 public String PadLeft(int width, char chr) {
463 throw new ArgumentException();
465 if (width < this.length)
466 return String.Copy(this);
468 return InternalPad(width, chr, false);
471 public String PadRight(int width) {
472 return PadRight(width, ' ');
475 public String PadRight(int width, char chr) {
477 throw new ArgumentException();
479 if (width < this.length)
480 return String.Copy(this);
482 return InternalPad(width, chr, true);
485 public bool StartsWith(String value) {
487 throw new ArgumentNullException();
489 if (this.length < value.length)
492 return (0 == Compare(this, 0, value, 0 , value.length));
496 public String Replace (char oldChar, char newChar) {
497 return InternalReplace(oldChar, newChar);
500 public String Replace(String oldValue, String newValue) {
501 if (null == oldValue)
502 throw new ArgumentNullException();
504 return InternalReplace(oldValue, newValue);
507 public String Remove(int sindex, int count) {
508 if (sindex < 0 || count < 0 || sindex + count > this.length)
509 throw new ArgumentOutOfRangeException ();
511 return InternalRemove(sindex, count);
514 public String ToLower() {
515 return InternalToLower();
518 [MonoTODO("By now, don't use culture info")]
519 public String ToLower(CultureInfo culture) {
520 return InternalToLower();
523 public String ToUpper() {
524 return InternalToUpper();
527 [MonoTODO("By now, don't use culture info")]
528 public String ToUpper(CultureInfo culture) {
529 return InternalToUpper();
532 public override String ToString() {
536 public String ToString(IFormatProvider provider) {
540 public String Trim() {
544 public static String Format(String format, Object arg0) {
545 return Format(null, format, new Object[] {arg0});
548 public static String Format(String format, Object arg0, Object arg1) {
549 return Format(null, format, new Object[] {arg0, arg1});
552 public static String Format(String format, Object arg0, Object arg1, Object arg2) {
553 return Format(null, format, new Object[] {arg0, arg1, arg2});
556 public static string Format (string format, params object[] args) {
557 return Format (null, format, args);
560 public static string Format (IFormatProvider provider, string format, params object[] args) {
561 if (format == null || args == null)
562 throw new ArgumentNullException ();
564 StringBuilder result = new StringBuilder ();
568 while (ptr < format.length) {
569 char c = format[ptr ++];
572 result.Append (format, start, ptr - start - 1);
574 // check for escaped open bracket
576 if (format[ptr] == '{') {
587 ParseFormatSpecifier (format, ref ptr, out n, out width, out left_align, out arg_format);
588 if (n >= args.Length)
589 throw new FormatException ("Index (zero based) must be greater than or equal to zero and less than the size of the argument list.");
593 object arg = args[n];
598 else if (arg is IFormattable)
599 str = ((IFormattable)arg).ToString (arg_format, provider);
601 str = arg.ToString ();
603 // pad formatted string and append to result
605 if (width > str.length) {
606 string pad = new String (' ', width - str.length);
622 else if (c == '}' && ptr < format.length && format[ptr] == '}') {
623 result.Append (format, start, ptr - start - 1);
627 throw new FormatException ("Input string was not in a correct format.");
631 if (start < format.length)
632 result.Append (format.Substring (start));
634 return result.ToString ();
637 public static String Copy (String str) {
639 throw new ArgumentNullException ();
641 int length = str.length;
643 String tmp = InternalAllocateStr(length);
644 InternalStrcpy(tmp, 0, str);
648 public static String Concat(Object obj) {
652 return obj.ToString();
655 public static String Concat(Object obj1, Object obj2)
663 return obj2.ToString ();
664 } else if (obj2 == null)
665 return obj1.ToString ();
667 s1 = obj1.ToString ();
668 s2 = obj2.ToString ();
669 String tmp = InternalAllocateStr (s1.Length + s2.Length);
670 InternalStrcpy (tmp, 0, s1);
671 InternalStrcpy (tmp, s1.length, s2);
676 public static String Concat(Object obj1, Object obj2, Object obj3)
682 s1 = obj1.ToString ();
687 s2 = obj2.ToString ();
692 s3 = obj3.ToString ();
694 return Concat (s1, s2, s3);
697 public static String Concat(String s1, String s2)
708 String tmp = InternalAllocateStr(s1.length + s2.length);
710 InternalStrcpy(tmp, 0, s1);
711 InternalStrcpy(tmp, s1.length, s2);
716 public static String Concat(String s1, String s2, String s3)
740 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length);
742 InternalStrcpy(tmp, 0, s1);
743 InternalStrcpy(tmp, s1.length, s2);
744 InternalStrcpy(tmp, s1.length + s2.length, s3);
749 public static String Concat(String s1, String s2, String s3, String s4) {
750 if (null == s1 && null == s2 && null == s3 && null == s4) {
754 if (null == s1) { s1 = String.Empty; }
755 if (null == s2) { s2 = String.Empty; }
756 if (null == s3) { s3 = String.Empty; }
757 if (null == s4) { s4 = String.Empty; }
759 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length + s4.length);
761 InternalStrcpy(tmp, 0, s1);
762 InternalStrcpy(tmp, s1.length, s2);
763 InternalStrcpy(tmp, s1.length + s2.length, s3);
764 InternalStrcpy(tmp, s1.length + s2.length + s3.length, s4);
769 public static String Concat(params Object[] args) {
771 int len, i, currentpos;
774 throw new ArgumentNullException ();
776 strings = new string [args.Length];
779 foreach (object arg in args) {
780 /* use Empty for each null argument */
782 strings[i] = String.Empty;
784 strings[i] = arg.ToString ();
785 len += strings[i].length;
794 String tmp = InternalAllocateStr(len);
795 for (i = 0; i < strings.Length; i++) {
796 InternalStrcpy(tmp, currentpos, strings[i]);
797 currentpos += strings[i].length;
803 public static String Concat(params String[] values) {
804 int len, i, currentpos;
807 throw new ArgumentNullException ();
810 foreach (string value in values)
811 len += value != null ? value.length : 0;
818 String tmp = InternalAllocateStr(len);
819 for (i = 0; i < values.Length; i++) {
820 if (values[i] == null)
823 InternalStrcpy(tmp, currentpos, values[i]);
824 currentpos += values[i].length;
830 public String Insert(int sindex, String value) {
832 throw new ArgumentNullException();
834 if (sindex < 0 || sindex > this.length)
835 throw new ArgumentOutOfRangeException();
837 return InternalInsert(sindex, value);
841 public static string Intern (string str) {
843 throw new ArgumentNullException ();
845 return InternalIntern(str);
848 public static string IsInterned (string str) {
850 throw new ArgumentNullException();
852 return InternalIsInterned(str);
855 public static string Join (string separator, string [] value) {
857 throw new ArgumentNullException ();
859 return Join(separator, value, 0, value.Length);
862 public static string Join(string separator, string[] value, int sindex, int count) {
864 throw new ArgumentNullException ();
866 if (sindex + count > value.Length)
867 throw new ArgumentOutOfRangeException ();
869 if (sindex == value.Length)
872 return InternalJoin(separator, value, sindex, count);
875 bool IConvertible.ToBoolean (IFormatProvider provider) {
876 return Convert.ToBoolean (this);
879 byte IConvertible.ToByte (IFormatProvider provider) {
880 return Convert.ToByte (this);
883 char IConvertible.ToChar (IFormatProvider provider) {
884 return Convert.ToChar (this);
887 DateTime IConvertible.ToDateTime (IFormatProvider provider) {
888 return Convert.ToDateTime (this);
891 decimal IConvertible.ToDecimal (IFormatProvider provider) {
892 return Convert.ToDecimal (this);
895 double IConvertible.ToDouble (IFormatProvider provider) {
896 return Convert.ToDouble (this);
899 short IConvertible.ToInt16 (IFormatProvider provider) {
900 return Convert.ToInt16 (this);
903 int IConvertible.ToInt32 (IFormatProvider provider) {
904 return Convert.ToInt32 (this);
907 long IConvertible.ToInt64 (IFormatProvider provider) {
908 return Convert.ToInt64 (this);
911 [CLSCompliant(false)]
912 sbyte IConvertible.ToSByte (IFormatProvider provider) {
913 return Convert.ToSByte (this);
916 float IConvertible.ToSingle (IFormatProvider provider) {
917 return Convert.ToSingle (this);
919 string IConvertible.ToString (IFormatProvider format) {
923 object IConvertible.ToType (Type conversionType, IFormatProvider provider) {
924 return Convert.ToType (this, conversionType, provider);
927 [CLSCompliant(false)]
928 ushort IConvertible.ToUInt16 (IFormatProvider provider) {
929 return Convert.ToUInt16 (this);
932 [CLSCompliant(false)]
933 uint IConvertible.ToUInt32 (IFormatProvider provider) {
934 return Convert.ToUInt32 (this);
937 [CLSCompliant(false)]
938 ulong IConvertible.ToUInt64 (IFormatProvider provider) {
939 return Convert.ToUInt64 (this);
942 TypeCode IConvertible.GetTypeCode () {
943 return TypeCode.String;
952 public CharEnumerator GetEnumerator () {
953 return new CharEnumerator (this);
956 IEnumerator IEnumerable.GetEnumerator () {
957 return new CharEnumerator (this);
960 private static void ParseFormatSpecifier (string str, ref int ptr, out int n, out int width, out bool left_align, out string format) {
961 // parses format specifier of form:
967 // N = argument number (non-negative integer)
969 n = ParseDecimal (str, ref ptr);
971 throw new FormatException ("Input string was not in a correct format.");
973 // M = width (non-negative integer)
975 if (str[ptr] == ',') {
976 // White space between ',' and number or sign.
978 while (Char.IsWhiteSpace (str [ptr]))
981 format = str.Substring (start, ptr - start);
983 left_align = (str [ptr] == '-');
987 width = ParseDecimal (str, ref ptr);
989 throw new FormatException ("Input string was not in a correct format.");
997 // F = argument format (string)
999 if (str[ptr] == ':') {
1001 while (str[ptr] != '}')
1004 format += str.Substring (start, ptr - start);
1009 if (str[ptr ++] != '}')
1010 throw new FormatException ("Input string was not in a correct format.");
1012 catch (IndexOutOfRangeException) {
1013 throw new FormatException ("Input string was not in a correct format.");
1017 private static int ParseDecimal (string str, ref int ptr) {
1022 if (c < '0' || '9' < c)
1025 n = n * 10 + c - '0';
1036 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1037 unsafe public extern String(char *value);
1039 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1040 unsafe public extern String(char *value, int sindex, int length);
1042 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1043 unsafe public extern String(sbyte *value);
1045 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1046 unsafe public extern String(sbyte *value, int sindex, int length);
1048 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1049 unsafe public extern String(sbyte *value, int sindex, int length, Encoding enc);
1051 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1052 public extern String(char [] val, int sindex, int length);
1054 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1055 public extern String(char [] val);
1057 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1058 public extern String(char c, int count);
1060 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1061 public extern override int GetHashCode();
1063 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1064 private extern static string InternalJoin(string separator, string[] value, int sindex, int count);
1066 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1067 private extern String InternalInsert(int sindex, String value);
1069 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1070 private extern String InternalReplace(char oldChar, char newChar);
1072 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1073 private extern String InternalReplace(String oldValue, String newValue);
1075 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1076 private extern String InternalRemove(int sindex, int count);
1078 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1079 private extern void InternalCopyTo(int sindex, char[] dest, int dindex, int count);
1081 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1082 private extern String[] InternalSplit(char[] separator, int count);
1084 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1085 private extern String InternalTrim(char[] chars, int typ);
1087 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1088 private extern int InternalIndexOf(char value, int sindex, int count);
1090 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1091 private extern int InternalIndexOf(string value, int sindex, int count);
1093 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1094 private extern int InternalIndexOfAny(char [] arr, int sindex, int count);
1096 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1097 private extern int InternalLastIndexOf(char value, int sindex, int count);
1099 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1100 private extern int InternalLastIndexOf(String value, int sindex, int count);
1102 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1103 private extern int InternalLastIndexOfAny(char [] anyOf, int sindex, int count);
1105 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1106 private extern String InternalPad(int width, char chr, bool right);
1108 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1109 private extern String InternalToLower();
1111 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1112 private extern String InternalToUpper();
1114 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1115 private extern static String InternalAllocateStr(int length);
1117 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1118 private extern static void InternalStrcpy(String dest, int destPos, String src);
1120 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1121 private extern static void InternalStrcpy(String dest, int destPos, String src, int startPos, int count);
1123 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1124 private extern static string InternalIntern(string str);
1126 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1127 private extern static string InternalIsInterned(string str);
1129 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1130 private extern static int InternalCompare(String s1, int i1, String s2, int i2, int length, int mode);
1132 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1133 private extern static bool InternalEquals(String s1, String s2);