假设我有一个学生班
class Program
{
delegate bool del2(Student s); //I have to put this delegate before Main?
static void Main(string[] args)
{
List<Student> listStudent = new List<Student>()
{
... //adding student instances...
};
//delegate bool del2(Student s); Q1: why compile error if I put it here?
Predicate<Student> del1 = check;
Student s = listStudent.Find(del1);
Console.WriteLine("s is" + s.Name);
}
public static bool check(Student s) //Q2:why it need to be static method?
{
return s.Name == "Michael";
}
}
我有两个问题:
为什么我必须在主方法之前放置del2? del1是一个Predicate委托,我可以把它放在main方法中,del2也是一个委托,为什么我也不能把它放在main方法中呢?
为什么检查方法必须是静态的?
答案 0 :(得分:1)
简短回答:
你应该在MSDN文档中声明委托和谓词,因为你当然应该这样做。
长答案:
您不必将该委托放在Main之前。你不能把它放在Main里面。这是一种类型声明。并且该类型(具有您声明的特定签名的委托)用于将函数作为参数传递。您在main中声明的内容或任何其他方法仅在该方法的范围内有效。即使您可以在方法中声明委托,也不会在其他任何地方定义(并且可识别)签名,这将是无用的。
实际上,您为Predicate指定的方法不必是静态的,只需在分配时就必须存在。静态函数可用,无需创建其类的实例。它们独立于该类的对象。非静态方法属于它们的对象,它们特定于它们的对象。它们的特定目标代码是使用对象创建创建的。因此,如果可用对象具有非静态函数,则可以使用非静态函数。假设Student类具有非静态检查方法。你可以这样做:
Student s2= new Student();
Predicate<Student> del1 = s2.check;