40

というクラスがありPinます。

public class Pin
{
    private string title;

    public Pin() { }

    public setTitle(string title) {
        this.title = title;
    }
    public String getTitle()
    {
        return title;
    }
}

別のクラスからピンにPinsオブジェクトを追加し、別のクラスからList<Pin>リストピンを繰り返して要素を取得したいと思います。だから私はこのコードを持っています。

foreach (Pin obj in ClassListPin.pins)
{
     string t = obj.getTitle;
}

このコードでは、タイトルを取得できません。なんで?

(注:ClassListPinはいくつかの要素を含む単なる静的クラスであり、そのうちの1つはList<Pin>ピンです)

4

7 に答える 7

68

メソッド呼び出しの後に括弧を追加する必要があります。そうしないと、コンパイラはメソッド自体(デリゲート型)について話していると見なしますが、実際にはそのメソッドの戻り値について話していることになります。

string t = obj.getTitle();

追加の非必須情報

また、プロパティを見てください。そうすれば、タイトルを変数のように使用できますが、内部的には関数のように機能します。getTitle()そうすれば、関数とを書く必要はありませんが、次のsetTitle(string value)ように行うことができます。

public string Title // Note: public fields, methods and properties use PascalCasing
{
    get // This replaces your getTitle method
    {
        return _title; // Where _title is a field somewhere
    }
    set // And this replaces your setTitle method
    {
        _title = value; // value behaves like a method parameter
    }
}

または、自動実装されたプロパティを使用することもできます。これは、デフォルトでこれを使用します。

public string Title { get; set; }

また、独自のバッキングフィールド(_title)を作成する必要はなく、コンパイラがそれ自体を作成します。

また、プロパティアクセサー(ゲッターとセッター)のアクセスレベルを変更できます。

public string Title { get; private set; }

プロパティをフィールドであるかのように使用します。つまり、次のようになります。

this.Title = "Example";
string local = this.Title;
于 2013-02-14T14:47:00.933 に答える
7

getTitleは関数なので、後から置く必要があります()

string t = obj.getTitle();
于 2013-02-14T14:47:30.480 に答える
7

@Antonijnが述べたように、括弧を追加してgetTitleメソッドを実行する必要があります。

 string t = obj.getTitle();

ただし、C#でJavaプログラミングを行っていることを付け加えておきます。このような場合に使用する必要があるプロパティ(getメソッドとsetメソッドのペア)の概念があります。

public class Pin
{
    private string _title;

    // you don't need to define empty constructor
    // public Pin() { }

    public string Title 
    {
        get { return _title; }
        set { _title = value; }
    }  
}

さらに、この場合、自動実装プロパティの使用を介して、getメソッドとsetメソッドの生成だけでなく、バ​​ックストレージの生成もコンパイラに要求できます。

public class Pin
{
    public string Title { get; set; }
}

そして今、あなたはメソッドを実行する必要はありません、なぜならプロパティはフィールドのように使われるからです:

foreach (Pin obj in ClassListPin.pins)
{
     string t = obj.Title;
}
于 2013-02-14T14:51:40.643 に答える
5

前述のように、使用する必要がありますobj.getTile()

しかし、この場合、あなたはプロパティを使用しようとしていると思います。

public class Pin
{
    private string title;

    public Pin() { }

    public setTitle(string title) {
        this.title = title;
    }

    public String Title
    {
        get { return title; }
    }
}

これにより、

foreach (Pin obj in ClassListPin.pins)
{
     string t = obj.Title;
}
于 2013-02-14T14:51:20.407 に答える
5

以下のようにクラスコードを簡略化すると、そのまま機能しますが、例を機能させたい場合は、最後に括弧を追加します。string x = getTitle();

public class Pin
{
   public string Title { get; set;}
}
于 2013-02-14T14:53:48.627 に答える
3

getTitleはではないため、メソッドを明示的に呼び出さない場合stringは、参照またはメソッドへの参照(必要に応じて)を返します。delegate

次のようにメソッドを呼び出します。

string t= obj.getTitle() ; //obj.getTitle()  says return the title string object

ただし、これは機能します。

Func<string> method = obj.getTitle; // this compiles to a delegate and points to the method

string s = method();//call the delegate or using this syntax `method.Invoke();`
于 2013-02-14T14:46:59.187 に答える
2

メソッドを実行するには、メソッドが引数を取らない場合でも、括弧を追加する必要があります。

したがって、次のようになります。

string t = obj.getTitle();
于 2013-02-14T14:47:30.520 に答える