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

    +5

    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
    Action doItWrong;
    var filename = "sdf";
    using (var fileStream = new FileStream(filename,FileMode.Create))
    {
    	doItWrong=()=>
    	{
    		for(int i = 0; i < 10; i++)
    		{
    			fileStream.WriteByte(255);
    		}
    	};
    }
    doItWrong();

    Интересно, почему такое вообще не запрещают компилировать?

    Запостил: tucvbif, 11 Апреля 2016

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

    • Всё норм, это новый сишарп, с машиной времени.
      Ответить
    • "всё что вы хотели знать о кложах, но боялись спросить"
      Ответить
    • а почему нужно запрещать компилировать? пусть компилируется, в процессе выполнения конечно там эксепшен будет
      Ответить
      • Ну хз. Или хотя бы предупреждать заранее, что имеет место быть обращение к уничтоженному объекту. Конечно, пример утрированный, но
        Ответить
        • В смысле уничтоженному? По-моему "уничтожением" объектов в managed занимается GC, а тут джанго "освобожденный".
          Ответить
          • Ну, да, неправильно выразился.
            Ответить
          • Хотя да, компилятор получается никак не контролирует, что я обращаюсь к уже disposed-объекту. Всё правильно, не должен. Но ведь не даёт же компилятор мне собраться, если я пытаюсь обратиться к unassigned-объекту, почему же не бьёт по рукам, когда пытаюсь обратиться к объекту, который однозначно disposed?
            Ответить
            • Это долго и муторно реализовывать (по-моему тоже самое с отсутствием var в полях класса).
              В конце концов, может у тебя там dispose освобождает одно, а ты обращаешься к другому. А может ты диспоузом вообще что-то третье делаешь и это ожидаемое поведение?
              А вот бить за доступ до неинициализированной переменной это дешево и необходимо.
              Ответить
              • >>dispose освобождает одно, а ты обращаешься к другому
                В смысле типа такого:
                Action doItWrong;
                var filename = "foo";
                using (var fileStream = new FileStream(filename,FileMode.Create))
                {
                	doItWrong=()=>
                	{
                		for(int i = 0; i < 10; i++)
                		{
                			fileStream.WriteByte(255);
                		}
                	};
                }
                var filename2 = "bar";
                using (var fileStream = new FileStream(filename2,FileMode.Create))
                {
                	doItWrong();
                }

                Или в смысле, что после освобождения в объекте можно что-нибудь оставить, чтобы потом к этому обратиться? А так делают?
                Ответить
                • В смысле
                  Action doItWrong;
                  var filename = "foo";
                  FileStream fileStream;
                  using (fileStream = new FileStream(filename,FileMode.Create))
                  {
                  	doItWrong=()=>
                  	{
                  		for(int i = 0; i < 10; i++)
                  		{
                  			fileStream.WriteByte(255);
                  		}
                  	};
                  }
                  var filename2 = "bar";
                  using (fileStream = new FileStream(filename2,FileMode.Create))
                  {
                  	doItWrong();
                  }
                  Ответить
                  • Нет, я про другое. Никто не запрещает использовать объект после освобождения, но это нежелательно. а после финализатора и подавно
                    http://ideone.com/PscgR0
                    Ответить

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