Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Статический класс и обобщенный класс (помогите разобраться с данной конструкцией) / 15 сообщений из 15, страница 1 из 1
14.10.2016, 14:27
    #39327102
k120
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
Разбираясь с ленивыми вычислениями наткнулся на вот такой вот пример кода:

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LazyExamp
{
    class Program
    {
        static void Main(string[] args)
        {
            //1   
            Lazy<int> lazy = new Lazy<int>(() => { Console.WriteLine("hello"); return 42; });
            Console.WriteLine(lazy.Value);
             //2
            int a = 5, b = 20;
            var laz = Lazy.New(() => { Console.WriteLine("Hello2"); return new { Mul = a * b, Sum = a + b }; });
            Console.WriteLine("{0},{1}", laz.Value.Mul, laz.Value.Sum);
        }
    }
    public static class Lazy
    {
      public static Lazy<T> New<T>(Func<T> func)
        {
            return new Lazy<T>(func);
        }
    }
    public class Lazy<T>
    {
        private Func<T> func;
        private T result;
        private bool hasValue;
             public Lazy(Func<T> func)
        {
            this.func = func;
            this.hasValue = false;
        }
        
         public T Value
        {
            get
            {
                if (!this.hasValue)
                {
                    this.result = this.func();
                    this.hasValue = true;
                }
                return this.result;
            }
        }
    }
}


Возник вопрос по поводу "трюка" со статическим классом: его назначение - это сделать вызов без указания параметра типа для обобщенного класса? И где можно поподробнее почитать про такие трюки (за счет чего происходит такое поведение и как это применяется)?
...
Рейтинг: 0 / 0
14.10.2016, 14:33
    #39327110
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
где тут собственно трюки?
если компилятор может определить тип на основании входных параметров
вы ведь явый тип передаете в качестве параметра в метод, компилятор подставляет этот тип и генерирует класс (грубо говоря)
...
Рейтинг: 0 / 0
14.10.2016, 14:41
    #39327124
k120
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
Roman Mejtes,
Я как то неправильно задал вопрос.....
Почему когда вызывается метод Lazy.New() не указываются параметр -тип, ведь этот метод тоже обощен.......?
Смутило именно это.
И второй вопрос - зачем делаются такие статические классы- как описанный в данном примере?
...
Рейтинг: 0 / 0
14.10.2016, 14:46
    #39327129
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
зачем?
чтоб не указывать каждый раз один тип :) лень матушка еще и не на такое толкает :)
но это может быть чревато :)
сам недавно наступил на грабли с подобным примером.
в целом, ни чего не меняется, работать должно одинакого
...
Рейтинг: 0 / 0
14.10.2016, 14:54
    #39327136
k120
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
Roman Mejtes,
А почему разрешается через статический метод вызывать обощенный метод без указания параметра типа?
...
Рейтинг: 0 / 0
14.10.2016, 15:04
    #39327152
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
k120Roman Mejtes,
Я как то неправильно задал вопрос.....
Почему когда вызывается метод Lazy.New() не указываются параметр -тип, ведь этот метод тоже обощен.......?
Смутило именно это.
Компилятор вывел тип на основе переданного параметра.
k120И второй вопрос - зачем делаются такие статические классы- как описанный в данном примере?
Так, для удобства, в данном случае он опять будут выводить тип. И это необходимо в случае анонимного типа
Код: c#
1.
var laz = Lazy.New(() => { Console.WriteLine("Hello2"); return new { Mul = a * b, Sum = a + b }; });
...
Рейтинг: 0 / 0
14.10.2016, 15:05
    #39327155
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
k120Roman Mejtes,
А почему разрешается через статический метод вызывать обощенный метод без указания параметра типа?
Потому что generic type inference - компилятору хватает информации для выведения типа генерик-параметра из информации о типах передаваемых аргументов.
...
Рейтинг: 0 / 0
14.10.2016, 15:09
    #39327165
k120
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
Сон Веры Павловны,
Но если я попытаюсь сделать вот так:
var lz = new Lazy(() => { Console.WriteLine("hello"); return 42; });
то получу ошибку и требование указать параметр-тип. Почему здесь так?
...
Рейтинг: 0 / 0
14.10.2016, 15:17
    #39327171
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
k120Сон Веры Павловны,
Но если я попытаюсь сделать вот так:
var lz = new Lazy(() => { Console.WriteLine("hello"); return 42; });
то получу ошибку и требование указать параметр-тип. Почему здесь так?
потому, что это конструктор, а для конструктора тип необходимо указать.
тем более, что класс можно быть ковариантным или контрвариантным и передаваемый тип совсем не определяет то, какой класс в действительности нужен на выходе.
...
Рейтинг: 0 / 0
14.10.2016, 15:20
    #39327174
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
k120Сон Веры Павловны,
Но если я попытаюсь сделать вот так:
var lz = new Lazy(() => { Console.WriteLine("hello"); return 42; });
то получу ошибку и требование указать параметр-тип. Почему здесь так?
В первую очередь здесь будет ошибка Cannot create an instance of the static class. Если вы пытаетесь таким образом обратиться к вышеприведенному самописному классу LazyExamp.Lazy - он статический. Во-вторых, type inference работает только для вызова методов, но не для вызова конструкторов классов. В-третьих (на всякий случай) type inference не может быть частичным - компилятор либо выводит типы для всех генерик-аргументов, либо их все надо задавать явно. В общем, читайте Рихтера, там всё это есть.
...
Рейтинг: 0 / 0
14.10.2016, 15:25
    #39327180
k120
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
Сон Веры Павловны,

Спасибо огромное всем ответившим, вроде понимание появилось, закреплю Рихтером.
...
Рейтинг: 0 / 0
14.10.2016, 19:43
    #39327359
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
k120Roman Mejtes,
А почему разрешается через статический метод вызывать обобщенный метод без указания параметра типа?

Все просто. Если компилятор сам может вычислить тип, он его сам неявно подставит - чтобы программистам не приходилось писать много того, что компилятор сам сможет вычислить (как например с var).

В данном примере имеем такое описание:
Код: c#
1.
Func<T> func, 


что значит, что функция должна вернуть некий тип.
ну и далее в коде идет реализация этой функции:
Код: c#
1.
...return new { Mul = a * b, Sum = a + b }



И компилятор понимает, что T это класс с полями int Mul и int Sum. Поэтому он не просит явно писать тип.
Бывает, что компилятор не может вычислить тип, если возвращаются какие-нибудь генерики например. В этом случае уже вылетит соответствующая ошибка, с просьбой явно указать тип.
...
Рейтинг: 0 / 0
14.10.2016, 19:44
    #39327361
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
ой.
...
Рейтинг: 0 / 0
14.10.2016, 23:14
    #39327445
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
Чтение Рихтера зло, которое толкает на применение хитрожопых алгоритмов
...
Рейтинг: 0 / 0
15.10.2016, 08:00
    #39327465
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Статический класс и обобщенный класс (помогите разобраться с данной конструкцией)
Cat2Чтение Рихтера зло, которое толкает на применение хитрожопых алгоритмов

Какой смелый и свежий взгляд на Рихтера
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Статический класс и обобщенный класс (помогите разобраться с данной конструкцией) / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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