代表必须在main?方法之前

时间:2016-12-31 08:00:56

标签: c# delegates

假设我有一个学生班

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";
   }
}

我有两个问题:

  1. 为什么我必须在主方法之前放置del2? del1是一个Predicate委托,我可以把它放在main方法中,del2也是一个委托,为什么我也不能把它放在main方法中呢?

  2. 为什么检查方法必须是静态的?

1 个答案:

答案 0 :(得分:1)

简短回答:

你应该在MSDN文档中声明委托和谓词,因为你当然应该这样做。

长答案:

  1. 您不必将该委托放在Main之前。你不能把它放在Main里面。这是一种类型声明。并且该类型(具有您声明的特定签名的委托)用于将函数作为参数传递。您在main中声明的内容或任何其他方法仅在该方法的范围内有效。即使您可以在方法中声明委托,也不会在其他任何地方定义(并且可识别)签名,这将是无用的。

  2. 实际上,您为Predicate指定的方法不必是静态的,只需在分配时就必须存在。静态函数可用,无需创建其类的实例。它们独立于该类的对象。非静态方法属于它们的对象,它们特定于它们的对象。它们的特定目标代码是使用对象创建创建的。因此,如果可用对象具有非静态函数,则可以使用非静态函数。假设Student类具有非静态检查方法。你可以这样做:

    Student s2= new Student();
    Predicate<Student> del1 = s2.check;