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

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Реакции
23
Баллы
18
Есть кубик с кодом (более 1000 строк), некоторые кусочки кода повторяются по несколько раз. Можно ли внутри кубика создать функцию, там раз прописать и из кода вызывать эту функцию и тем самым сократить код. В С# с этим не сталкивался, поэтому прошу помощи, знаю чуть пайтон, там через def или class можно это сделать, тут, наверно, есть что то похожее.
public static void Name() {} - вот такая штука не работает
 
пример.
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/thr...moschju-owncode-i-metodov-rasshirenija.79162/
 
  • Спасибо
Реакции: evgen_po и arbplv
пример.
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/thr...moschju-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. Какой способ быстрее?
 
Последнее редактирование:
1 надо в общий код
2-й вроде есть передаваемые аргументы, но я фиг знает как их прописать
по скорости незнаю, как по мне все летает и так и сяк :)
 
1. В первом что-то не то, чет ругается
Так в c# кубике работать не будет.
Второй работает, но синтаксис чет пугает (я про это - "= () =>") и я так понял он работает без аргументов
Курите делегаты и лямба выражения https://metanit.com/sharp/tutorial/3.13.php
 
  • Спасибо
Реакции: arbplv
Так в 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");
 
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
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<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
 
да зачем тебе эти делегаты? Всё равно в конечном итоге на общий код переключишься. Создай "директивы 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());
 
Подскажи, а возвращать данный делегат умеет? Как заставить вот это работать? Спасибо!
Для этого надо использовать делегат Func
C#:
Развернуть Свернуть Копировать
 Func<int, int> Summ = (a) =>
 {
     a = a + 5;
     return a;
 };
 
  • Спасибо
Реакции: arbplv
да зачем тебе эти делегаты? Всё равно в конечном итоге на общий код переключишься. Создай "директивы 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());
Да, этот вариант мне больше понравился, все работает, все четко! Спасибо!
 
пример.
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/thr...moschju-owncode-i-metodov-rasshirenija.79162/
А если надо чтобы функция возвращала значение какое либо скажем bool или false
 
  • Спасибо
Реакции: SlipDez
  • Спасибо
Реакции: SlipDez
Не могли бы сказать названия статей, которые относятся к вопросу, я найду
Про основы сишарп это Начинаем кодить на c# и похожие, но можете и обучалки по шарпу на ютуб посмотреть.
 
Кстати, подобные конструкции "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
Кстати, подобные конструкции "Func<int, int> Summ = (a) =>" городить не обязательно, можно в C#-кубике просто добавлять методы как обычно делается, типа:
C#:
Развернуть Свернуть Копировать
int Sum(int one, int two)
{
    return one + two;
};

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


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

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

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

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

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

Второй кубик:

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


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

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