Soru C #, temsilci olmayan yönteme yöntemi dönüştürebilir


Adında bir dersim var Pin.

public class Pin
{
    private string title;

    public Pin() { }

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

Başka bir sınıftan, bir List<Pin> pim ve diğerlerinden List pimlerini tekrarlamak ve öğeleri almak istiyorum. Yani bu koda sahibim.

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

Bu kodla başlığı alamıyorum. Niye ya?

(Not: ClassListPin sadece bazı elementleri içeren statik bir sınıf ve bunlardan biri, List<Pin> pimleri)


22
2018-02-14 14:45


Menşei


Çünkü onu araman gerekiyor, örneğin obj.getTitle() - leppie
Google'da arama yapmayı denedin mi? Bu oldukça yaygın yeni başlayanların hatası. - antonijn
Biraz konu dışı, ancak yazı yazmaçlarına ve alıcılarına karşı çıkmak için özellikler getirildi. Daha fazla bilgi için: msdn.microsoft.com/en-us/library/x9fsa0sw%28v=vs.80%29.aspx - Matthew
Bunun aptalca bir hata olduğunu itiraf ediyorum ... - gts13


Cevaplar:


Bir yöntem çağrısından sonra parantez eklemeniz gerekir, aksi takdirde derleyici, yöntemin kendisi hakkında konuştuğunuzu düşünür (bir temsilci türü), oysa aslında bu yöntemin dönüş değeri hakkında konuşuyorsunuzdur.

string t = obj.getTitle();

Ekstra Gerekli Olmayan Bilgiler

Ayrıca, özelliklerine bir göz atın. Bu şekilde, bir değişken gibi sanki başlık kullanabilirsiniz, içsel olarak, bir işlev gibi çalışır. Bu şekilde fonksiyon yazmanız gerekmiyor getTitle() ve setTitle(string value)ama bunu böyle yapabilirsin:

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

Ya da varsayılan olarak bunu kullanacak otomatik uygulanmış özellikleri kullanabilirsiniz:

public string Title { get; set; }

Ve kendi destek alanınızı yaratmanız gerekmeyecek (_title), derleyici kendisini yaratacaktır.

Ayrıca, mülk erişenler için erişim düzeylerini değiştirebilirsiniz (alıcılar ve ayarlayıcılar):

public string Title { get; private set; }

Özellikleri alanları gibi kullanıyorsunuz, yani:

this.Title = "Example";
string local = this.Title;

46
2018-02-14 14:47



aman tanrım ... çocukça bir hataydı! - gts13


getTitle bir işlev, bu yüzden koymanız gerekir () ondan sonra.

string t = obj.getTitle();

7
2018-02-14 14:47





@Antonijn'in belirttiği gibi, gerçekleştirmek parantez ekleyerek getTitle yöntemi:

 string t = obj.getTitle();

Ama eklemek istiyorum, C # içinde Java programlama yapıyorsun. Kavram var özellikleri Böyle durumlarda kullanılması gereken (get ve set yöntemleri çifti):

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

Ve hatta dahası, bu durumda derleyiciye yalnızca get ve set metodu oluşturma için değil, aynı zamanda geri depolama üretimi için de otomatik-impelement özellik kullanımı:

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

Ve şimdi gerek yok gerçekleştirmek yöntem, çünkü alanlar gibi kullanılan özellikler:

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

6
2018-02-14 14:51





Belirtildiği gibi kullanmanız gerekir obj.getTile()

Ancak, bu durumda, bir özellik.

public class Pin
{
    private string title;

    public Pin() { }

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

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

Bu kullanmanıza izin verecek

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

5
2018-02-14 14:51



Olmalı Title o zaman değil getTitle. - antonijn
Benim kötü, sabit. :) - eandersson


Sınıf kodunuzu aşağıdaki gibi basitleştirebilirsiniz ve olduğu gibi çalışacaktır, ancak örnek çalışmanızı yapmak istiyorsanız, sonunda parantez ekleyin: string x = getTitle ();

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

4
2018-02-14 14:53





Çünkü getTitle değil string, bir referans verir veya delegate açık bir şekilde değilseniz, bir yönteme (isterseniz) aramak yöntem.

Bu şekilde yönteminizi arayın:

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

Ancak, bu işe yarar:

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();`

3
2018-02-14 14:46





Yöntemi argüman almasa bile, parantez eklemeniz gereken bir yöntemi çalıştırmak için.

Bu yüzden olmalı:

string t = obj.getTitle();

2
2018-02-14 14:47