Заблокирован
1
.NET 2.x

Можно ли сделать так, чтобы после имени функции не нужно было бы писать круглые скобки?

16.09.2011, 11:04. Показов 3343. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток.

На С++ есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
void Write() 
{
    char s[] = "Hello World"; 
    for (int i = 0; s[i]; i++) 
        std::cout.put(s[i]); 
}
 
void Read() 
{
    std::cin.get();
}
 
#define a Write();
#define b Read();
 
int main()
{
    a b
}
Хотелось сделать что-то подобное на C#, но наверное это невозможно.
#define a Write(); - не проходит, делегат тоже со скобками.

И вопрос наподобии о точке с запятой.

Возможно у кого-то получилось, поделитесь опытом. Зараннее благодарен.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2011, 11:04
Ответы с готовыми решениями:

Что нужно добавить чтобы так можно было писать код?
ниже кусок кода ' область связывания переменных с ячейками Сorrect =...

Не могу доделать Калькулятор( как сделать так чтобы запятую можно было писать 1 раз )
Помогите доделать калькулятор. Вроде всё работает, только вот не могу сделать так чтобы запятую...

Нужно сделать чтобы можно было управлять типом возвращаемого значения функции
// avg_function.cpp: определяет точку входа для консольного приложения. #include &quot;stdafx.h&quot;...

Выручайте Нужно сделать так чтобы через HTML Можно было открыть прогу на Компе Это Возможно вобще?
Выручайте пожалуйста скажите можно сделать так, что через страницу HTML на компе открыть прогу, в...

9
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
16.09.2011, 15:32 2
Даже и не знаю зачем это надо, но в C# нет таких крутых макросов как на C++. Если сильно хочется писать функции без скобок (даже с параметрами), то переходите на VB.NET или F# - там оба варианта работают.

Как вариант можно привязать функции к событию, чтобы было что-то типа такого...
Пишем в коде:
C#
1
i = 5;
А в событии вызывается определенная функция.
Пишем в коде:
C#
1
i = 7;
Вызывается другая функция.
То есть организовать событие, которое будет срабатывать при изменении значения переменной и в соответствии с этим значением вызывать определенную функцию. Как-то так.

Цифры же можно заменить на значения перечисления и получится что-то типа:
C#
1
i = My.Func1;
Бред конечно.

P.S. Надеюсь не сильно сложно объяснил.
1
181 / 180 / 38
Регистрация: 16.06.2010
Сообщений: 511
16.09.2011, 15:47 3
Цитата Сообщение от Blood-Angel Посмотреть сообщение
То есть организовать событие, которое будет срабатывать при изменении значения переменной
можно пример?
0
Заблокирован
16.09.2011, 15:57  [ТС] 4
Цитата Сообщение от Blood-Angel Посмотреть сообщение
то переходите на VB.NET - там оба варианта работают.
На нем я тоже пишу и иногда там ставлю скобки, которые ему не нужны или ";",
а в C# забываю поставить.
Цитата Сообщение от Blood-Angel Посмотреть сообщение
То есть организовать событие, которое будет срабатывать при изменении значения переменной и в соответствии с этим значением вызывать определенную функцию.
А как организовать такое(не совсем подходит, но любопытно)?
Цитата Сообщение от Blood-Angel Посмотреть сообщение
Даже и не знаю зачем это надо
Пригодится.
0
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
16.09.2011, 16:37 5
Ой~, мне даже стыдно код показывать.
(Пример ниже для вызова двух функций, можно и больше дописать или заставить их вызываться с определенными параметрами)

Наше перечисление
C#
1
2
3
4
5
enum My
{
    Func1,
    Func2
}

Аргумент для события
C#
1
2
3
4
5
6
7
8
9
class CallFunctionArgs : EventArgs
{
    public CallFunctionArgs(My number)
    {
        this.Number = number;
    }
 
    public My Number { get; private set; }
}

Наш класс
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
class SomeClass
{
    // Событие для вызова нужной функции (в принципе в данном случае можно обойтись и без него вообще)
    public event EventHandler<CallFunctionArgs> CallFunction;
 
    public SomeClass()
    {
        // В конструкторе сразу привязываем функцию ChangeValue, которая вызывает определенную функцию.
        this.CallFunction += new EventHandler<CallFunctionArgs>(ChangeValue);
    }
    public SomeClass(My number)
        : base()
    {
        ChangeValue(this, new CallFunctionArgs(number));
    }
 
    // Собственно здесь происходит сам вызов нужной функции.
    public void ChangeValue(object sender, CallFunctionArgs e)
    {
        switch (e.Number)
        {
            case My.Func1: Function1(); break;
            case My.Func2: Function2(); break;
        }
    }
 
    // Некоторые функции:
    private void Function1()
    {
        Console.WriteLine("Function #1");
    }
    private void Function2()
    {
        Console.WriteLine("Function #2");
    }
 
    public static implicit operator SomeClass(My number)
    {
        return new SomeClass(number);
    }
}

Использование
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
 
class Program
{
    static void Main()
    {
        SomeClass i = new SomeClass();
        i = My.Func1;
        i = My.Func2;
        i = My.Func1;
        i = My.Func2;
    }
}


В принципе написал такой код, что событие здесь и не нужно, но если дальше развивать эту "идею", то оно может и понадобится. Да и сам класс SomeClass у меня как болванка, которая не несет смысла - в идеале так не должно быть.
1
Заблокирован
16.09.2011, 19:22  [ТС] 6
Blood-Angel, спасибо, немного позже разберусь(в пятницу отдыхаю).

Но все-же возникли вопросы(я не считаю себя экспертом ни в одном языке, поэтому задаю тупые вопросы для уточнения и для достижения цели):...

Пожалуйста, не открепляйтесь от темы, я немного позже их задам(тоже интересно, например, как в перечисление впихнуть функции и т.д.).
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
16.09.2011, 19:45 7
Лучший ответ Сообщение было отмечено как решение

Решение

Можно это дело упростить если вопрос стоял "Можно ли вообще хоть как-то"
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public class MyClass
    {
        private event EventHandler Handler;
 
        public MyClass(EventHandler funk)
        {
            Handler += funk;
        }
 
        public int Value 
        {
            get
            {
                Handler(this, EventArgs.Empty);
                return 0;
            }
            set { Handler(this, EventArgs.Empty); }
        }
    }
C#
1
2
3
4
5
6
7
        static void Main()
        {
            MyClass ff = new MyClass((s, e) => Console.WriteLine("hello"));
            int a = ff.Value; //как по факту, метод вызывается без скобок
            ff.Value = 123;
            Console.ReadLine();
        }
1
Заблокирован
16.09.2011, 20:17  [ТС] 8
m0nax, у меня нет 4.0 фреймворка(ну здесь концепция типа как у майкрософт, на старом ПО прогать новые стандарты).

Просто хотелось обойти стандарты(скобки и ";", а потом обфусцировать).
И запутать противника до "хочу-но немогу".

Информация ведь не помешает для будущего, не так ли?.
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
16.09.2011, 20:55 9
а чего 4.0 фреймворк, он же тут не нужен, это же лямбда выражение - от версии дотнета не зависит (ток от версии языка, а это не проблема)
Можно и обычным способом
C#
1
2
3
4
5
6
7
8
9
10
11
12
        static void Main()
        {
            MyClass ff = new MyClass(PrintHello);
            int a = ff.Value; 
            ff.Value = 123;
            Console.ReadLine();
        }
 
        private static void PrintHello(object sender, EventArgs e)
        {
            Console.WriteLine("hello");
        }
Вообще идея хорошая на счет обусфакции, если заворачивать методы в такие классы потом без пол литра не разобрать точно )
1
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
16.09.2011, 21:57 10
Цитата Сообщение от m0nax Посмотреть сообщение
Вообще идея хорошая на счет обусфакции, если заворачивать методы в такие классы потом без пол литра не разобрать точно )
А я думал это одному мне в голову лезут такие извращения с кодом.
1
16.09.2011, 21:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2011, 21:57
Помогаю со студенческими работами здесь

Можно ли сделать, чтобы в ключевых полях можно было писать одинаковые значения?
Можно ли как то сделать что бы в ключевых полях можно было писать одинаковые значения ?

Можно ли сделать, чтобы в программе можно было в компоненте listview1 писать в ячейки текст
Можно ли сделать, чтобы в программе можно было в компоненте listview1 писать\изменять в ячейках...

Как сделать так, чтобы после нажатия кнопки можно было щелкнуть мышкой в PictureBox и там бы нарисовался круг?
В общем, допустим, что есть Button1 - добавить круг, PictureBoх, в котором этот круг рисуется и...

Как сделать, чтобы можно было писать нормально (на русском) в Code::Blocks?
как сделать так чтоб можно было писать нормально(на русском) в code block

Можно ли сделать так, чтобы Panel можно было бы передвигать по форме мышкой?
Можно ли сделать так, чтобы Panel можно было бы передвигать по форме мышкой?

Можно ли сделать так чтобы к классу можно было бы одновременно обращаться как к массиву
подскажите можно ли сделать так чтобы к классу можно было бы одновременно обращаться как к массиву?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru