powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Методы расширения true/!true?
24 сообщений из 24, страница 1 из 1
Методы расширения true/!true?
    #39639781
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В книжке написано, что если класс sealed, и унаследоваться от него никак, то методы расширения - самое оно. Вроде понятно, слова русские.

Но возникают вопросы.

1. Если класс закрыт для наследования by design, но мы его расширяем - это вообще законно?

2. Вот есть класс, какой-нибудь POCO, стройный и красивый, но надо бы к нему метод чужеродный прилепить... Нарушать стройность не хочется, и тогда я леплю в отдельном файле метод расширения (их там таких много) и делаю вид, что этого файла и нету в принципе.

А вы что про них думаете?
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639808
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомВ книжке написано, что если класс sealed, и унаследоваться от него никак, то методы расширения - самое оно. Вроде понятно, слова русские.

Но возникают вопросы.

1. Если класс закрыт для наследования by design, но мы его расширяем - это вообще законно?

2. Вот есть класс, какой-нибудь POCO, стройный и красивый, но надо бы к нему метод чужеродный прилепить... Нарушать стройность не хочется, и тогда я леплю в отдельном файле метод расширения (их там таких много) и делаю вид, что этого файла и нету в принципе.

А вы что про них думаете?на самом деле любой не статический метод выглядит так же как метод расширения, 1 параметром передается инстанс, а потом все остальные.
злоупотреблять методами расширения не стоит. так как это усложняет процесс сопровождения и отладки.
можно просто создать статический метод и использовать его, без всяких выкрутасов с методами расширения.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639843
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомНарушать стройность не хочется, и тогда я леплюи тогда чтобы сохранить стройность, я Леплю))))
Как и в прошлом твоем вопросе все зависит от контекста.
Хак всегда допустим вмеру. Выше сказали.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639846
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окей, тогда зайду с философии -

Остаётся ли POCO - POCO, если у него есть метод расширения?
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639860
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод расширения - это синтаксический сахар, который никак не меняет исходный класс.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639875
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМетод расширения - это синтаксический сахар, который никак не меняет исходный класс.

Ну, это очевидно.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639879
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом1. Если класс закрыт для наследования by design, но мы его расширяем - это вообще законно?

Методы расширения не расширяют класс. Это просто методы другого класса + сахар, чтобы сократить количество букв.

Агнец за бортом2. Вот есть класс, какой-нибудь POCO, стройный и красивый, но надо бы к нему метод чужеродный прилепить... Нарушать стройность не хочется, и тогда я леплю в отдельном файле метод расширения (их там таких много) и делаю вид, что этого файла и нету в принципе.

Это не "метод чужеродный", это просто отдельный метод, на правах ровно такой же, как без this.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639918
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttна правах ровно такой же, как без this.

Да лана, и он будет доступен через рефлексию?
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639925
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет. Только не через рефлексию класса, который он расширяет, а через рефлексию класса, в котором он объявлен. Именно в этом смысле это такой же статический метод, как и любой другой и this - это всего лишь инструкция для компилятора.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639935
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомОкей, тогда зайду с философии -
Остаётся ли POCO - POCO, если у него есть метод расширения?
Цель возникновения POCO и POJO это простое сохранение в базу и передать по сети.
Если это не нужно, то уже плевать на этот критерий. POCO или нет. Чистенький объект или нет.....
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639938
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомhVosttна правах ровно такой же, как без this.

Да лана, и он будет доступен через рефлексию?конечно не будет, его даже не будет видно в IntelliSense если пространство имен с классом в котором метод расширения не использовано.
Естественно к private,protected полям доступа из метода расширения так же не будет

Extension методы вводили, на сколько я помню, вместе с Linq и по сути для Linq. Там их использование к месту, так как методы будут переиспользованы множество раз.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639951
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомhVosttна правах ровно такой же, как без this.

Да лана, и он будет доступен через рефлексию?

Нет.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639952
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортом1. Если класс закрыт для наследования by design, но мы его расширяем - это вообще законно?
Ровно в той же степени, в какой законна передача экземпляра класса в некий статический метод какого-то другого класса.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639953
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesExtension методы вводили, на сколько я помню, вместе с Linq и по сути для Linq. Там их использование к месту, так как методы будут переиспользованы множество раз.

Может их и вводили только для LINQ, но сейчас методы расширения используются повсеместно, много для чего. В том числе для исправления косяков архитектуры .NET
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639967
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВ том числе для исправления косяков архитектуры .NET автор наверно исправляет косяки предыдущего архитектора)
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39639986
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАгнец за бортомпропущено...


Да лана, и он будет доступен через рефлексию?

Нет.
через рефлексию доступно все.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  public static class TestExtM
    {
        public static int M1(this string str)
        {
            return str.Length;
        }
        public static int M2(string str)
        {
            return str.Length;
        }

        public static IEnumerable<Type> M3()
        {
            var data = Assembly.GetCallingAssembly()
                .GetTypes()
                .Where(t => t.IsAbstract && t.IsSealed)
                .SelectMany(x => x.GetMethods())
                .Where(x => x.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute)))
                .Select(x => x.GetParameters().First())
                .Select(x => x.ParameterType)
                .Distinct();
            return data;
        }
    }
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39640084
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

чем это отличается от поиска типов по любому кастомному атрибуту?
или по методам, принимающим параметры определённого типа?
или вообще по имени метода?

а теперь возьми тип и найди все расширения для него, не ковыряясь в сборках
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39640131
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВ,

чем это отличается от поиска типов по любому кастомному атрибуту?
или по методам, принимающим параметры определённого типа?
или вообще по имени метода?

а теперь возьми тип и найди все расширения для него, не ковыряясь в сборках
эээ....
А что ты вообще понимаешь под рефлексией?
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39640214
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVosttЕвгенийВ,

чем это отличается от поиска типов по любому кастомному атрибуту?
или по методам, принимающим параметры определённого типа?
или вообще по имени метода?

а теперь возьми тип и найди все расширения для него, не ковыряясь в сборках
эээ....
А что ты вообще понимаешь под рефлексией?
Как выше уже было сказано, метод расширения будет доступен через рефлексию, но принадлежать он будет не расширяемому типу, а типу статического класса-расширителя. И вышеприведенное ничем не отличается не просто от поисков по кастомному атрибуту, а вообще от поисков любых методов любых типов, принимающих заданный тип. Метод расширения не является частью публичного контракта типа, и в этом одна из проблем этих методов - я как-то долго наблюдал, как человек пытался в ходе рефакторинга выделить из класса интерфейс, и ему всю малину портил метод расширения. Не хотел этот метод в интерфейс совсем никак.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39640321
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомВ книжке написано, что если класс sealed, и унаследоваться от него никак, то методы расширения - самое оно. Вроде понятно, слова русские.

Но возникают вопросы.

1. Если класс закрыт для наследования by design, но мы его расширяем - это вообще законно?

2. Вот есть класс, какой-нибудь POCO, стройный и красивый, но надо бы к нему метод чужеродный прилепить... Нарушать стройность не хочется, и тогда я леплю в отдельном файле метод расширения (их там таких много) и делаю вид, что этого файла и нету в принципе.

А вы что про них думаете?

1. Вы нарушаете разумные принципы без всякой необходимости. Это уголовщина ))
Во-первых, есть паттерны, чтобы обойти такие "проблемы".
Во-вторых, расширения сильно мешают при отладке и изучении кода.
В-третих, расширение ничего общего с наследованием не имеет. То, что они "похоже" выглядят только маскирует истинную сущность расширения)
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39640361
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВэээ....
А что ты вообще понимаешь под рефлексией?

GetType()
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39640396
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныя как-то долго наблюдал, как человек пытался в ходе рефакторинга выделить из класса интерфейс, и ему всю малину портил метод расширения

да, это шедевр, тоже подобное наблюдал

ну... всегда найдётся ложечка дёгтя, ничего не бывает бесплатно.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39640398
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddxВо-вторых, расширения сильно мешают при отладке и изучении кода.

фига себе. хотелось бы посмотреть, кому и чем мешают.
...
Рейтинг: 0 / 0
Методы расширения true/!true?
    #39641515
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AddxВ-третих, расширение ничего общего с наследованием не имеет. То, что они "похоже" выглядят только маскирует истинную сущность расширения)
Вообще, с помощью интерфейсов и методов расширений в C# реализованы так называемые примеси, в go например только они и есть.

Мы можем взять публичный контракт класса определенный интерфейсом и описать некий алгоритм (метод), который будет доступен для всех реализаций интерфейса.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
 public interface IAdd<T> 
    {
        T Value { get; set; }
        T Add(T x);
    }
    public class IntAdd : IAdd<int>
    {
        public int Value { get; set; }
        public int Add(int x)
        {
            return Value + x;
        }

    }
    public class DoubleAdd : IAdd<double>
    {
        public double Value { get; set; }

        public double Add(double x)
        {
            return Value + x;
        }
    }
    public static class MulClass
    {
        public static T Mul<T>(this IAdd<T> add, int t)
        {
            T res = default(T);
            for (int i = 0; i < t; i++)
            {
                res = add.Add(res);
            }
            return res;
        }
    }


Код: c#
1.
2.
3.
4.
5.
6.
 IntAdd intAdd = new IntAdd { Value = 10 };
            var tmp1 = intAdd.Mul(10);
            Console.WriteLine(tmp1);
            DoubleAdd doubleAdd = new DoubleAdd { Value = 10 };
            var tmp2 = doubleAdd.Mul(10);
            Console.WriteLine(tmp2);
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Методы расширения true/!true?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]