Функции, классы, методы внутри кубика C#

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Есть кубик с кодом (более 1000 строк), некоторые кусочки кода повторяются по несколько раз. Можно ли внутри кубика создать функцию, там раз прописать и из кода вызывать эту функцию и тем самым сократить код. В С# с этим не сталкивался, поэтому прошу помощи, знаю чуть пайтон, там через def или class можно это сделать, тут, наверно, есть что то похожее.
public static void Name() {} - вот такая штука не работает
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 709
Баллы
113
пример.
C#:
Action VerifyAnswer= () =>
{
    project.SendInfoToLog("Проверка правильности после ввода динамической капчи", needShowMessages);
     tab.WaitDownloading();
    // поиск кнопки "Подтвердить"
    HtmlElement apply = tab.FindElementById("recaptcha-verify-button");
    if (!apply.IsVoid) apply.Click();
    // проверка правильности ответа
    CheckOK();
};

VerifyAnswer();
полный пример https://zennolab.com/wiki/ru:addons:capmonster:rc2

но лучше это все перенести в общий код.
пример https://zennolab.com/discussion/threads/bystryj-start-proektov-gotovoe-reshenie-uskorjaem-razrabotku-s-pomoschju-owncode-i-metodov-rasshirenija.79162/
 
  • Спасибо
Реакции: evgen_po и arbplv

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
пример.
C#:
Action VerifyAnswer= () =>
{
    project.SendInfoToLog("Проверка правильности после ввода динамической капчи", needShowMessages);
     tab.WaitDownloading();
    // поиск кнопки "Подтвердить"
    HtmlElement apply = tab.FindElementById("recaptcha-verify-button");
    if (!apply.IsVoid) apply.Click();
    // проверка правильности ответа
    CheckOK();
};

VerifyAnswer();
полный пример https://zennolab.com/wiki/ru:addons:capmonster:rc2

но лучше это все перенести в общий код.
пример https://zennolab.com/discussion/threads/bystryj-start-proektov-gotovoe-reshenie-uskorjaem-razrabotku-s-pomoschju-owncode-i-metodov-rasshirenija.79162/
Спасибо
C#:
//Первый вариант
string a = string.Empty;
string b = string.Empty;
public static void Print_1 (a, b)
{
    project.SendInfoToLog("print_1");
    project.SendInfoToLog(a.ToString());
    project.SendInfoToLog(b.ToString());
}

//Второй вариант
Action Print_2= () =>
{
    project.SendInfoToLog("print_2");
};

//Основной код
Print_1("hello", "zenno");
Print_2();
Пару вопросов.
1. В первом что-то не то, чет ругается, подскажи, если знаешь, как его завести? Второй работает, но синтаксис чет пугает (я про это - "= () =>") и я так понял он работает без аргументов
2. Какой способ быстрее?
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 709
Баллы
113
1 надо в общий код
2-й вроде есть передаваемые аргументы, но я фиг знает как их прописать
по скорости незнаю, как по мне все летает и так и сяк :-)
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 218
Благодарностей
779
Баллы
113
1. В первом что-то не то, чет ругается
Так в c# кубике работать не будет.
Второй работает, но синтаксис чет пугает (я про это - "= () =>") и я так понял он работает без аргументов
Курите делегаты и лямба выражения https://metanit.com/sharp/tutorial/3.13.php
 
  • Спасибо
Реакции: arbplv

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Так в c# кубике работать не будет.

Курите делегаты и лямба выражения https://metanit.com/sharp/tutorial/3.13.php
Спасибо! Вскользь пробежался, чет сразу не получилось, подскажи, как передать, если знаешь параметр и чтобы все заработало, на примере вот этого маленького кусочка или тут все намного сложнее и надо разбираться глубоко?
C#:
Action Print_2= (a, b) =>
{
    project.SendInfoToLog("print_2");
    project.SendInfoToLog(a.ToString());
    project.SendInfoToLog(b.ToString());
};

//Основной код
Print_2("hello", "zenno");
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 218
Благодарностей
779
Баллы
113
C#:
Action<string, string> Print_2 = (a, b) =>
{
    project.SendInfoToLog("print_2");
    project.SendInfoToLog(a.ToString());
    project.SendInfoToLog(b.ToString());
};

//Основной код
Print_2.Invoke("hello", "zenno");
 
  • Спасибо
Реакции: arbplv

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
C#:
Action<string, string> Print_2 = (a, b) =>
{
    project.SendInfoToLog("print_2");
    project.SendInfoToLog(a.ToString());
    project.SendInfoToLog(b.ToString());
};

//Основной код
Print_2.Invoke("hello", "zenno");
Подскажи, а возвращать данный делегат умеет? Как заставить вот это работать? Спасибо!
C#:
Action<int> Summ = (a) =>
{
    a = a + 5
    return a;
};

//Основной код
Summ(10); //желаемый вывод 15
int b = 50;
Summ(b); //желаемый вывод 55
 

volody00

Client
Регистрация
06.09.2016
Сообщения
897
Благодарностей
921
Баллы
93
да зачем тебе эти делегаты? Всё равно в конечном итоге на общий код переключишься. Создай "директивы using и общий код", замени там класс с именем CommonCode на такой:
C#:
public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();
        
        IZennoPosterProjectModel project;
        Instance instance;
        public CommonCode(IZennoPosterProjectModel project, Instance instance)
        {
            this.project = project;
            this.instance = instance;
        }
        
        //тут пишем наши методы
        
        //метод, который ничего не возвращает
        public void message(string hi)
        {
            project.SendInfoToLog(hi);
        }
        
        //метод, который возвращает int
        public int sum(int a, int b)
        {
            int c = a + b;
            return c;
        }
        

        //добавляй тут новые методы
    }
Вызывай в кубике c# так:
C#:
CommonCode mySuperName = new CommonCode(project, instance);
mySuperName.message("Hello world");
int c = mySuperName.sum(25,5);
project.SendInfoToLog(c.ToString());
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 218
Благодарностей
779
Баллы
113
Подскажи, а возвращать данный делегат умеет? Как заставить вот это работать? Спасибо!
Для этого надо использовать делегат Func
C#:
 Func<int, int> Summ = (a) =>
 {
     a = a + 5;
     return a;
 };
 
  • Спасибо
Реакции: arbplv

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
да зачем тебе эти делегаты? Всё равно в конечном итоге на общий код переключишься. Создай "директивы using и общий код", замени там класс с именем CommonCode на такой:
C#:
public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();
      
        IZennoPosterProjectModel project;
        Instance instance;
        public CommonCode(IZennoPosterProjectModel project, Instance instance)
        {
            this.project = project;
            this.instance = instance;
        }
      
        //тут пишем наши методы
      
        //метод, который ничего не возвращает
        public void message(string hi)
        {
            project.SendInfoToLog(hi);
        }
      
        //метод, который возвращает int
        public int sum(int a, int b)
        {
            int c = a + b;
            return c;
        }
      

        //добавляй тут новые методы
    }
Вызывай в кубике c# так:
C#:
CommonCode mySuperName = new CommonCode(project, instance);
mySuperName.message("Hello world");
int c = mySuperName.sum(25,5);
project.SendInfoToLog(c.ToString());
Да, этот вариант мне больше понравился, все работает, все четко! Спасибо!
 

SlipDez

Client
Регистрация
18.07.2018
Сообщения
375
Благодарностей
70
Баллы
28
пример.
C#:
Action VerifyAnswer= () =>
{
    project.SendInfoToLog("Проверка правильности после ввода динамической капчи", needShowMessages);
     tab.WaitDownloading();
    // поиск кнопки "Подтвердить"
    HtmlElement apply = tab.FindElementById("recaptcha-verify-button");
    if (!apply.IsVoid) apply.Click();
    // проверка правильности ответа
    CheckOK();
};

VerifyAnswer();
полный пример https://zennolab.com/wiki/ru:addons:capmonster:rc2

но лучше это все перенести в общий код.
пример https://zennolab.com/discussion/threads/bystryj-start-proektov-gotovoe-reshenie-uskorjaem-razrabotku-s-pomoschju-owncode-i-metodov-rasshirenija.79162/
А если надо чтобы функция возвращала значение какое либо скажем bool или false
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 776
Благодарностей
1 943
Баллы
113
  • Спасибо
Реакции: SlipDez

volody00

Client
Регистрация
06.09.2016
Сообщения
897
Благодарностей
921
Баллы
93
  • Спасибо
Реакции: SlipDez

SlipDez

Client
Регистрация
18.07.2018
Сообщения
375
Благодарностей
70
Баллы
28

SlipDez

Client
Регистрация
18.07.2018
Сообщения
375
Благодарностей
70
Баллы
28

radv

Client
Регистрация
11.05.2015
Сообщения
3 776
Благодарностей
1 943
Баллы
113
Не могли бы сказать названия статей, которые относятся к вопросу, я найду
Про основы сишарп это Начинаем кодить на c# и похожие, но можете и обучалки по шарпу на ютуб посмотреть.
 

Trader1985

Client
Регистрация
14.12.2011
Сообщения
131
Благодарностей
31
Баллы
28
Кстати, подобные конструкции "Func<int, int> Summ = (a) =>" городить не обязательно, можно в C#-кубике просто добавлять методы как обычно делается, типа:
C#:
int Sum(int one, int two)
{
    return one + two;
};

int result = Sum(1, 2);
return result;

При этом даже модификаторы доступа не нужно указывать. Это тоже делегаты вроде, но только более упрощённое написание, "синтактический сахар" что ли, я х.з. Но так намного проще, эти так называемые "лямбда-выражения" мне глаза мозолят))
 
  • Спасибо
Реакции: Dmitriy Ka и volody00

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
713
Благодарностей
455
Баллы
63
Кстати, подобные конструкции "Func<int, int> Summ = (a) =>" городить не обязательно, можно в C#-кубике просто добавлять методы как обычно делается, типа:
C#:
int Sum(int one, int two)
{
    return one + two;
};

int result = Sum(1, 2);
return result;

При этом даже модификаторы доступа не нужно указывать. Это тоже делегаты вроде, но только более упрощённое написание, "синтактический сахар" что ли, я х.з. Но так намного проще, эти так называемые "лямбда-выражения" мне глаза мозолят))
Полностью согласен, какие-то замудренные ответы дали, можно просто все это в отдельные методы внутри кубика С# схлопнуть и вызывать в коде кубика где надо.
 
Последнее редактирование:
  • Спасибо
Реакции: Trader1985

Trader1985

Client
Регистрация
14.12.2011
Сообщения
131
Благодарностей
31
Баллы
28
"можно просто все это в отдельные методы внутри кубика С# схлопнуть и вызывать в коде где надо" - кстати, да, подозреваю что вместо общего кода можно написать делегат или метод в обычном С#-кубике и вызывать потом его где угодно В ДРУГИХ C#-кубиках. Но проблема что получаю ошибку
"The name 'Summ' does not exist in the current context"

Как исправить, не подскажите?
 

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
389
Баллы
63
"можно просто все это в отдельные методы внутри кубика С# схлопнуть и вызывать в коде где надо" - кстати, да, подозреваю что вместо общего кода можно написать делегат или метод в обычном С#-кубике и вызывать потом его где угодно В ДРУГИХ C#-кубиках. Но проблема что получаю ошибку
"The name 'Summ' does not exist in the current context"

Как исправить, не подскажите?
подозреваете, потому, что не знаете C#...

в отличии от общего кода, кубик C# не является общим для всего проекта. и что бы работало, все эти функции надо копировать в КАЖДЫЙ кубик.
а если понадобится правки в одной из функций, то надо будет править во ВСЕХ кубиках в проекте.

мне реально жалко того человека, который так сделает у себя в проекте.
 

Trader1985

Client
Регистрация
14.12.2011
Сообщения
131
Благодарностей
31
Баллы
28
подозреваете, потому, что не знаете C#...
Я действительно плохо знаю си-шарп.
Моя безумная фантазия выглядит примерно так:
Возможно c#-кубик это МЕТОД. Если это так, то внутри этого метода можно объявить делегат и вызывать его из другого метода-кубика.
Типа того, первый кубик:
C#:
// Это что-то за кулисами Зенки, мы видим только графический интерфейс-кубик
public static void SharpCube1()
{
    // Создаю в кубике делегат
    Func<string> getMessage = () => {
            return "Сообщение из делегата";
     };
}
Второй кубик:

C#:
// Второй кубик, графический интерфейс
public static void SharpCube2()
{
      // Сохраняю делегат в переменную
      Func<string> delegateFunc = SharpCube1();
     
       // Вызываю делегат
       project.SendInfoToLog("", delegateFunc(), true);
}

Понятно что бред какой-то написал, но уж помечтать нельзя что ли?))
Да, область видимости локального делегата ограничена только одним Си-шарп кубиком, но кубик это МЕТОД. Можно как-то на этом сыграть? К какому пространству имён и классу принадлежит сишарп-кубик?
 
Последнее редактирование:

Ахилес

Client
Read only
Регистрация
11.11.2020
Сообщения
956
Благодарностей
389
Баллы
63
Понятно что бред какой-то написал, но уж помечтать нельзя что ли?))
Да, область видимости локального делегата ограничена только одним Си-шарп кубиком, но кубик это МЕТОД. Можно как-то на этом сыграть? К какому пространству имён и классу принадлежит сишарп-кубик?
Пиши свои методы в общем коде и отстань от кубиков C# :bn:
в этой же теме все расписали https://zennolab.com/discussion/threads/funkcii-klassy-metody-vnutri-kubika-c.87790/post-589606
 

Trader1985

Client
Регистрация
14.12.2011
Сообщения
131
Благодарностей
31
Баллы
28

Кто просматривает тему: (Всего: 10, Пользователи: 0, Гости: 10)