你有编程盲点吗?
我的意思是有一个你无法真正习惯的通用技术或语言功能。好吧,我有一个(或者可能不止一个),而我的是使用delegate
. 举手!还有谁对代表不满意?说实话!
那么什么是委托人?
由于我在大学的课程向我介绍了 C,我知道函数指针。如果您想将方法作为参数传递,函数指针很方便。所以在我看来,委托就像一个函数指针。尤里卡!我得到了它。我没有!
一个具体的场景?
我想从与正则表达式匹配的文本文件中删除任何行。假设我有一系列线条,List<T>
有一种RemoveAll
似乎非常适合该目的的方法。
RemoveAll
期望评估方法作为决定是否删除或离开列表元素的参数。它就是:函数指针!
这里有代码吗?
public static int RemoveLinesFromFile(string path, string pattern)
{
List<string> lines = new List<string>(File.ReadAllLines(path));
int result = lines.RemoveAll(DoesLineMatch);
File.WriteAllLines(path, lines.ToArray());
return result;
}
所以我正在寻找一个函数DoesLineMatch
来评估一行是否匹配一个模式。
你看到问题了吗?
RemoveAll
期望一个委托Predicate<string> match
作为参数。我会这样编码:
private static bool DoesLineMatch(string line, string pattern)
{
return Regex.IsMatch(line, pattern);
}
但是后来我收到一个错误“期望一个带有'bool DoesLineMatch(string)'签名的方法”。我在这里想念什么?
它真的有效吗?
这就是我最终让它工作的方式:
public static int RemoveLinesFromFile(string path, string pattern)
{
List<string> lines = new List<string>(File.ReadAllLines(path));
int result = lines.RemoveAll(delegate(string line)
{
return Regex.IsMatch(line, pattern);
});
File.WriteAllLines(path, lines.ToArray());
return result;
}
我很高兴它有效,但我不明白。
问题是什么?
我所做的只是内联该方法。据我了解内联,它只是某种使用一次并销毁的代码。如果你只使用一次变量或方法,你可以内联它,但内联总是等同于显式声明它。
有没有办法明确声明该方法?我该怎么做?
PS.:请原谅我的问题有点冗长。
PPS.:一旦我得到这个委托,我就会从 2.0 飞跃到 3.0 并学习 lambdas。
PPPS .:按照乔恩关于效率的提示,Regex.IsMatch(string, string)
我修改了我的代码:
int result = lines.RemoveAll(delegate(string line)
{
Regex regex = new Regex(pattern);
return regex.IsMatch(line);
});
这对效率问题没有多大帮助。所以我按照ReSharper的建议,将 Regex 实例化移到了外部范围:
Regex regex = new Regex(pattern);
int result = lines.RemoveAll(delegate(string line)
{
return regex.IsMatch(line);
});
现在 ReSharper 敦促我用方法组替换它:
Regex regex = new Regex(pattern);
int result = lines.RemoveAll(regex.IsMatch);
这与此处提出的答案非常相似。不是我要求的,但我再次对 ReSharper(当然还有 Stack Overflow)如何帮助学习感到惊讶。