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

    +132

    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
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    public static string[] GetLogicalDrives()
    {
    	// System.Environment.GetLogicalDrives()
    	new EnvironmentPermission(PermissionState.Unrestricted).Demand();
    	// System.IO.Directory.GetLogicalDrives()
    	new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand();
    
    	int logicalDrives = Win32Native.GetLogicalDrives();
    	if (logicalDrives == 0)
    	{
    		__Error.WinIOError();
    	}
    	uint num = (uint)logicalDrives;
    	int num2 = 0;
    	while (num != 0u)
    	{
    		if ((num & 1u) != 0u)
    		{
    			num2++;
    		}
    		num >>= 1;
    	}
    	string[] array = new string[num2];
    	char[] array2 = new char[]
    	{
    		'A',
    		':',
    		'\\'
    	};
    	num = (uint)logicalDrives;
    	num2 = 0;
    	while (num != 0u)
    	{
    		if ((num & 1u) != 0u)
    		{
    			array[num2++] = new string(array2);
    		}
    		num >>= 1;
    		char[] expr_6E_cp_0 = array2;
    		int expr_6E_cp_1 = 0;
    		expr_6E_cp_0[expr_6E_cp_1] += '\u0001';
    	}
    	return array;
    }

    Копался сегодня в дебрях .NET'а и нашёл 2 метода получения списка дисков:
    System.Environment.GetLogicalDrives() и System.IO.Directory.GetLogicalDrives()
    Различается код только первой срокой запроса разрешений.

    Если один метод устарел-бы, то можно было его форварднуть через атрибут TypeForwardedTo.
    Или хотя-бы объединить код вынеся запрос разрешений.

    Оба метода доступны ещё с .NET 1.1. Но вот класс DriveInfo, который появился только в .NET 2.0 использует метод Directory.GetLogicalDrives()

    Это такая "фича" с копипастом кода или тут есть какой-то сакральный смысл?

    Запостил: TauSigma, 25 Июня 2013

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

    • > Это такая "фича" с копипастом кода или тут есть какой-то сакральный смысл?
      Не просто метод, но и проверка компилятора.
      Ответить
      • Заминусуйте, пожалуйста, тот комментарий. Я был не в себе и не ведал, что писал.
        Ответить
    • Скорее всего оставили для сохранения совместимости, как в случае с Delegate, MulticastDelegate.
      Ответить
      • Они оба доступны с версии .NET 1.1 какая-уж тут совместимость...
        Ответить
        • Delegate и MulticastDelegate тоже в одинаковых версиях фреймворка существуют.
          Ответить
          • поясните мысль
            Ответить
            • Ну я к тому, что, возможно, при создании этих двух методов, какой-то из них был добавлен раньше, какой-то позже. Что бы не было проблем у пользователей или у какого-то другого кода .net'a оба метода решили оставить. Так же поступили и с двумя классами, Delegate, MulticastDelegate.
              Ответить
          • Точно, как-то не посмотрел на это.
            Но мультикаст наследуется от делегата. Там такого явного копипаста не прослеживается.
            Как-то так:
            public static class Environment
            {
                public static String[] GetLogicalDrives()
                {
                    new EnvironmentPermission(PermissionState.Unrestricted).Demand();
                    return Win32NativeWrapper.GetLogicalDrives();
                }
                ...
            }
            
            public static class Directory
            {
                public static String[] GetLogicalDrives()
                {
                    new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand();
                    return Win32NativeWrapper.GetLogicalDrives();
                }
                ...
            }
            
            internal static class Win32NativeWrapper { .... }

            Ну и заодно туда пихнуть код типа Directory.InternalExists, некоторых методов DriveInfo и т.п...
            А то класс Win32Native уж очень жирно размазан по всему mscorlib'у...
            Ответить
            • Конкретно с мультикаст делегатом всё интереснее. Его придумали где-то в середине разработки фреймворка, потому как обычный перестал удовлетворять потребности. И использовали в новом коде. А вот старый изменять не стали.
              Ответить
            • Как и с делегатами сейчас уже не проследишь всю историю событий.
              Так что не стоит зря гадать, я думаю.
              К тому же методы возвращают строку в одинаковом формате.
              Ответить
              • MulticastDelegate наследует Delegate и использует методы класса Delegate тут к разработчикам вопросов нет.

                Тут ещё фигня в том, что permission'ы для обоих методов различаются.
                Получается, чтобы полностью перекрыть вызов метода GetLogicalDrives() администраторам придётся перекрывать оба метода.
                Или эти пермишены наследуются? В таком случае, придётся перекрывать пермишеном выше.
                Ответить
    • показать все, что скрытоКЛИЕНТСКИЕ БАЗЫ для всех кто много продает (для юрлиц и физлиц)! Узнайте подробнее! Skype: prodawez390 Email: [email protected] Whatsapp: +79139230330 Viber: +79139230330 Telegram: +79139230330
      Ответить
    • показать все, что скрытоКЛИЕНТСКИЕ БАЗЫ http://xurl.es/PR0DAWEZ УЗНАЙТЕ ПОДРОБНЕЕ! KLIENTSKIE BAZY http://xurl.es/PR0DAWEZ Uznajte podrobnee!
      Ответить

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