I came across a strange way to implement ToString() and I am wondering how it works:
public string tostr(int n)  {     string s = "";     foreach (char c in n-- + "") {  //<------HOW IS THIS POSSIBLE ?         s = s + c;     }     return s; }   Is the iterator assuming the size of a char?
In Python an integer can be converted into a string using the built-in str() function. The str() function takes in any python data type and converts it into a string.
The next method in this list to convert int to string in C++ is by using the to_string() function. This function is used to convert not only the integer but numerical values of any data type into a string. The to_string() method is included in the header file of the class string, i.e., <string> or <cstring>.
It calls the String.Concat(object, object) method implicitly, which concatenates the string representations of two specified objects:
string result = String.Concat("", n--);   The String.Concat(object, object) method then calls String.Concat(string, string). To read the Concat's source and check it in depth, first go here: String.cs source code in C# .NET and then in that page in the search TextBox type String and then click on the String.cs link in the results to go to the String.cs source code in C# .NET page and check the Concat method.
This is the method definition:
public static String Concat(Object arg0, Object arg1)  {      Contract.Ensures(Contract.Result<string>() != null);     Contract.EndContractBlock();       if (arg0 == null)     {          arg0 = String.Empty;     }      if (arg1==null)      {          arg1 = String.Empty;     }      return Concat(arg0.ToString(), arg1.ToString());  }   As you see this calls public static String Concat(String str0, String str1) method finally:
public static String Concat(String str0, String str1)  {     Contract.Ensures(Contract.Result<string>() != null);     Contract.Ensures(Contract.Result<string>().Length ==         (str0 == null ? 0 : str0.Length) +          (str1 == null ? 0 : str1.Length));     Contract.EndContractBlock();       if (IsNullOrEmpty(str0)) {         if (IsNullOrEmpty(str1)) {              return String.Empty;         }         return str1;     }       if (IsNullOrEmpty(str1)) {          return str0;      }      int str0Length = str0.Length;      String result = FastAllocateString(str0Length + str1.Length);      FillStringChecked(result, 0,        str0);     FillStringChecked(result, str0Length, str1);       return result; }   And this is the underlying IL, by Ildasm:
.method public hidebysig instance string          tostr(int32 n) cil managed {   // Code size       74 (0x4a)   .maxstack  3   .locals init ([0] string s,            [1] string V_1,            [2] int32 V_2,            [3] char c,            [4] string V_4)   IL_0000:  nop   IL_0001:  ldstr      ""   IL_0006:  stloc.0   IL_0007:  nop   IL_0008:  ldarg.1   IL_0009:  dup   IL_000a:  ldc.i4.1   IL_000b:  sub   IL_000c:  starg.s    n   IL_000e:  box        [mscorlib]System.Int32   IL_0013:  call       string [mscorlib]System.String::Concat(object)   IL_0018:  stloc.1   IL_0019:  ldc.i4.0   IL_001a:  stloc.2   IL_001b:  br.s       IL_0039   IL_001d:  ldloc.1   IL_001e:  ldloc.2   IL_001f:  callvirt   instance char [mscorlib]System.String::get_Chars(int32)   IL_0024:  stloc.3   IL_0025:  nop   IL_0026:  ldloc.0   IL_0027:  ldloca.s   c   IL_0029:  call       instance string [mscorlib]System.Char::ToString()   IL_002e:  call       string [mscorlib]System.String::Concat(string,                                                               string)   IL_0033:  stloc.0   IL_0034:  nop   IL_0035:  ldloc.2   IL_0036:  ldc.i4.1   IL_0037:  add   IL_0038:  stloc.2   IL_0039:  ldloc.2   IL_003a:  ldloc.1   IL_003b:  callvirt   instance int32 [mscorlib]System.String::get_Length()   IL_0040:  blt.s      IL_001d   IL_0042:  ldloc.0   IL_0043:  stloc.s    V_4   IL_0045:  br.s       IL_0047   IL_0047:  ldloc.s    V_4   IL_0049:  ret }// end of method tostr 
                        Explaining this "step by step" :
// assume the input is 1337 public string tostr(int n) {     //line below is creating a placeholder for the result string     string s = "";     // below line we can split into 2 lines to explain in more detail:     // foreach (char c in n-- + "") {     // then value of n is concatenated with an empty string :     // string numberString = n-- + ""; // numberString is "1337";     // and after this line value of n will be 1336     // which then is iterated though :     // foreach(char c in numberString) { // meaning foreach(char c in "1337")     foreach (char c in n-- + "") {  //<------HOW IS THIS POSSIBLE ?         s = s + c; // here each sign of the numberString is added into the placeholder     }     return s; // return filled placeholder }   So basically if you concatenate string with int it will automatically call int.ToString method and join the string together.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With