Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这个程序中要改变什么才能产生好的输出?_C# - Fatal编程技术网

C# 在这个程序中要改变什么才能产生好的输出?

C# 在这个程序中要改变什么才能产生好的输出?,c#,C#,下面的代码取自我正在学习的那本书,他们说输出的后半部分应该是大写的,多亏了OnCarEngineEvent2。然而,当我编译程序时,情况并非如此。为什么它不起作用,需要改变什么?谢谢 public class Car { // Internal state data. public int CurrentSpeed { get; set; } public int MaxSpeed { get; set; } public string PetName { get; set; } // Is

下面的代码取自我正在学习的那本书,他们说输出的后半部分应该是大写的,多亏了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
}
公车
{
//内部状态数据。
public int CurrentSpeed{get;set;}
public int MaxSpeed{get;set;}
公共字符串PetName{get;set;}
//这辆车是活的还是死的?
私人布尔卡里斯代德酒店;
//类构造函数。
公共汽车(){MaxSpeed=100;}
公共汽车(字符串名称,int-maxSp,int-currSp)
{
当前速度=当前速度;
MaxSpeed=maxSp;
PetName=名称;
}
//1)定义委托类型。
公共委托void CarEngineHandler(字符串msgForCaller);
//2)定义此委托的成员变量。
私人CarEngineHandler Handler列表;
//3)为调用者添加注册功能。
带有CARENGINE的公共无效注册表(CARENGINEHADLER METHOLTOCALL)
{
//listOfHandlers=methodToCall;
//处理程序列表+=方法调用;
//处理程序列表+=方法调用;
if(listofHandler==null)
listOfHandlers=methodToCall;
其他的
组合(处理程序列表、方法调用);
}
//4)实现Accelerate()方法以调用委托的
//正确情况下的调用列表。
公共空间加速(int delta)
{
//如果这辆车“死了”,发送死消息。
国际单项体育联合会(加勒比地区)
{
if(listofHandler!=null)
司机名单(“对不起,这辆车死了……”);
}
其他的
{
电流速度+=增量;
//这辆车“快死了”吗?
如果(10==(最大速度-当前速度)
&&ListOfHandler!=null)
{
手柄列表(“小心伙计!要吹了!”);
}
如果(当前速度>=最大速度)
carIsDead=正确;
其他的
WriteLine(“CurrentSpeed={0}”,CurrentSpeed);
}
}
}
班级计划
{
静态void Main(字符串[]参数)
{
Console.WriteLine(“******委托作为事件启用码******\n”);
//首先,制作一个汽车物体。
汽车c1=新车(“斯拉格巴格”,100,10);
c1.带有CARENGINE的注册表(新车.CARENGINE处理程序(OnCarEngineEvent));
//这次,按住委托对象,
//这样我们以后就可以注销了。
Car.CarEngineHandler handler2=新车.CarEngineHandler(OnCarEngineEvent2);
c1.带有CARENGINE(手柄2)的登记器;
//加速(这将触发事件)。
Console.WriteLine(“*******加速*******”);
对于(int i=0;i<6;i++)
c1.加速(20);
//我们将不再看到“大写”消息!
Console.WriteLine(“*******加速*******”);
对于(int i=0;i<6;i++)
c1.加速(20);
Console.ReadLine();
}
#区域代表目标
//我们现在有两个方法将由汽车调用
//发送通知时。
公共静态void OnCarEngineEvent(字符串msg)
{
Console.WriteLine(“\n****来自Car对象的消息*******”);
Console.WriteLine(“=>{0}”,msg);
Console.WriteLine(“******************************************************\n”);
}
公共静态void OnCarEngineEvent2(字符串msg)
{
WriteLine(“=>{0}”,msg.ToUpper());
}
#端区
}

这是因为您的
注册表使用了CAREngine
方法。当前,如果已附加事件处理程序,则可以调用
Delegate.Combine(处理程序列表,方法调用)
,但不更新处理程序列表

使用
ListOfHandler+=(CarEngineHandler)委托。组合(ListOfHandler,methodToCall)

这也可以简化为:

 // 3) Add registration function for the caller.
public void RegisterWithCarEngine(CarEngineHandler methodToCall)
{
    listOfHandlers += methodToCall;
}
但是请记住,这不会分离上一个处理程序,因此您将同时显示小写和大写。

如果(listofHandler==null)
public void RegisterWithCarEngine(CarEngineHandler methodToCall)
{
    if (listOfHandlers == null)
        listOfHandlers = methodToCall;
    else
        listOfHandlers += (CarEngineHandler)Delegate.Combine(listOfHandlers, methodToCall);
}
listOfHandlers=methodToCall; 其他的 ListOfHandler=(CarEngineHandler)Delegate.Combine(ListOfHandler,methodToCall);
//在上下文中使用+=会更好;)

什么东西不管用?请先说明问题的原因,以帮助我们缩小问题的范围。@AntonieBlom最后6条消息“汽车已死亡”应该是大写的,其他消息(如ebyrob)说我“想知道为什么只调用一个事件处理程序,而不是如何修改代码以输出大写”。所以这个答案对我没有帮助:(@user1968256抱歉,我认为这很清楚。我会尽量解释得更清楚:当你尝试附加第二个处理程序时,你实际上什么都不做,因为你没有考虑委托的结果。合并考虑。所以你没有附加第二个处理程序,所以它永远不会被调用。嗯……我不认为将
+=
更改为
=
将允许事件handler/delegate连接,考虑到
delegate
如何定义它的操作符。我测试它;)所以不要证明它;{if(listOfHandlers==null)listOfHandlers=methodToCall;else listOfHandlers=(CarEngineHandler)delegate.Combine(listOfHandlers,methodToCall);}与listOfHandles+=methodToCall相同;将“+=”更改为“=”修复具有重复的处理程序列表的错误:其中处理程序的结果列表:为{listOfHandlers+=listOfHandlers;listOfHandlers+=methodToCall},但需要处理程序列表+=methodToCall;)然后,请用ing将这些解释添加到答案中;评论不是永久性的。