Задать вопрос
@Matsun

C# — метод принимает в виде параметра другой метод, как понимать?

Изучаю юнит тесты, и обнаружил пробел в базовых знаниях C#.

Вот есть метод

mock.Setup(m => m.ApplyDiscount(It.IsAny()))
.Returns(total => total);

В данном случае Setup принимает лямбда выражение m => m.ApplyDiscount(It.IsAny()) может кто объяснить как это понимать? Дайте название темы, которую надо мне выучить чтобы понимать такие выражения.
Правильно ли я догадываюсь, что Setup это не метод а делегат?
  • Вопрос задан
  • 393 просмотра
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 2
Rou1997
@Rou1997
Setup - это обычный метод.
На Returns не обращайте внимания, он тоже обычный метод, он сам по себе, это просто Fluid, делегаты и лямбды здесь ни при чем.
А вот то, что записано в виде лямбда-выражения - это делегат.
Я тут написал пример с четырьмя подобными синтаксисами, отличающимися внешне, но по сути равнозначными, если вы его воспроизведете (создадите приложение WinForms, форму и кнопку с обработчиком) то поймете, что это и примерно зачем оно может применяться:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public delegate void EventHandler2(
            int i
        );

        public Form1()
        {
            InitializeComponent();
        }

        void setEventHandler(EventHandler2 eh)
        {
            eh.Invoke(123);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Example 1
            setEventHandler(x => MessageBox.Show(x.ToString()));

            //Example 2 (equalent)
            setEventHandler((x) => { MessageBox.Show(x.ToString()); });

            //Example 3 (equalent)
            setEventHandler(delegate(int x) { MessageBox.Show(x.ToString()); });

            //Example 4 (equalent)
            setEventHandler(goodbyeDelegatesAndLambdas);
        }

        void goodbyeDelegatesAndLambdas(int x)
        {
            MessageBox.Show(x.ToString());
        }
    }
}
Ответ написан
Комментировать
@Matsun Автор вопроса
Т е m => m.ApplyDiscount(It.IsAny()) является чем то в стиле анонимного делегата? А где тогда происходит объявление самого класса-делегата? Или это просто какое то сокращение? А компилятор всё создаст за нас?
Правильно ли я понимаю что строка

mock.Setup(m => m.ApplyDiscount(It.IsAny()))

равносильна

public delegate какойтотип MyDelegate(какойтотиппараметра m);

public какойтотип Method(какойтотиппараметра m)
{
return m.ApplyDiscount(It.IsAny());
}

MyDelegate myDelegate = new MyDelegate(Method);

mock.Setup(myDelegate.Invoke(какойтотиппараметра m));


поправьте если я не прав, пожалуйста
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы