2016-12-31 11 views
0

レッツは、私が学生のクラスデリゲートは、私は2つの質問を持っている方法

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は述語デリゲートです。メインメソッドの中に置くこともできます。また、del2もデリゲートです。なぜ、メインメソッド内にも置くことができないのですか?

  2. なぜチェックメソッドは静的でなければならないのですか?

+0

それは型宣言です:あなたはこれを行うことができます。構造体宣言やクラス宣言のように。 C#の構文では、型宣言はメソッド本体の中には現れません。 Main()メソッドを*後に移動すると、内部だけでなく、うまくいきます。 –

答えて

0

短い答え:

オフコースあなたが必要があるので、それは、MSDNドキュメントで行われているようにあなたは、デリゲートと述語を宣言する必要があります。

ロング回答:

  1. あなたは主の前にそのデリゲートを配置する必要はありません。 Mainの中に入れることはできません。これは型宣言です。そして、そのタイプ(あなたが宣言した特定の署名を持つDelegate)は、関数をパラメータとして渡すために使用されることを意図しています。メインで宣言したもの、または他のメソッドは、そのメソッドのスコープ内でのみ有効です。あるメソッドでデリゲートを宣言することができたとしても、そのシグネチャは他の場所では定義されず、認識できません。これは役に立たないでしょう。

  2. 実際には、述語に割り当てられたメソッドは静的である必要はなく、割り当てられたときにはそこに存在する必要があります。静的関数は、そのクラスのインスタンスを作成せずに使用できます。それらはそのクラスのオブジェクトから独立しています。非静的メソッドはオブジェクトに属し、オブジェクトに固有です。それらの特定のオブジェクトコードは、オブジェクト作成で作成されます。利用可能なオブジェクトがあれば、非静的な関数を使うことができます。 Studentクラスに非静的なチェックメソッドがあるとします。

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

あなたの答えをありがとう。とても澄んでいる。また、私のためにこの質問に答えることができます:http://stackoverflow.com/questions/41404219/multiple-class-inheritance-implication – grooveline

関連する問題