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 bool Equals(String str1, String str2) {
31 if ((str1 as object) == (str2 as object))
34 if (null == str1 || null == str2)
37 int len = str1.length;
39 if (len != str2.length)
42 for (int i = 0; i < len; i++)
43 if (str1 [i] != str2 [i])
49 public static bool operator == (String str1, String str2) {
50 return Equals(str1, str2);
53 public static bool operator != (String str1, String str2) {
54 return !Equals(str1, str2);
57 public override bool Equals(Object obj) {
58 return Equals (this, obj as String);
61 public bool Equals(String value) {
62 return Equals (this, value);
65 [IndexerName("Chars")]
66 public extern char this[int index] {
67 [MethodImplAttribute(MethodImplOptions.InternalCall)]
71 public Object Clone() {
75 public TypeCode GetTypeCode () {
76 return TypeCode.String;
79 public void CopyTo(int sindex, char[] dest, int dindex, int count) {
80 // LAMESPEC: should I null-terminate?
83 throw new ArgumentNullException();
85 if (sindex < 0 || dindex < 0 || count < 0)
86 throw new ArgumentOutOfRangeException ();
88 if (sindex + count > Length)
89 throw new ArgumentOutOfRangeException ();
91 if (dindex + count > dest.Length)
92 throw new ArgumentOutOfRangeException ();
94 InternalCopyTo(sindex, dest, dindex, count);
97 public char[] ToCharArray() {
98 return ToCharArray(0, length);
101 public char[] ToCharArray(int sindex, int length) {
102 if (sindex < 0 || length < 0 || sindex + length > this.length)
103 throw new ArgumentOutOfRangeException ();
105 char [] tmp = new char[length];
107 InternalCopyTo(sindex, tmp, 0, length);
112 public String [] Split(params char [] separator) {
113 return Split(separator, Int32.MaxValue);
116 public String[] Split(char[] separator, int count) {
117 if (null == separator || separator.Length == 0) {
118 separator = WhiteChars;
122 throw new ArgumentOutOfRangeException ();
125 return new String[0];
128 return new String[1] { ToString() };
130 return InternalSplit(separator, count);
133 public String Substring (int sindex) {
134 if (sindex < 0 || sindex > this.length) {
135 throw new ArgumentOutOfRangeException();
138 string tmp = InternalAllocateStr(this.length - sindex);
139 InternalStrcpy(tmp, 0, this, sindex, length - sindex);
144 public String Substring (int sindex, int length) {
145 if (length < 0 || sindex < 0 || sindex + length > this.length) {
146 throw new ArgumentOutOfRangeException();
152 string tmp = InternalAllocateStr(length);
153 InternalStrcpy(tmp, 0, this, sindex, length);
158 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,
159 (char) 0x2006, (char) 0x2007, (char) 0x2008, (char) 0x2009, (char) 0x200A, (char) 0x200B, (char) 0x3000, (char) 0xFEFF };
161 public String Trim(params char[] chars) {
162 if (null == chars || chars.Length == 0)
165 return InternalTrim(chars, 0);
168 public String TrimStart(params char[] chars) {
169 if (null == chars || chars.Length == 0)
172 return InternalTrim(chars, 1);
175 public String TrimEnd(params char[] chars) {
176 if (null == chars || chars.Length == 0)
179 return InternalTrim(chars, 2);
182 public static int Compare(String s1, String s2) {
183 return(Compare(s1, s2, false,
184 CultureInfo.CurrentCulture));
187 public static int Compare(String s1, String s2, bool inCase) {
188 return(Compare (s1, s2, inCase,
189 CultureInfo.CurrentCulture));
192 public static int Compare(String s1, String s2, bool inCase,
193 CultureInfo culture) {
194 if (culture == null) {
195 throw new ArgumentNullException ("culture");
204 } else if (s2 == null) {
208 CompareOptions compopts;
211 compopts=CompareOptions.IgnoreCase;
213 compopts=CompareOptions.None;
216 return(culture.CompareInfo.Compare (s1, s2, compopts));
219 public static int Compare(String s1, int i1, String s2, int i2,
221 return(Compare(s1, i1, s2, i2, length, false,
222 CultureInfo.CurrentCulture));
225 public static int Compare(String s1, int i1, String s2, int i2,
226 int length, bool inCase) {
227 return(Compare (s1, i1, s2, i2, length, inCase,
228 CultureInfo.CurrentCulture));
231 public static int Compare(String s1, int i1, String s2, int i2,
232 int length, bool inCase,
233 CultureInfo culture) {
235 throw new ArgumentNullException ("culture");
238 if((i1 > s1.Length) ||
240 (i1 < 0) || (i2 < 0) || (length < 0)) {
241 throw new ArgumentOutOfRangeException ();
254 } else if (s2 == null) {
258 CompareOptions compopts;
261 compopts=CompareOptions.IgnoreCase;
263 compopts=CompareOptions.None;
266 /* Need to cap the requested length to the
267 * length of the string, because
268 * CompareInfo.Compare will insist that length
269 * <= (string.Length - offset)
274 if(length > (s1.Length - i1)) {
278 if(length > (s2.Length - i2)) {
282 return(culture.CompareInfo.Compare(s1, i1, len1,
287 public int CompareTo(Object value) {
291 if (!(value is String))
292 throw new ArgumentException();
294 return String.Compare(this, (String) value, false);
297 public int CompareTo(String str) {
301 return Compare(this, str, false);
304 public static int CompareOrdinal(String s1, String s2) {
311 } else if (s2 == null) {
315 /* Invariant, because that is cheaper to
316 * instantiate (and chances are it already has
319 return(CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s2, CompareOptions.Ordinal));
322 public static int CompareOrdinal(String s1, int i1, String s2,
325 if ((i1 > s1.Length) ||
327 (i1 < 0) || (i2 < 0) || (length < 0)) {
328 throw new ArgumentOutOfRangeException ();
337 } else if (s2 == null) {
341 /* Need to cap the requested length to the
342 * length of the string, because
343 * CompareInfo.Compare will insist that length
344 * <= (string.Length - offset)
349 if(length > (s1.Length - i1)) {
353 if(length > (s2.Length - i2)) {
357 return(CultureInfo.InvariantCulture.CompareInfo.Compare(s1, i1, len1, s2, i2, len2, CompareOptions.Ordinal));
360 public bool EndsWith(String value) {
362 throw new ArgumentNullException();
364 if (value == String.Empty) {
368 if (value.length > this.length) {
372 return (0 == Compare(this, length - value.length, value, 0, value.length));
375 public int IndexOfAny(char [] arr) {
377 throw new ArgumentNullException();
379 return InternalIndexOfAny(arr, 0, this.length);
382 public int IndexOfAny(char [] arr, int sindex) {
384 throw new ArgumentNullException();
385 if (sindex < 0 || sindex >= this.length)
386 throw new ArgumentOutOfRangeException();
388 return InternalIndexOfAny(arr, sindex, this.length - sindex);
391 public int IndexOfAny(char [] arr, int sindex, int count) {
393 throw new ArgumentNullException();
394 if (sindex < 0 || count < 0 || sindex + count > this.length)
395 throw new ArgumentOutOfRangeException ();
397 return InternalIndexOfAny(arr, sindex, count);
400 public int IndexOf(char value) {
401 return(IndexOf(value, 0, this.length));
404 public int IndexOf(String value) {
405 return(IndexOf(value, 0, this.length));
408 public int IndexOf(char value, int sindex) {
409 return(IndexOf(value, sindex, this.length - sindex));
412 public int IndexOf(String value, int sindex) {
413 return(IndexOf(value, sindex, this.length - sindex));
416 /* This method is culture-insensitive */
417 public int IndexOf(char value, int sindex, int count) {
418 if (sindex < 0 || count < 0 ||
419 sindex + count > this.length) {
420 throw new ArgumentOutOfRangeException ();
423 if ((sindex == 0 && this.length == 0) ||
424 (sindex == this.length) ||
429 for(int pos=sindex; pos < sindex + count; pos++) {
430 if(this[pos]==value) {
438 /* But this one is culture-sensitive */
439 public int IndexOf(String value, int sindex, int count) {
441 throw new ArgumentNullException();
444 if (sindex < 0 || count < 0 ||
445 sindex + count > this.length) {
446 throw new ArgumentOutOfRangeException ();
449 if (value.length == 0) {
453 if (sindex == 0 && this.length == 0) {
461 return(CultureInfo.CurrentCulture.CompareInfo.IndexOf (this, value, sindex, count));
464 public int LastIndexOfAny(char [] arr) {
466 throw new ArgumentNullException();
468 return InternalLastIndexOfAny(arr, this.length - 1, this.length);
471 public int LastIndexOfAny(char [] arr, int sindex) {
473 throw new ArgumentNullException();
475 if (sindex < 0 || sindex > this.length)
476 throw new ArgumentOutOfRangeException();
478 if (this.length == 0)
481 return InternalLastIndexOfAny(arr, sindex, sindex + 1);
484 public int LastIndexOfAny(char [] arr, int sindex, int count) {
486 throw new ArgumentNullException();
488 if (sindex < 0 || count < 0 || sindex > this.length || sindex - count < -1)
489 throw new ArgumentOutOfRangeException();
491 if (this.length == 0)
494 return InternalLastIndexOfAny(arr, sindex, count);
497 public int LastIndexOf(char value) {
501 return(LastIndexOf(value, this.length - 1,
507 public int LastIndexOf(String value) {
509 /* This overload does additional checking */
510 return(LastIndexOf(value, 0, 0));
512 return(LastIndexOf(value, this.length - 1,
517 public int LastIndexOf(char value, int sindex){
518 return(LastIndexOf(value, sindex, sindex + 1));
521 public int LastIndexOf(String value, int sindex) {
522 return(LastIndexOf(value, sindex, sindex + 1));
525 /* This method is culture-insensitive */
526 public int LastIndexOf(char value, int sindex, int count) {
527 if (sindex == 0 && this.length == 0) {
531 if (sindex < 0 || count < 0) {
532 throw new ArgumentOutOfRangeException ();
535 if (sindex >= this.length || sindex - count + 1 < 0) {
536 throw new ArgumentOutOfRangeException ();
539 for(int pos=sindex; pos > sindex - count; pos--) {
540 if(this[pos]==value) {
548 /* But this one is culture-sensitive */
549 public int LastIndexOf(String value, int sindex, int count) {
551 throw new ArgumentNullException();
554 if (value == String.Empty) {
558 if (sindex == 0 && this.length == 0) {
562 // This check is needed to match undocumented MS behaviour
563 if (this.length == 0 && value.length > 0) {
567 if (value.length > sindex) {
575 if (sindex < 0 || sindex > this.length) {
576 throw new ArgumentOutOfRangeException ();
579 if (count < 0 || sindex - count + 1 < 0) {
580 throw new ArgumentOutOfRangeException ();
583 return(CultureInfo.CurrentCulture.CompareInfo.LastIndexOf (this, value, sindex, count));
586 public String PadLeft(int width) {
587 return PadLeft(width, ' ');
590 public String PadLeft(int width, char chr) {
592 throw new ArgumentException();
594 if (width < this.length)
595 return String.Copy(this);
597 return InternalPad(width, chr, false);
600 public String PadRight(int width) {
601 return PadRight(width, ' ');
604 public String PadRight(int width, char chr) {
606 throw new ArgumentException();
608 if (width < this.length)
609 return String.Copy(this);
611 return InternalPad(width, chr, true);
614 public bool StartsWith(String value) {
616 throw new ArgumentNullException("value");
619 if (value == String.Empty) {
623 if (this.length < value.length) {
627 return (0 == Compare(this, 0, value, 0 , value.length));
631 /* This method is culture insensitive */
632 public String Replace (char oldChar, char newChar) {
633 return(InternalReplace(oldChar, newChar));
636 /* This method is culture sensitive */
637 public String Replace(String oldValue, String newValue) {
639 throw new ArgumentNullException ("oldValue");
641 if(oldValue==String.Empty) {
642 throw new ArgumentException ("oldValue is the empty string.");
645 if(this==String.Empty) {
650 newValue=String.Empty;
653 return(InternalReplace (oldValue, newValue, CultureInfo.CurrentCulture.CompareInfo));
656 public String Remove(int sindex, int count) {
657 if (sindex < 0 || count < 0 || sindex + count > this.length)
658 throw new ArgumentOutOfRangeException ();
660 return InternalRemove(sindex, count);
663 public String ToLower() {
664 return(InternalToLower(CultureInfo.CurrentCulture));
667 public String ToLower(CultureInfo culture) {
668 return(InternalToLower(culture));
671 public String ToUpper() {
672 return(InternalToUpper(CultureInfo.CurrentCulture));
675 public String ToUpper(CultureInfo culture) {
676 return(InternalToUpper(culture));
679 public override String ToString() {
683 public String ToString(IFormatProvider provider) {
687 public String Trim() {
691 public static String Format(String format, Object arg0) {
692 return Format(null, format, new Object[] {arg0});
695 public static String Format(String format, Object arg0, Object arg1) {
696 return Format(null, format, new Object[] {arg0, arg1});
699 public static String Format(String format, Object arg0, Object arg1, Object arg2) {
700 return Format(null, format, new Object[] {arg0, arg1, arg2});
703 public static string Format (string format, params object[] args) {
704 return Format (null, format, args);
707 public static string Format (IFormatProvider provider, string format, params object[] args) {
708 StringBuilder b = new StringBuilder ();
709 FormatHelper (b, provider, format, args);
710 return b.ToString ();
713 internal static void FormatHelper (StringBuilder result, IFormatProvider provider, string format, params object[] args) {
714 if (format == null || args == null)
715 throw new ArgumentNullException ();
719 while (ptr < format.length) {
720 char c = format[ptr ++];
723 result.Append (format, start, ptr - start - 1);
725 // check for escaped open bracket
727 if (format[ptr] == '{') {
738 ParseFormatSpecifier (format, ref ptr, out n, out width, out left_align, out arg_format);
739 if (n >= args.Length)
740 throw new FormatException ("Index (zero based) must be greater than or equal to zero and less than the size of the argument list.");
744 object arg = args[n];
749 else if (arg is IFormattable)
750 str = ((IFormattable)arg).ToString (arg_format, provider);
752 str = arg.ToString ();
754 // pad formatted string and append to result
756 if (width > str.length) {
757 string pad = new String (' ', width - str.length);
773 else if (c == '}' && ptr < format.length && format[ptr] == '}') {
774 result.Append (format, start, ptr - start - 1);
778 throw new FormatException ("Input string was not in a correct format.");
782 if (start < format.length)
783 result.Append (format.Substring (start));
786 public static String Copy (String str) {
788 throw new ArgumentNullException ();
790 int length = str.length;
792 String tmp = InternalAllocateStr(length);
793 InternalStrcpy(tmp, 0, str);
797 public static String Concat(Object obj) {
801 return obj.ToString();
804 public static String Concat(Object obj1, Object obj2)
812 return obj2.ToString ();
813 } else if (obj2 == null)
814 return obj1.ToString ();
816 s1 = obj1.ToString ();
817 s2 = obj2.ToString ();
818 String tmp = InternalAllocateStr (s1.Length + s2.Length);
819 InternalStrcpy (tmp, 0, s1);
820 InternalStrcpy (tmp, s1.length, s2);
825 public static String Concat(Object obj1, Object obj2, Object obj3)
831 s1 = obj1.ToString ();
836 s2 = obj2.ToString ();
841 s3 = obj3.ToString ();
843 return Concat (s1, s2, s3);
846 public static String Concat (Object obj1, Object obj2, Object obj3, Object obj4)
848 string s1, s2, s3, s4;
853 s1 = obj1.ToString ();
858 s2 = obj2.ToString ();
863 s3 = obj3.ToString ();
868 s4 = obj4.ToString ();
870 return Concat (s1, s2, s3, s4);
874 public static String Concat(String s1, String s2)
885 String tmp = InternalAllocateStr(s1.length + s2.length);
887 InternalStrcpy(tmp, 0, s1);
888 InternalStrcpy(tmp, s1.length, s2);
893 public static String Concat(String s1, String s2, String s3)
917 //return InternalConcat (s1, s2, s3);
918 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length);
920 InternalStrcpy(tmp, 0, s1);
921 InternalStrcpy(tmp, s1.length, s2);
922 InternalStrcpy(tmp, s1.length + s2.length, s3);
927 public static String Concat(String s1, String s2, String s3, String s4) {
928 if (null == s1 && null == s2 && null == s3 && null == s4) {
932 if (null == s1) { s1 = String.Empty; }
933 if (null == s2) { s2 = String.Empty; }
934 if (null == s3) { s3 = String.Empty; }
935 if (null == s4) { s4 = String.Empty; }
937 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length + s4.length);
939 InternalStrcpy(tmp, 0, s1);
940 InternalStrcpy(tmp, s1.length, s2);
941 InternalStrcpy(tmp, s1.length + s2.length, s3);
942 InternalStrcpy(tmp, s1.length + s2.length + s3.length, s4);
947 public static String Concat(params Object[] args) {
949 int len, i, currentpos;
952 throw new ArgumentNullException ();
954 strings = new string [args.Length];
957 foreach (object arg in args) {
958 /* use Empty for each null argument */
960 strings[i] = String.Empty;
962 strings[i] = arg.ToString ();
963 len += strings[i].length;
972 String tmp = InternalAllocateStr(len);
973 for (i = 0; i < strings.Length; i++) {
974 InternalStrcpy(tmp, currentpos, strings[i]);
975 currentpos += strings[i].length;
981 public static String Concat(params String[] values) {
982 int len, i, currentpos;
985 throw new ArgumentNullException ();
988 foreach (string value in values)
989 len += value != null ? value.length : 0;
996 String tmp = InternalAllocateStr(len);
997 for (i = 0; i < values.Length; i++) {
998 if (values[i] == null)
1001 InternalStrcpy(tmp, currentpos, values[i]);
1002 currentpos += values[i].length;
1008 public String Insert(int sindex, String value) {
1010 throw new ArgumentNullException();
1012 if (sindex < 0 || sindex > this.length)
1013 throw new ArgumentOutOfRangeException();
1015 return InternalInsert(sindex, value);
1019 public static string Intern (string str) {
1021 throw new ArgumentNullException ();
1023 return InternalIntern(str);
1026 public static string IsInterned (string str) {
1028 throw new ArgumentNullException();
1030 return InternalIsInterned(str);
1033 public static string Join (string separator, string [] value) {
1035 throw new ArgumentNullException ();
1037 return Join(separator, value, 0, value.Length);
1040 public static string Join(string separator, string[] value, int sindex, int count) {
1042 throw new ArgumentNullException ();
1044 if (sindex + count > value.Length)
1045 throw new ArgumentOutOfRangeException ();
1047 if (sindex == value.Length)
1048 return String.Empty;
1050 return InternalJoin(separator, value, sindex, count);
1053 bool IConvertible.ToBoolean (IFormatProvider provider) {
1054 return Convert.ToBoolean (this);
1057 byte IConvertible.ToByte (IFormatProvider provider) {
1058 return Convert.ToByte (this);
1061 char IConvertible.ToChar (IFormatProvider provider) {
1062 return Convert.ToChar (this);
1065 DateTime IConvertible.ToDateTime (IFormatProvider provider) {
1066 return Convert.ToDateTime (this);
1069 decimal IConvertible.ToDecimal (IFormatProvider provider) {
1070 return Convert.ToDecimal (this);
1073 double IConvertible.ToDouble (IFormatProvider provider) {
1074 return Convert.ToDouble (this);
1077 short IConvertible.ToInt16 (IFormatProvider provider) {
1078 return Convert.ToInt16 (this);
1081 int IConvertible.ToInt32 (IFormatProvider provider) {
1082 return Convert.ToInt32 (this);
1085 long IConvertible.ToInt64 (IFormatProvider provider) {
1086 return Convert.ToInt64 (this);
1089 [CLSCompliant(false)]
1090 sbyte IConvertible.ToSByte (IFormatProvider provider) {
1091 return Convert.ToSByte (this);
1094 float IConvertible.ToSingle (IFormatProvider provider) {
1095 return Convert.ToSingle (this);
1097 string IConvertible.ToString (IFormatProvider format) {
1101 object IConvertible.ToType (Type conversionType, IFormatProvider provider) {
1102 return Convert.ToType (this, conversionType, provider);
1105 [CLSCompliant(false)]
1106 ushort IConvertible.ToUInt16 (IFormatProvider provider) {
1107 return Convert.ToUInt16 (this);
1110 [CLSCompliant(false)]
1111 uint IConvertible.ToUInt32 (IFormatProvider provider) {
1112 return Convert.ToUInt32 (this);
1115 [CLSCompliant(false)]
1116 ulong IConvertible.ToUInt64 (IFormatProvider provider) {
1117 return Convert.ToUInt64 (this);
1120 TypeCode IConvertible.GetTypeCode () {
1121 return TypeCode.String;
1130 public CharEnumerator GetEnumerator () {
1131 return new CharEnumerator (this);
1134 IEnumerator IEnumerable.GetEnumerator () {
1135 return new CharEnumerator (this);
1138 private static void ParseFormatSpecifier (string str, ref int ptr, out int n, out int width, out bool left_align, out string format) {
1139 // parses format specifier of form:
1145 // N = argument number (non-negative integer)
1147 n = ParseDecimal (str, ref ptr);
1149 throw new FormatException ("Input string was not in a correct format.");
1151 // M = width (non-negative integer)
1153 if (str[ptr] == ',') {
1154 // White space between ',' and number or sign.
1156 while (Char.IsWhiteSpace (str [ptr]))
1159 format = str.Substring (start, ptr - start);
1161 left_align = (str [ptr] == '-');
1165 width = ParseDecimal (str, ref ptr);
1167 throw new FormatException ("Input string was not in a correct format.");
1175 // F = argument format (string)
1177 if (str[ptr] == ':') {
1179 while (str[ptr] != '}')
1182 format += str.Substring (start, ptr - start);
1187 if (str[ptr ++] != '}')
1188 throw new FormatException ("Input string was not in a correct format.");
1190 catch (IndexOutOfRangeException) {
1191 throw new FormatException ("Input string was not in a correct format.");
1195 private static int ParseDecimal (string str, ref int ptr) {
1200 if (c < '0' || '9' < c)
1203 n = n * 10 + c - '0';
1214 internal unsafe void InternalSetChar(int idx, char val)
1216 if ((uint) idx >= (uint) Length)
1217 throw new ArgumentOutOfRangeException("idx");
1219 fixed (char * pStr = &start_char)
1225 internal unsafe void InternalSetLength(int newLength)
1227 if (newLength > length)
1228 throw new ArgumentOutOfRangeException("newLength > length");
1232 // zero terminate, we can pass string objects directly via pinvoke
1233 fixed (char * pStr = &start_char) {
1234 pStr [length] = '\0';
1238 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1239 unsafe public extern String(char *value);
1241 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1242 unsafe public extern String(char *value, int sindex, int length);
1244 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1245 unsafe public extern String(sbyte *value);
1247 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1248 unsafe public extern String(sbyte *value, int sindex, int length);
1250 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1251 unsafe public extern String(sbyte *value, int sindex, int length, Encoding enc);
1253 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1254 public extern String(char [] val, int sindex, int length);
1256 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1257 public extern String(char [] val);
1259 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1260 public extern String(char c, int count);
1262 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1263 public extern override int GetHashCode();
1265 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1266 private extern static string InternalJoin(string separator, string[] value, int sindex, int count);
1268 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1269 private extern String InternalInsert(int sindex, String value);
1271 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1272 private extern String InternalReplace(char oldChar, char newChar);
1274 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1275 private extern String InternalReplace(String oldValue, string newValue, CompareInfo comp);
1277 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1278 private extern String InternalRemove(int sindex, int count);
1280 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1281 private extern void InternalCopyTo(int sindex, char[] dest, int dindex, int count);
1283 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1284 private extern String[] InternalSplit(char[] separator, int count);
1286 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1287 private extern String InternalTrim(char[] chars, int typ);
1289 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1290 private extern int InternalIndexOfAny(char [] arr, int sindex, int count);
1292 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1293 private extern int InternalLastIndexOfAny(char [] anyOf, int sindex, int count);
1295 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1296 private extern String InternalPad(int width, char chr, bool right);
1298 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1299 private extern String InternalToLower(CultureInfo culture);
1301 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1302 private extern String InternalToUpper(CultureInfo culture);
1304 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1305 internal extern static String InternalAllocateStr(int length);
1307 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1308 internal extern static void InternalStrcpy(String dest, int destPos, String src);
1310 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1311 internal extern static void InternalStrcpy(String dest, int destPos, String src, int startPos, int count);
1313 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1314 private extern static string InternalIntern(string str);
1316 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1317 private extern static string InternalIsInterned(string str);