0

次のコードは、私が研究している本から抜粋したもので、OnCarEngineEvent2のおかげで、出力の後半は大文字にする必要があると言われています。しかし、私がプログラムをコンパイルしたとき、そうではありませんでした。なぜそれが機能しないのですか、そして何を変更する必要がありますか?ありがとう。

public class Car
{
// Internal state data.
public int CurrentSpeed { get; set; }
public int MaxSpeed { get; set; }
public string PetName { get; set; }

// Is the car alive or dead?
private bool carIsDead;

// Class constructors.
public Car() { MaxSpeed = 100; }
public Car(string name, int maxSp, int currSp)
{
    CurrentSpeed = currSp;
    MaxSpeed = maxSp;
    PetName = name;
}


// 1) Define a delegate type.
public delegate void CarEngineHandler(string msgForCaller);

// 2) Define a member variable of this delegate.
private CarEngineHandler listOfHandlers;

// 3) Add registration function for the caller.
public void RegisterWithCarEngine(CarEngineHandler methodToCall)
{
    // listOfHandlers = methodToCall;
    // listOfHandlers += methodToCall; 
    // listOfHandlers += methodToCall; 
    if (listOfHandlers == null)
        listOfHandlers = methodToCall;
    else
        Delegate.Combine(listOfHandlers, methodToCall);
}


// 4) Implement the Accelerate() method to invoke the delegate’s 
//    invocation list under the correct circumstances.
public void Accelerate(int delta)
{
    // If this car is 'dead', send dead message.
    if (carIsDead)
    {
        if (listOfHandlers != null)
            listOfHandlers("Sorry, this car is dead...");
    }
    else
    {
        CurrentSpeed += delta;

        // Is this car 'almost dead'?
        if (10 == (MaxSpeed - CurrentSpeed)
            && listOfHandlers != null)
        {
            listOfHandlers("Careful buddy!  Gonna blow!");
        }

        if (CurrentSpeed >= MaxSpeed)
            carIsDead = true;
        else
            Console.WriteLine("CurrentSpeed = {0}", CurrentSpeed);
    }
}

}


class Program
{
    static void Main( string[] args )
    {
        Console.WriteLine("***** Delegates as event enablers *****\n");

        // First, make a Car object.
        Car c1 = new Car("SlugBug", 100, 10);
        c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent));

        // This time, hold onto the delegate object,
        // so we can unregister later. 
        Car.CarEngineHandler handler2 = new Car.CarEngineHandler(OnCarEngineEvent2);
        c1.RegisterWithCarEngine(handler2);

        // Speed up (this will trigger the events).
        Console.WriteLine("***** Speeding up *****");
        for (int i = 0; i < 6; i++)
            c1.Accelerate(20);

        // We won't see the 'uppercase' message anymore!
        Console.WriteLine("***** Speeding up *****");
        for (int i = 0; i < 6; i++)
            c1.Accelerate(20);

        Console.ReadLine();
    }

    #region Delegate targets
    // We now have TWO methods that will be called by the Car
    // when sending notifications. 
    public static void OnCarEngineEvent( string msg )
    {
        Console.WriteLine("\n***** Message From Car Object *****");
        Console.WriteLine("=> {0}", msg);
        Console.WriteLine("***********************************\n");
    }

    public static void OnCarEngineEvent2( string msg )
    {
        Console.WriteLine("=> {0}", msg.ToUpper());
    }
    #endregion
}
4

3 に答える 3

2

それはあなたのRegisterWithCarEngine方法によるものです。現在、イベントハンドラーが既にアタッチされている場合は、呼び出しDelegate.Combine(listOfHandlers, methodToCall)ますが、更新はしませんlistOfHandlers

使用するlistOfHandlers += (CarEngineHandler)Delegate.Combine(listOfHandlers, methodToCall);

これは、次のように簡略化することもできます。

 // 3) Add registration function for the caller.
public void RegisterWithCarEngine(CarEngineHandler methodToCall)
{
    listOfHandlers += methodToCall;
}

ただし、これは前のハンドラーを切り離さないため、小文字と大文字の両方を表示することに注意してください。

于 2013-01-15T16:18:03.100 に答える
0
public void RegisterWithCarEngine(CarEngineHandler methodToCall)
{
    if (listOfHandlers == null)
        listOfHandlers = methodToCall;
    else
        listOfHandlers += (CarEngineHandler)Delegate.Combine(listOfHandlers, methodToCall);
}
于 2013-01-15T16:23:22.867 に答える
-2

if(listOfHandlers == null)listOfHandlers = methodToCall; else listOfHandlers =(CarEngineHandler)Delegate.Combine(listOfHandlers、methodToCall); //コンテキストで+=よりも良いでしょう;)

于 2015-03-29T23:10:37.723 に答える