1. C# / Говнокод #16247

    +143

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    using System;
    using System.Text;
    public class Test
    {
    	public static void Main()
    	{
    		object obj = "Suck my balls";
    		string str1 = "Suck my balls";
    		string str2 = new StringBuilder().Append("Suck my ").Append("balls").ToString();
    		Console.WriteLine(obj==str1);//True
    		Console.WriteLine(str2==str1);//True
    		Console.WriteLine(obj==str2);//False
    	}
    }

    Нетранзитивный дотнет или головоломка на ночь

    Запостил: kegdan, 27 Июня 2014

    Комментарии (13) RSS

    • https://ideone.com/DpyNj1
      Ответить
    • Разные операторы и интернирование строк)))
      Ответить
      • Ага. А если расписать:
        Console.WriteLine(Object.ReferenceEquals(obj, str1));//True
        Console.WriteLine(String.Equals(str2, str1));//True
        Console.WriteLine(Object.ReferenceEquals(obj, str2));//False

        Т.е. получается что адрес obj и str1 указывает в ресурсы PE файла из #US "Suck my balls�", а str2 собирается из 2х указателей в #US:
        1) Suck my �
        2) balls�
        И попадает в кучу.

        Где-то ещё должен быть метод, который удаляет указатели вот на такие лишние строки в куче текущего процесса, но на память не могу вспомнить...
        Ответить
        • Вспоминай, а такого не знаю.

          Или ты про gc.collect()?
          Ответить
        • > метод, который удаляет указатели вот на такие лишние строки
          https://ideone.com/oRK7jt
          Ответить
          • А. ну этом смысле да. Он ложит строку в кэш и извлекает ссылку на обьект из кэша строк.

            Есть еще string.IsInterned() - он просто извлекает ссылку если нет - возвращает null
            Ответить
    • А для не-шарпоблядей можно поподробнее?
      Ответить

    Добавить комментарий