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 {
21 [NonSerialized] private int length;
22 [NonSerialized] private char start_char;
24 private const int COMPARE_CASE = 0;
25 private const int COMPARE_INCASE = 1;
26 private const int COMPARE_ORDINAL = 2;
28 public static readonly String Empty = "";
30 public static unsafe bool Equals (string str1, string str2)
32 if ((str1 as object) == (str2 as object))
35 if (null == str1 || null == str2)
38 int len = str1.length;
40 if (len != str2.length)
46 fixed (char * s1 = &str1.start_char, s2 = &str2.start_char) {
47 // it must be one char, because 0 len is done above
52 int * sint1 = (int *) s1, sint2 = (int *) s2;
55 if (*sint1++ != *sint2++)
64 return *(char *) sint1 == *(char *) sint2;
68 public static bool operator == (String str1, String str2) {
69 return Equals(str1, str2);
72 public static bool operator != (String str1, String str2) {
73 return !Equals(str1, str2);
76 public override bool Equals(Object obj) {
77 return Equals (this, obj as String);
80 public bool Equals(String value) {
81 return Equals (this, value);
84 [IndexerName("Chars")]
85 public extern char this[int index] {
86 [MethodImplAttribute(MethodImplOptions.InternalCall)]
90 public Object Clone() {
94 public TypeCode GetTypeCode () {
95 return TypeCode.String;
98 public void CopyTo(int sindex, char[] dest, int dindex, int count) {
99 // LAMESPEC: should I null-terminate?
102 throw new ArgumentNullException();
104 if (sindex < 0 || dindex < 0 || count < 0)
105 throw new ArgumentOutOfRangeException ();
107 if (sindex + count > Length)
108 throw new ArgumentOutOfRangeException ();
110 if (dindex + count > dest.Length)
111 throw new ArgumentOutOfRangeException ();
113 InternalCopyTo(sindex, dest, dindex, count);
116 public char[] ToCharArray() {
117 return ToCharArray(0, length);
120 public char[] ToCharArray(int sindex, int length) {
121 if (sindex < 0 || length < 0 || sindex + length > this.length)
122 throw new ArgumentOutOfRangeException ();
124 char [] tmp = new char[length];
126 InternalCopyTo(sindex, tmp, 0, length);
131 public String [] Split(params char [] separator) {
132 return Split(separator, Int32.MaxValue);
135 public String[] Split(char[] separator, int count) {
136 if (null == separator || separator.Length == 0) {
137 separator = WhiteChars;
141 throw new ArgumentOutOfRangeException ();
144 return new String[0];
147 return new String[1] { ToString() };
149 return InternalSplit(separator, count);
152 public String Substring (int sindex) {
153 if (sindex < 0 || sindex > this.length) {
154 throw new ArgumentOutOfRangeException();
157 string tmp = InternalAllocateStr(this.length - sindex);
158 InternalStrcpy(tmp, 0, this, sindex, length - sindex);
163 public String Substring (int sindex, int length) {
164 if (length < 0 || sindex < 0 || sindex + length > this.length) {
165 throw new ArgumentOutOfRangeException();
171 string tmp = InternalAllocateStr(length);
172 InternalStrcpy(tmp, 0, this, sindex, length);
177 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,
178 (char) 0x2006, (char) 0x2007, (char) 0x2008, (char) 0x2009, (char) 0x200A, (char) 0x200B, (char) 0x3000, (char) 0xFEFF };
180 public String Trim(params char[] chars) {
181 if (null == chars || chars.Length == 0)
184 return InternalTrim(chars, 0);
187 public String TrimStart(params char[] chars) {
188 if (null == chars || chars.Length == 0)
191 return InternalTrim(chars, 1);
194 public String TrimEnd(params char[] chars) {
195 if (null == chars || chars.Length == 0)
198 return InternalTrim(chars, 2);
201 public static int Compare(String s1, String s2) {
202 return(Compare(s1, s2, false,
203 CultureInfo.CurrentCulture));
206 public static int Compare(String s1, String s2, bool inCase) {
207 return(Compare (s1, s2, inCase,
208 CultureInfo.CurrentCulture));
211 public static int Compare(String s1, String s2, bool inCase,
212 CultureInfo culture) {
213 if (culture == null) {
214 throw new ArgumentNullException ("culture");
223 } else if (s2 == null) {
227 CompareOptions compopts;
230 compopts=CompareOptions.IgnoreCase;
232 compopts=CompareOptions.None;
235 return(culture.CompareInfo.Compare (s1, s2, compopts));
238 public static int Compare(String s1, int i1, String s2, int i2,
240 return(Compare(s1, i1, s2, i2, length, false,
241 CultureInfo.CurrentCulture));
244 public static int Compare(String s1, int i1, String s2, int i2,
245 int length, bool inCase) {
246 return(Compare (s1, i1, s2, i2, length, inCase,
247 CultureInfo.CurrentCulture));
250 public static int Compare(String s1, int i1, String s2, int i2,
251 int length, bool inCase,
252 CultureInfo culture) {
254 throw new ArgumentNullException ("culture");
257 if((i1 > s1.Length) ||
259 (i1 < 0) || (i2 < 0) || (length < 0)) {
260 throw new ArgumentOutOfRangeException ();
273 } else if (s2 == null) {
277 CompareOptions compopts;
280 compopts=CompareOptions.IgnoreCase;
282 compopts=CompareOptions.None;
285 /* Need to cap the requested length to the
286 * length of the string, because
287 * CompareInfo.Compare will insist that length
288 * <= (string.Length - offset)
293 if(length > (s1.Length - i1)) {
297 if(length > (s2.Length - i2)) {
301 return(culture.CompareInfo.Compare(s1, i1, len1,
306 public int CompareTo(Object value) {
310 if (!(value is String))
311 throw new ArgumentException();
313 return String.Compare(this, (String) value, false);
316 public int CompareTo(String str) {
320 return Compare(this, str, false);
323 public static int CompareOrdinal(String s1, String s2) {
330 } else if (s2 == null) {
334 /* Invariant, because that is cheaper to
335 * instantiate (and chances are it already has
338 return(CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s2, CompareOptions.Ordinal));
341 public static int CompareOrdinal(String s1, int i1, String s2,
344 if ((i1 > s1.Length) ||
346 (i1 < 0) || (i2 < 0) || (length < 0)) {
347 throw new ArgumentOutOfRangeException ();
356 } else if (s2 == null) {
360 /* Need to cap the requested length to the
361 * length of the string, because
362 * CompareInfo.Compare will insist that length
363 * <= (string.Length - offset)
368 if(length > (s1.Length - i1)) {
372 if(length > (s2.Length - i2)) {
376 return(CultureInfo.InvariantCulture.CompareInfo.Compare(s1, i1, len1, s2, i2, len2, CompareOptions.Ordinal));
379 public bool EndsWith(String value) {
381 throw new ArgumentNullException();
383 if (value == String.Empty) {
387 if (value.length > this.length) {
391 return (0 == Compare(this, length - value.length, value, 0, value.length));
394 public int IndexOfAny(char [] arr) {
396 throw new ArgumentNullException();
398 return InternalIndexOfAny(arr, 0, this.length);
401 public int IndexOfAny(char [] arr, int sindex) {
403 throw new ArgumentNullException();
404 if (sindex < 0 || sindex >= this.length)
405 throw new ArgumentOutOfRangeException();
407 return InternalIndexOfAny(arr, sindex, this.length - sindex);
410 public int IndexOfAny(char [] arr, int sindex, int count) {
412 throw new ArgumentNullException();
413 if (sindex < 0 || count < 0 || sindex + count > this.length)
414 throw new ArgumentOutOfRangeException ();
416 return InternalIndexOfAny(arr, sindex, count);
419 public int IndexOf(char value) {
420 return(IndexOf(value, 0, this.length));
423 public int IndexOf(String value) {
424 return(IndexOf(value, 0, this.length));
427 public int IndexOf(char value, int sindex) {
428 return(IndexOf(value, sindex, this.length - sindex));
431 public int IndexOf(String value, int sindex) {
432 return(IndexOf(value, sindex, this.length - sindex));
435 /* This method is culture-insensitive */
436 public int IndexOf(char value, int sindex, int count) {
437 if (sindex < 0 || count < 0 ||
438 sindex + count > this.length) {
439 throw new ArgumentOutOfRangeException ();
442 if ((sindex == 0 && this.length == 0) ||
443 (sindex == this.length) ||
448 for(int pos=sindex; pos < sindex + count; pos++) {
449 if(this[pos]==value) {
457 /* But this one is culture-sensitive */
458 public int IndexOf(String value, int sindex, int count) {
460 throw new ArgumentNullException();
463 if (sindex < 0 || count < 0 ||
464 sindex + count > this.length) {
465 throw new ArgumentOutOfRangeException ();
468 if (value.length == 0) {
472 if (sindex == 0 && this.length == 0) {
480 return(CultureInfo.CurrentCulture.CompareInfo.IndexOf (this, value, sindex, count));
483 public int LastIndexOfAny(char [] arr) {
485 throw new ArgumentNullException();
487 return InternalLastIndexOfAny(arr, this.length - 1, this.length);
490 public int LastIndexOfAny(char [] arr, int sindex) {
492 throw new ArgumentNullException();
494 if (sindex < 0 || sindex > this.length)
495 throw new ArgumentOutOfRangeException();
497 if (this.length == 0)
500 return InternalLastIndexOfAny(arr, sindex, sindex + 1);
503 public int LastIndexOfAny(char [] arr, int sindex, int count) {
505 throw new ArgumentNullException();
507 if (sindex < 0 || count < 0 || sindex > this.length || sindex - count < -1)
508 throw new ArgumentOutOfRangeException();
510 if (this.length == 0)
513 return InternalLastIndexOfAny(arr, sindex, count);
516 public int LastIndexOf(char value) {
520 return(LastIndexOf(value, this.length - 1,
526 public int LastIndexOf(String value) {
528 /* This overload does additional checking */
529 return(LastIndexOf(value, 0, 0));
531 return(LastIndexOf(value, this.length - 1,
536 public int LastIndexOf(char value, int sindex){
537 return(LastIndexOf(value, sindex, sindex + 1));
540 public int LastIndexOf(String value, int sindex) {
541 return(LastIndexOf(value, sindex, sindex + 1));
544 /* This method is culture-insensitive */
545 public int LastIndexOf(char value, int sindex, int count) {
546 if (sindex == 0 && this.length == 0) {
550 if (sindex < 0 || count < 0) {
551 throw new ArgumentOutOfRangeException ();
554 if (sindex >= this.length || sindex - count + 1 < 0) {
555 throw new ArgumentOutOfRangeException ();
558 for(int pos=sindex; pos > sindex - count; pos--) {
559 if(this[pos]==value) {
567 /* But this one is culture-sensitive */
568 public int LastIndexOf(String value, int sindex, int count) {
570 throw new ArgumentNullException();
573 if (value == String.Empty) {
577 if (sindex == 0 && this.length == 0) {
581 // This check is needed to match undocumented MS behaviour
582 if (this.length == 0 && value.length > 0) {
586 if (value.length > sindex) {
594 if (sindex < 0 || sindex > this.length) {
595 throw new ArgumentOutOfRangeException ();
598 if (count < 0 || sindex - count + 1 < 0) {
599 throw new ArgumentOutOfRangeException ();
602 return(CultureInfo.CurrentCulture.CompareInfo.LastIndexOf (this, value, sindex, count));
605 public String PadLeft(int width) {
606 return PadLeft(width, ' ');
609 public String PadLeft(int width, char chr) {
611 throw new ArgumentException();
613 if (width < this.length)
614 return String.Copy(this);
616 return InternalPad(width, chr, false);
619 public String PadRight(int width) {
620 return PadRight(width, ' ');
623 public String PadRight(int width, char chr) {
625 throw new ArgumentException();
627 if (width < this.length)
628 return String.Copy(this);
630 return InternalPad(width, chr, true);
633 public bool StartsWith(String value) {
635 throw new ArgumentNullException("value");
638 if (value == String.Empty) {
642 if (this.length < value.length) {
646 return (0 == Compare(this, 0, value, 0 , value.length));
650 /* This method is culture insensitive */
651 public String Replace (char oldChar, char newChar) {
652 return(InternalReplace(oldChar, newChar));
655 /* This method is culture sensitive */
656 public String Replace(String oldValue, String newValue) {
658 throw new ArgumentNullException ("oldValue");
660 if(oldValue==String.Empty) {
661 throw new ArgumentException ("oldValue is the empty string.");
664 if(this==String.Empty) {
669 newValue=String.Empty;
672 return(InternalReplace (oldValue, newValue, CultureInfo.CurrentCulture.CompareInfo));
675 public String Remove(int sindex, int count) {
676 if (sindex < 0 || count < 0 || sindex + count > this.length)
677 throw new ArgumentOutOfRangeException ();
679 return InternalRemove(sindex, count);
682 public String ToLower() {
683 return(InternalToLower(CultureInfo.CurrentCulture));
686 public String ToLower(CultureInfo culture) {
687 return(InternalToLower(culture));
690 public String ToUpper() {
691 return(InternalToUpper(CultureInfo.CurrentCulture));
694 public String ToUpper(CultureInfo culture) {
695 return(InternalToUpper(culture));
698 public override String ToString() {
702 public String ToString(IFormatProvider provider) {
706 public String Trim() {
710 public static String Format(String format, Object arg0) {
711 return Format(null, format, new Object[] {arg0});
714 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) {
719 return Format(null, format, new Object[] {arg0, arg1, arg2});
722 public static string Format (string format, params object[] args) {
723 return Format (null, format, args);
726 public static string Format (IFormatProvider provider, string format, params object[] args) {
727 StringBuilder b = new StringBuilder ();
728 FormatHelper (b, provider, format, args);
729 return b.ToString ();
732 internal static void FormatHelper (StringBuilder result, IFormatProvider provider, string format, params object[] args) {
733 if (format == null || args == null)
734 throw new ArgumentNullException ();
738 while (ptr < format.length) {
739 char c = format[ptr ++];
742 result.Append (format, start, ptr - start - 1);
744 // check for escaped open bracket
746 if (format[ptr] == '{') {
757 ParseFormatSpecifier (format, ref ptr, out n, out width, out left_align, out arg_format);
758 if (n >= args.Length)
759 throw new FormatException ("Index (zero based) must be greater than or equal to zero and less than the size of the argument list.");
763 object arg = args[n];
768 else if (arg is IFormattable)
769 str = ((IFormattable)arg).ToString (arg_format, provider);
771 str = arg.ToString ();
773 // pad formatted string and append to result
775 if (width > str.length) {
776 string pad = new String (' ', width - str.length);
792 else if (c == '}' && ptr < format.length && format[ptr] == '}') {
793 result.Append (format, start, ptr - start - 1);
797 throw new FormatException ("Input string was not in a correct format.");
801 if (start < format.length)
802 result.Append (format.Substring (start));
805 public static String Copy (String str) {
807 throw new ArgumentNullException ();
809 int length = str.length;
811 String tmp = InternalAllocateStr(length);
812 InternalStrcpy(tmp, 0, str);
816 public static String Concat(Object obj) {
820 return obj.ToString();
823 public static String Concat(Object obj1, Object obj2)
827 s1 = (obj1 != null) ? obj1.ToString () : null;
828 s2 = (obj2 != null) ? obj2.ToString () : null;
835 } else if (s2 == null)
838 String tmp = InternalAllocateStr (s1.Length + s2.Length);
839 InternalStrcpy (tmp, 0, s1);
840 InternalStrcpy (tmp, s1.length, s2);
845 public static String Concat(Object obj1, Object obj2, Object obj3)
851 s1 = obj1.ToString ();
856 s2 = obj2.ToString ();
861 s3 = obj3.ToString ();
863 return Concat (s1, s2, s3);
866 public static String Concat (Object obj1, Object obj2, Object obj3, Object obj4)
868 string s1, s2, s3, s4;
873 s1 = obj1.ToString ();
878 s2 = obj2.ToString ();
883 s3 = obj3.ToString ();
888 s4 = obj4.ToString ();
890 return Concat (s1, s2, s3, s4);
894 public static String Concat(String s1, String s2)
905 String tmp = InternalAllocateStr(s1.length + s2.length);
907 InternalStrcpy(tmp, 0, s1);
908 InternalStrcpy(tmp, s1.length, s2);
913 public static String Concat(String s1, String s2, String s3)
937 //return InternalConcat (s1, s2, s3);
938 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length);
940 InternalStrcpy(tmp, 0, s1);
941 InternalStrcpy(tmp, s1.length, s2);
942 InternalStrcpy(tmp, s1.length + s2.length, s3);
947 public static String Concat(String s1, String s2, String s3, String s4) {
948 if (null == s1 && null == s2 && null == s3 && null == s4) {
952 if (null == s1) { s1 = String.Empty; }
953 if (null == s2) { s2 = String.Empty; }
954 if (null == s3) { s3 = String.Empty; }
955 if (null == s4) { s4 = String.Empty; }
957 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length + s4.length);
959 InternalStrcpy(tmp, 0, s1);
960 InternalStrcpy(tmp, s1.length, s2);
961 InternalStrcpy(tmp, s1.length + s2.length, s3);
962 InternalStrcpy(tmp, s1.length + s2.length + s3.length, s4);
967 public static String Concat(params Object[] args) {
969 int len, i, currentpos;
972 throw new ArgumentNullException ();
974 strings = new string [args.Length];
977 foreach (object arg in args) {
978 /* use Empty for each null argument */
980 strings[i] = String.Empty;
982 strings[i] = arg.ToString ();
983 len += strings[i].length;
992 String tmp = InternalAllocateStr(len);
993 for (i = 0; i < strings.Length; i++) {
994 InternalStrcpy(tmp, currentpos, strings[i]);
995 currentpos += strings[i].length;
1001 public static String Concat(params String[] values) {
1002 int len, i, currentpos;
1005 throw new ArgumentNullException ();
1008 foreach (string value in values)
1009 len += value != null ? value.length : 0;
1012 return String.Empty;
1016 String tmp = InternalAllocateStr(len);
1017 for (i = 0; i < values.Length; i++) {
1018 if (values[i] == null)
1021 InternalStrcpy(tmp, currentpos, values[i]);
1022 currentpos += values[i].length;
1028 public String Insert(int sindex, String value) {
1030 throw new ArgumentNullException();
1032 if (sindex < 0 || sindex > this.length)
1033 throw new ArgumentOutOfRangeException();
1035 return InternalInsert(sindex, value);
1039 public static string Intern (string str) {
1041 throw new ArgumentNullException ();
1043 return InternalIntern(str);
1046 public static string IsInterned (string str) {
1048 throw new ArgumentNullException();
1050 return InternalIsInterned(str);
1053 public static string Join (string separator, string [] value) {
1055 throw new ArgumentNullException ();
1057 return Join(separator, value, 0, value.Length);
1060 public static string Join(string separator, string[] value, int sindex, int count) {
1062 throw new ArgumentNullException ();
1064 if (sindex + count > value.Length)
1065 throw new ArgumentOutOfRangeException ();
1067 if (sindex == value.Length)
1068 return String.Empty;
1070 return InternalJoin(separator, value, sindex, count);
1073 bool IConvertible.ToBoolean (IFormatProvider provider) {
1074 return Convert.ToBoolean (this);
1077 byte IConvertible.ToByte (IFormatProvider provider) {
1078 return Convert.ToByte (this);
1081 char IConvertible.ToChar (IFormatProvider provider) {
1082 return Convert.ToChar (this);
1085 DateTime IConvertible.ToDateTime (IFormatProvider provider) {
1086 return Convert.ToDateTime (this);
1089 decimal IConvertible.ToDecimal (IFormatProvider provider) {
1090 return Convert.ToDecimal (this);
1093 double IConvertible.ToDouble (IFormatProvider provider) {
1094 return Convert.ToDouble (this);
1097 short IConvertible.ToInt16 (IFormatProvider provider) {
1098 return Convert.ToInt16 (this);
1101 int IConvertible.ToInt32 (IFormatProvider provider) {
1102 return Convert.ToInt32 (this);
1105 long IConvertible.ToInt64 (IFormatProvider provider) {
1106 return Convert.ToInt64 (this);
1109 [CLSCompliant(false)]
1110 sbyte IConvertible.ToSByte (IFormatProvider provider) {
1111 return Convert.ToSByte (this);
1114 float IConvertible.ToSingle (IFormatProvider provider) {
1115 return Convert.ToSingle (this);
1117 string IConvertible.ToString (IFormatProvider format) {
1121 object IConvertible.ToType (Type conversionType, IFormatProvider provider) {
1122 return Convert.ToType (this, conversionType, provider);
1125 [CLSCompliant(false)]
1126 ushort IConvertible.ToUInt16 (IFormatProvider provider) {
1127 return Convert.ToUInt16 (this);
1130 [CLSCompliant(false)]
1131 uint IConvertible.ToUInt32 (IFormatProvider provider) {
1132 return Convert.ToUInt32 (this);
1135 [CLSCompliant(false)]
1136 ulong IConvertible.ToUInt64 (IFormatProvider provider) {
1137 return Convert.ToUInt64 (this);
1140 TypeCode IConvertible.GetTypeCode () {
1141 return TypeCode.String;
1150 public CharEnumerator GetEnumerator () {
1151 return new CharEnumerator (this);
1154 IEnumerator IEnumerable.GetEnumerator () {
1155 return new CharEnumerator (this);
1158 private static void ParseFormatSpecifier (string str, ref int ptr, out int n, out int width, out bool left_align, out string format) {
1159 // parses format specifier of form:
1165 // N = argument number (non-negative integer)
1167 n = ParseDecimal (str, ref ptr);
1169 throw new FormatException ("Input string was not in a correct format.");
1171 // M = width (non-negative integer)
1173 if (str[ptr] == ',') {
1174 // White space between ',' and number or sign.
1176 while (Char.IsWhiteSpace (str [ptr]))
1179 format = str.Substring (start, ptr - start);
1181 left_align = (str [ptr] == '-');
1185 width = ParseDecimal (str, ref ptr);
1187 throw new FormatException ("Input string was not in a correct format.");
1195 // F = argument format (string)
1197 if (str[ptr] == ':') {
1199 while (str[ptr] != '}')
1202 format += str.Substring (start, ptr - start);
1207 if (str[ptr ++] != '}')
1208 throw new FormatException ("Input string was not in a correct format.");
1210 catch (IndexOutOfRangeException) {
1211 throw new FormatException ("Input string was not in a correct format.");
1215 private static int ParseDecimal (string str, ref int ptr) {
1220 if (c < '0' || '9' < c)
1223 n = n * 10 + c - '0';
1234 internal unsafe void InternalSetChar(int idx, char val)
1236 if ((uint) idx >= (uint) Length)
1237 throw new ArgumentOutOfRangeException("idx");
1239 fixed (char * pStr = &start_char)
1245 internal unsafe void InternalSetLength(int newLength)
1247 if (newLength > length)
1248 throw new ArgumentOutOfRangeException("newLength > length");
1252 // zero terminate, we can pass string objects directly via pinvoke
1253 fixed (char * pStr = &start_char) {
1254 pStr [length] = '\0';
1258 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1259 unsafe public extern String(char *value);
1261 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1262 unsafe public extern String(char *value, int sindex, int length);
1264 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1265 unsafe public extern String(sbyte *value);
1267 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1268 unsafe public extern String(sbyte *value, int sindex, int length);
1270 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1271 unsafe public extern String(sbyte *value, int sindex, int length, Encoding enc);
1273 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1274 public extern String(char [] val, int sindex, int length);
1276 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1277 public extern String(char [] val);
1279 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1280 public extern String(char c, int count);
1282 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1283 public extern override int GetHashCode();
1285 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1286 private extern static string InternalJoin(string separator, string[] value, int sindex, int count);
1288 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1289 private extern String InternalInsert(int sindex, String value);
1291 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1292 private extern String InternalReplace(char oldChar, char newChar);
1294 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1295 private extern String InternalReplace(String oldValue, string newValue, CompareInfo comp);
1297 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1298 private extern String InternalRemove(int sindex, int count);
1300 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1301 private extern void InternalCopyTo(int sindex, char[] dest, int dindex, int count);
1303 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1304 private extern String[] InternalSplit(char[] separator, int count);
1306 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1307 private extern String InternalTrim(char[] chars, int typ);
1309 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1310 private extern int InternalIndexOfAny(char [] arr, int sindex, int count);
1312 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1313 private extern int InternalLastIndexOfAny(char [] anyOf, int sindex, int count);
1315 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1316 private extern String InternalPad(int width, char chr, bool right);
1318 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1319 private extern String InternalToLower(CultureInfo culture);
1321 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1322 private extern String InternalToUpper(CultureInfo culture);
1324 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1325 internal extern static String InternalAllocateStr(int length);
1327 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1328 internal extern static void InternalStrcpy(String dest, int destPos, String src);
1330 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1331 internal extern static void InternalStrcpy(String dest, int destPos, String src, int startPos, int count);
1333 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1334 private extern static string InternalIntern(string str);
1336 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1337 private extern static string InternalIsInterned(string str);