2016-12-31 4 views
0

Пусть говорят, у меня есть класс Studentделегат должен быть перед основным методом

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, я могу поместить его в основной метод, del2 также является делегатом, почему я не могу его также включить в основной метод?

  2. Почему метод проверки должен быть статическим?

+0

Это объявление типа. Так же, как объявление структуры или класса. Синтаксис C# требует, чтобы объявления типа не отображались внутри тела метода. Перемещение его * после * метода Main() отлично, просто не внутри. –

ответ

0

Короткий ответ:

Вы должны объявить делегат и предикат, как это сделано в документах MSDN, потому что от курса вы должны.

Длинный ответ:

  1. Вы не должны поместить этот делегат перед главным. Вы просто не можете поместить его в Main. Это объявление типа. И этот тип (делегат с определенной подписью, который вы указали) предназначен для использования в качестве параметров. Вещи, которые вы объявляете в основном, или любой другой метод будет действительным только в области этого метода. Даже если вы можете объявить делегата в методе, подпись не будет определена (и узнаваема) в другом месте, и это было бы бесполезно.

  2. На самом деле метод, назначенный для предиката, не обязательно должен быть статичным, он должен быть там, когда вы его назначаете. Статические функции доступны без создания экземпляра их класса. Они не зависят от объектов этого класса. Нестатические методы принадлежат их объектам, и они специфичны для их объектов. Их конкретный объектный код создается с созданием объекта. Таким образом, вы можете использовать нестатистическую функцию, если у нее есть доступный объект. Скажем, класс Student имеет нестатический метод проверки. Вы можете сделать это:

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

Благодарим вас за ответ. так ясно. Не могли бы вы также ответить на этот вопрос для меня: http: //stackoverflow.com/questions/41404219/multiple-class-inheritance-implication – grooveline

Смежные вопросы