Проблемы с логикой и синтаксисом делегатов и событий C # - PullRequest
0 голосов
/ 25 мая 2011

Как подсказывает мой код, я пытаюсь создать делегат, который будет указывать на метод StringBuff BuffString, который создает StringBuilder с достаточным количеством настроек и т. Д.

Моя проблемазаключается в том, что по какой-то причине, независимо от того, что я пытаюсь сделать, я не могу передать ссылку на класс StringBuff, который я сделал в своем классе Sprite, конструктору делегата без получения ошибки.Кроме того, я чувствую, что создание события может быть полезным для инициации делегата.

Основная проблема заключается в том, что я сейчас едва понимаю эти две концепции, а также то, как их использовать в качестве замены для указателей на функции, которые разрешены в других языках программирования.

Если у кого-нибудь есть идеи о том, что мне нужно сделать, чтобы сделать эту работу, я определенно буду благодарен.

Вот код:

public class StringBuff
        {
            private static StringBuilder stringBuffer = new StringBuilder();

            public static StringBuilder BuffString(string _string) //--may possibly have to use IntPtr to reference stringBuffer here. 
            //This is the equivalent to the "strbuff_new" C++ method variant, designed to update the stringBuffer.
            {
                int iCounter = 0;

                stringBuffer.Append(_string + " ");

                iCounter += _string.Length + 1;

                if (iCounter == stringBuffer.Capacity - 1)
                {
                    stringBuffer.Capacity += stringBuffer.Capacity; 
                }

                return stringBuffer;
            }
        }

        public delegate void UpdateStringBuffer(StringBuff sender);

        public class Sprite : SpriteInterface.ISprite
        {
            private StringBuff stringBuff = new StringBuff();

            public event UpdateStringBuffer stringBuffEvent
            {
                add
                {
                    Console.WriteLine("Adding");
                    stringBuffEvent += value;
                }
                remove
                {
                    Console.WriteLine("Removing...");
                    stringBuffEvent -= value;
                }
            }

            static void Main()
            { 
                new Sprite().stringBuffEvent += new UpdateStringBuffer(stringBuff);
            }




        }

Ответы [ 4 ]

2 голосов
/ 25 мая 2011

Полагаю, вам нужно немного почитать. Обратитесь к следующему:

Учебное пособие

Введение в делегаты и мероприятия

Упрощенные мероприятия и делегаты

1 голос
/ 25 мая 2011

Вы неправильно понимаете использование событий и делегата.

Когда вы хотите добавить обработчик события к событию, вы передаете делегата того же типа, что и событие (что вы сделали правильно)
Но когда вы создаете делегат, то, что вы должны передать конструктору (большую часть времени), это Имя метода , а не какая-то переменная, поскольку делегат является своего рода указателем на (список)функции.

Я рекомендую вам прочитать больше о делегатах, как предложил Акрам Шахда, но сейчас я скажу вам, что метод, который вы должны передать в качестве параметра конструктору делегатов, должен иметь ту же сигнатуру - значит возвращатьто же значение и принять те же параметры.так, например, вы могли бы иметь:

// This method have the same signature as UpdateStringBufferDelegate
public void SomeMethod (StringBuff buff)  
{
    // Doing somthing here
}

И тогда вы можете сделать в своем основном:

// Passing method's name and not a variable!!
new Sprite().stringBuffEvent += new UpdateStringBuffer(SomeMethod);

Параметры Actuall, которые будут переданы только самой функции (некоторые StringBuff)определяется во время вызова события.
Вы должны прочитать об этом подробнее.

Удачи!

0 голосов
/ 25 мая 2011

1 - Конструктор делегата может иметь только параметр Method. Ex

public delegate void UpdateStringBuffer(StringBuff sender);

2 - Вы можете объявить событие ur и добавить метод для определения метода ur в вашем классе Splite. Пример:

public event UpdateStringBuffer stringBuffEvent;

public ProcessUpdateStringBuffer(UpdateStringBuffer yourMethod)
{
       stringBuffEvent += yourMethod
}

3 - и вы можете определить свой метод для события и вызвать его следующим образом:

Sprite sprite = new Sprite();
sprite.ProcessUpdateStringBuffer(UpdateStringBuffer(urMethod));
sprite.stringBuffEvent(ur parameters);
0 голосов
/ 25 мая 2011

вы делаете это неправильно,

 new Sprite().stringBuffEvent += new UpdateStringBuffer(stringBuff);

Указанный выше код недействителен по следующим причинам.

1. stringBuff, который принимает ваш UpdateStringBuffer, является экземпляром StringBuff в Sprite.

2. Вы получаете доступ к stringBuff из статического метода Main, который не имеет представления о stringBuff, где он находится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...