【问题标题】:Unexpected output using Multicast Delegates in C# [closed]在 C# 中使用多播委托的意外输出 [关闭]
【发布时间】:2014-06-01 16:17:24
【问题描述】:

下面是我在 C# 中的代码,如果您查看附加的输出,会调用“Removing Spaces”方法,但输出并没有真正删除句子中的空格,我想不通为什么?对此的任何帮助将不胜感激。谢谢!

//using delegates for multicasting
using System;

//declare a delegate type
delegate void StrMod(ref string str);

class StringFunctions
{
static void ReplaceSpaces(ref string str)
{
    Console.WriteLine("Replacing");
    str = str.Replace(' ', '-');
}

static void RemoveSpaces(ref string a)
{
    string temp = "";

    Console.WriteLine("Removing spaces");
    for (int i = 0; i < a.Length; i++)
        if (a[i] != ' ') temp += a[i];

    a = temp;
}

static void Reverse(ref string str)
{
    string temp = "";

    Console.WriteLine("Reversing");
    for (int j = 0, i = str.Length - 1; i >= 0; i--, j++)
        temp += str[i];

    str = temp;
}


public static void Main()
{
    //construct the delegates
    StrMod strOp;
    StrMod replace = ReplaceSpaces;
    StrMod remove = RemoveSpaces;
    StrMod reverse = Reverse;

    string str = "this is a test";

    //setting the multicast
    strOp = replace;
    strOp += reverse;

    //invoke the multicast
    strOp(ref str);
    Console.WriteLine("Resultant string : " + str);
    Console.WriteLine();

    strOp -= reverse;
    strOp += remove;

    str = "This is a test"; //reset

    strOp(ref str);
    Console.WriteLine("Resultant string : " + str);
    Console.WriteLine();
}

}

【问题讨论】:

  • 我在该输出中看不到任何空格!

标签: c# .net c#-4.0 c#-3.0


【解决方案1】:

在最后的操作中,您使用多播委托同时调用 ReplaceSpacesRemoveSpacesReplaceSpaces 首先发生,所以 RemoveSpaces 没有工作要做。

将您的“删除空格”功能转换为“删除破折号”功能,它应该会像您期望的那样工作。

编辑:您可能需要注意一个问题,我认为多播委托中不能保证执行顺序。如果您正在做的事情依赖于先前执行的委托,那么执行顺序可能会随着项目的添加和从多播委托中删除而以意想不到的方式发生变化。

EDIT2:Nevermind. 这是我在发帖前没有仔细检查的结果。

【讨论】:

  • 哎呀,这并没有打动我!感谢您的帮助:)
  • @Neville 请查看我刚刚添加的更新。执行依赖于执行顺序的多播委托只是自找麻烦。框架不保证ReplaceSpaces 总是在RemoveDashes 之前执行。它可能在您的测试中总是可以正常工作,但是您更新了 .NET,突然程序的行为有所不同。那就是依赖“未定义行为”的危险,微软可以随意改变行为。
  • 再次感谢您的建议!非常感谢!
【解决方案2】:

它不会删除任何空格,因为没有空格。在调用RemoveSpaces 方法之前,您已经用- 更改了所有空格。

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 2010-09-27
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多