C# 在C中使用多播委托的意外输出#

C# 在C中使用多播委托的意外输出#,c#,.net,c#-4.0,c#-3.0,C#,.net,C# 4.0,C# 3.0,下面是我在C#中的代码,如果您查看附加的输出,会调用“删除空格”方法,但输出不会真正删除句子中的空格,我不明白为什么?任何有关这方面的帮助都将不胜感激。谢谢 //using delegates for multicasting using System; //declare a delegate type delegate void StrMod(ref string str); class StringFunctions { static void ReplaceSpaces(ref st

下面是我在C#中的代码,如果您查看附加的输出,会调用“删除空格”方法,但输出不会真正删除句子中的空格,我不明白为什么?任何有关这方面的帮助都将不胜感激。谢谢

//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();
}

}

//使用委托进行多播
使用制度;
//声明委托类型
委托无效StrMod(参考字符串str);
类字符串函数
{
静态void replaceSpace(参考字符串str)
{
控制台。写入线(“替换”);
str=str.Replace('',-');
}
静态void removespace(参考字符串a)
{
字符串temp=“”;
控制台写入线(“删除空格”);
for(int i=0;i=0;i--,j++)
temp+=str[i];
str=温度;
}
公共静态void Main()
{
//构建代理
斯特罗普;
StrMod replace=replaceSpace;
StrMod remove=removespace;
StrMod reverse=反向;
string str=“这是一个测试”;
//设置多播
strOp=更换;
strOp+=反向;
//调用多播
strOp(ref-str);
Console.WriteLine(“结果字符串:+str”);
Console.WriteLine();
strOp-=反向;
strOp+=移除;
str=“这是一个测试”;//重置
strOp(ref-str);
Console.WriteLine(“结果字符串:+str”);
Console.WriteLine();
}
}

在最后的操作中,您可以使用多播代理调用
replaceSpace
removespace
ReplaceSpaces
首先发生,因此
RemoveSpaces
没有工作要做

将“删除空格”函数改为“删除破折号”函数,它的工作方式应该与预期的一样

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


EDIT2:这就是我在发布之前没有仔细检查的结果。

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

我在该输出中看不到任何空格!哎呀,我没想到!谢谢你的帮助:)@Neville请查看我刚刚添加的更新。执行依赖于执行顺序的多播委托只是自找麻烦。框架不保证
ReplaceSpaces
总是在
removedash
之前执行。在您的测试中,它可能总是工作得很好,但是您更新了.NET,突然程序的行为就不同了。这就是依赖“未定义的行为”的危险,Microsoft可以随意更改行为。@Neville Nevermind,添加和删除代理(如果使用
Delegate.Combine
,这是
+=
内部使用的)是定义良好的,将保持秩序。再次感谢您的建议!非常感谢!谢谢你的帮助!