powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по лямбда выражениям в C#
13 сообщений из 13, страница 1 из 1
Вопрос по лямбда выражениям в C#
    #38554970
AN90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте! Читал книгу Эндрю Троелсена, и в ней обнаружил следующий код:

private static void InitDAD()
{
// Эта логика будет выводить имя любой сборки,
// загруженной в домен приложения после его создания.
AppDomain defaultAD = AppDomain.CurrentDomain;
defaultAD.AssemblyLoad += (о, s) =>
{
Console.WriteLine("{0} has been loaded!", s.LoadedAssembly.GetName().Name);
};
}

Строка defaultAD.AssemblyLoad += (о, s) => не совсем понятна. Что означает (о, s) => ?
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38554991
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(о, s) это входные параметры метода, который находится справа от =>

(о, s) => { Console.... } - это лямбда-выражение
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38582101
AN90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

в общих чертах понятно, что в Console.WriteLine сначала идёт строка форматирования, а затем объект вывода. Но почему параметры обозначены o и s? Они где-то должны быть описаны?
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38582119
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AN90,
в данном случае это подписка на события, сказать проще - предоставить указатель на кусок кода для инициализации делегата
который будет вызван на исполнение при событии, кусок кода у нас что? - функция, и для каждого делегата ( типа) она своя, со своей сигнатурой ( параметрами и воз. знач) так вот, в данном случае у этой функции два параметра и компилятор об этом знает,
вы можете передать указатель уже на написанную заранее функ., а можете инициализировать делегат по месту как тут,
если напишете не два параметра компилятор вас пошлет нах..,( так как он партикулярно знает про всё), в самом теле
лямбды, компилятор тоже знает входные параметры, и любезно предоставляет хуету: ctrl- пробел, для быстрого написания кода..
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38582219
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AN90,

вот буквально встретилось вот такое исполнение синглтона.
Код: c#
1.
2.
3.
4.
5.
6.
7.
 public static readonly Lazy<Func<Type, FieldInfo, Type>> TypeISerializeTranslateLazy = new Lazy<Func<Type, FieldInfo, Type>>(
            () => (type, fieldInfo) =>
                  {
                      var tt = type.GetInterfaces().Where(a => a.IsGenericType && a.GetGenericTypeDefinition() == typeof(ISerializeTranslate<>));
                      var enumerable = tt as Type[] ?? tt.ToArray();
                      return enumerable.SingleOrDefault(a => a.GetGenericArguments().First() == fieldInfo.FieldType);
                  });
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38582296
AN90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

теперь стало много понятнее. Но всё-таки: эти два параметра в скобках можно обозначать произвольно или я неправильно понял?
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38582304
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, так же, как и любом другом методе
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38582311
AN90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо всем!
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38584823
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиAN90,

вот буквально встретилось вот такое исполнение синглтона.
Код: c#
1.
2.
3.
4.
5.
6.
7.
 public static readonly Lazy<Func<Type, FieldInfo, Type>> TypeISerializeTranslateLazy = new Lazy<Func<Type, FieldInfo, Type>>(
            () => (type, fieldInfo) =>
                  {
                      var tt = type.GetInterfaces().Where(a => a.IsGenericType && a.GetGenericTypeDefinition() == typeof(ISerializeTranslate<>));
                      var enumerable = tt as Type[] ?? tt.ToArray();
                      return enumerable.SingleOrDefault(a => a.GetGenericArguments().First() == fieldInfo.FieldType);
                  });



Хм, а где тут синглтон?
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38585439
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP1983, А lazy и есть синглтон чистой воды, с разными типами инициализации, с мониторингом обращения к значению из разных потоков, только в данном случае паковать делегат в lazy имею считать не рациональным, ибо затраты на создания перекроются затратами на мониторинг, а он тут имхо и не нужен, были бы коллекции другой вопрос..
зы это я привел как пример лямд..
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38585892
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,
Попридираюсь. Вики нам говорит: "Одиночка (англ. Singleton) — порождающий шаблон проектирования, гарантирующий, что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа." Lazy не гарантирует "единственный экземпляр класса с глобальной точкой доступа"
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38585981
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerP1983,
где он не гарантирует? вот принципиальная схема, без двойных проверок при инициализации и мониторов
Код: 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.
   class Lazy<T>
    {
        private Boxed _boxed;
        private readonly Func<T> _func;
        public Lazy(Func<T> func)
        {
            _func = func;
        }
       
        class Boxed
        {
            internal T m_value { get; set; }
        }
        
        public T Value
        {
            get
            {
                if (_boxed != null) return _boxed.m_value;
                _boxed = new Boxed { m_value = _func() };
                return _boxed.m_value;
            }
        }
    }


15721526
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  readonly Lazy<Func<IEnumerable<Data>, byte[], Data>> _ffLazy =
 new Lazy<Func<IEnumerable<Data>, byte[], Data>>(() => (list, bytes) => list.FirstOrDefault(a => a.bytes.SequenceEqual(bytes)));
        private void Button2Click(object sender, EventArgs e)
        {
            formats.Add(new Data() { name = "PSD", bytes = new byte[] { 56, 66, 80, 83 } });
            formats.Add(new Data() { name = "JPG", bytes = new byte[] { 255, 216, 255, 224 } });

            var ee = _ffLazy.Value(formats, new byte[] { 255, 216, 255, 224 });
         
        }
...
Рейтинг: 0 / 0
Вопрос по лямбда выражениям в C#
    #38586257
SerP1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Где-то в степи: да нигде в существующей реальности не гарантирует)). На базе него можно создать полноценный синглтон, но нужны дополнительные телодвижения:
Код: 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.
using System;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // не синглтон
            var objFirst1 = new MustBeSingletonFirst();
            var objFirst2 = new Lazy<MustBeSingletonFirst>().Value;
            var objFirst3 = new Lazy<MustBeSingletonFirst>(() => new MustBeSingletonFirst()).Value;
            Debug.WriteLineIf(!ReferenceEquals(objFirst1, objFirst2), "не синглтон...");
            Debug.WriteLineIf(!ReferenceEquals(objFirst1, objFirst3), "не синглтон...");
            Debug.WriteLineIf(!ReferenceEquals(objFirst2, objFirst3), "не синглтон...");

            // синглтон
            // compile time: cannot access private constructor
            //var objSecond1 = new MustBeSingletonSecond();
            // runtime: MissingErrorException, тк Activator.CreateInstance
            //var objSecond2 = new Lazy<MustBeSingletonSecond>().Value;
            // compile time: : cannot access private constructor
            //var objSecond3 = new Lazy<MustBeSingletonSecond>(() => new MustBeSingletonSecond()).Value;
            var objSecond4 = MustBeSingletonSecond.Instance;
            var objSecond5 = MustBeSingletonSecond.Instance;
            Debug.WriteLineIf(ReferenceEquals(objSecond4, objSecond5), "синглтон...");
        }
    }

    class MustBeSingletonFirst
    {
    }

    class MustBeSingletonSecond
    {
        private MustBeSingletonSecond()
        {            
        }

        private static readonly Lazy<MustBeSingletonSecond> LazyInstance = new Lazy<MustBeSingletonSecond>(() => new MustBeSingletonSecond()); 

        public static MustBeSingletonSecond Instance
        {
            get
            {
                return LazyInstance.Value;
            }
        }
    }
}
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по лямбда выражениям в C#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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