c# – 为什么不内联一个等效于明确声明它的方法?
编程中你有盲点吗?
我的意思是有一种常见的技术或语言功能,你不能真正习惯. 那么什么是代表? 由于我在大学的课程向我介绍了C,我知道函数指针. 一个具体的场景? 我想删除与regular expression匹配的文本文件中的任何行. 这里有代码吗? 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需要一个委托谓词< string>匹配作为参数. 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(字符串,字符串)的效率遵循Jon’s hint我修改了我的代码: 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)如何帮助学习. 解决方法
您正在尝试使用具有以下签名的方法:
bool DoesLineMatch(string line,string pattern) 对于有签名的代表: bool Predicate(string value) 从哪里获得第二个字符串值(模式)? 使用显式声明的方法执行此操作的唯一方法是这样的: public sealed class RegexHolder { private readonly string pattern; public RegexHolder(string pattern) { this.pattern = pattern; } public bool DoesLineMatch(string line) { return Regex.IsMatch(line,pattern); } } 然后: public static int RemoveLinesFromFile(string path,string pattern) { List<string> lines = new List<string>(File.ReadAllLines(path)); RegexHolder holder = new RegexHolder(pattern); int result = lines.RemoveAll(holder.DoesLineMatch); File.WriteAllLines(path,lines.ToArray()); return result; } 这与编译器使用匿名方法为您做的很接近 – 它将创建一个嵌套类来保存捕获的变量(在这种情况下为模式). (注意,我已经避免讨论调用Regex.Match(字符串,字符串)的效率而不是创建Regex的单个实例……这是另一回事.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |