c # сипатын баптаушы орган сынып деңгейіндегі сипат айнымалысын жарияламай

Мүлікті ұстап тұру үшін сынып деңгейіндегі айнымалы мәнді жариялауым керек пе немесе getter/setter ішіндегі self. {Propertyname} сілтемесіне сілтей аламын ба?

Басқаша айтқанда, мен мұны істей аламын ба? (Мен мұнда mongoFormId дегенді еш жерде анықтамадым):

public string mongoFormId 
{
    get
    {
        return this.mongoFormId;
    }
    set
    {
        this.mongoFormId = value;
        revalidateTransformation();
    }
}
8
Бұл коды бар стека трансферін аласыз :)
қосылды автор NibblyPig, көзі
+1 StackOverflowException
қосылды автор meorfi, көзі
Сіз бұл кодты жазғаныңыз қайда барады?
қосылды автор Mike, көзі

8 жауаптар

Сіз өзіңіздің автомобилдеріңізді немесе автоматты түрде қолдана аласыз. Егер автоматты қосалқы құралдарды қолдансаңыз, C# құрастырушысы сізге қолдау өрісін жасайды, бірақ сіз өзіңіздің қолыңызда болса, қолдайтын өрісті қамтамасыз етуіңіз керек (немесе мәнді басқаша өңдеу).

private string _mongoFormId;

public string mongoFormId 
{
    get { return this._mongoFormId; }
    set 
    {
        this._mongoFormId = value;
        revalidateTransformation();
    }
}

UPDATE: Since this question was asked, C# 6.0 has been released. However, even with the new syntax options, there is still no way to provide a custom setter body without the need to explicitly declare a backing field.

12
қосылды

Сіз өзгерген айнымалы мәнді орнатып, оны өзгерткіңіз келетін пайдаланушыны және қондырманы пайдаланатын болсаңыз, онда сол жерде мәнді сақтауыңыз керек.

Сізде бар кодымен сіз енді стека толып кетуіне жол бересіз. mongoFormId -ге бір нәрсе тағайындаған кезде, this.MongoFormId = value жолын орындайсыз. Бұл mongoFormId үшін тапсырма болып табылады, нәтижесінде this.MongoFormId = value жолын орындау және т.б. Ол ешқашан тоқтамайды.

Дұрыс жол - бұл өріс:

    private string _mongoFormId;
    public string mongoFormId {
        get { return this._mongoFormId; }
        set {
            this._mongoFormId = value;
            revalidateTransformation();
        }
    }
3
қосылды

Қолдау айнымалысы болуы керек. Неғұрлым тығыз көріңіз:

get { return this.mongoFormId; }

Getter-ты кодын қайтадан және қайта-қайта шақыратын mongoFormId -қа шақырамыз! Артқы айнымалыны анықтау шексіз рекурсивтік қоңыраудан аулақ болады.

2
қосылды
public string mongoFormId {
    get {
        return this.mongoFormId;
    }
    set {
        this.mongoFormId = value;
        revalidateTransformation();
    }
}

осылайша Барлық жолдардағы рекурсивті функция болады Жеке деректерді пайдаланатын жалғыз әдіс - бұл. Басқа ұлдар айтқандай.

0
қосылды

Check MSDN Properties Overview

Мүлік сипаттамасы әдетте жеке деректерді қамтиды,   бұл міндетті емес. Get accessor мәнді қайтара алмады   Жеке деректерге қатынасу. Бір мысал - бұл иелену сипаты   әдісі жүйе уақытын қайтарады. Сипаттар деректерді жасыру мүмкіндігін береді   accessor әдісі сипатты іске асыруды жасырады.

0
қосылды

Сіз жазған кодпен, сіз алуға және орнатуға рекурсивті шексіз цикл жасайсыз. this кілт сөзі қазіргі сипатқа жатады, ол сізде орналасқан.

Сонымен, иә, жеке өрісті жариялау қажет. Шатастырмас үшін, MSDN атауынан кейін қасиеттер жасаңыз Guideline (Паскаль каскасы қасиеттері үшін, жеке өрістер үшін түйе корпусы). Және сіздің әдістеріңіз үшін де солай істеңіз, егер revalidateTransformation орнына RevalidateTransformation керек болса, Java-ның орнына C# конвенциясын ұстаныңыз.

private string mongoFormId;
public string MongoFormId 
{
    get 
    { 
        return mongoFormId; 
    }
    set 
    {
        mongoFormId = value;
        RevalidateTransformation();
    }
}
0
қосылды

Бұл сипатқа рекурсивті қоңырау алғаннан кейін жұмыс істемейді. Егер қателеспесем, нәтиже StackOverflowException болады. Айнымалыны пайдалануыңыз керек.

    private string mongoFormId;
    public string MongoFormId 
    {
        get
        {
            return this.mongoFormId;
        }
        set
        {
            this.mongoFormId = value;
            revalidateTransformation();
        }
    }

revalidateTransformation файлын орындауға міндетті болмасаңыз, автоматты түрде пайдалануға болады. Бұл сахнаның артында сіз үшін қолдау жасайды.

public string MongoFormId { get; set; }
0
қосылды

Мұны екі жолмен де жасауға болады.

Егер сіз сыныптың деңгейдегі мүшесінің ауыспалылығына ие болғыңыз келсе, оны осылай жасаңыз -

public class sampleClass
{
     private string _mongoFormId;

public string mongoFormId {
            get { return _mongoFormId; }
            set {
                _mongoFormId = value;
                revalidateTransformation();
            }
        }
}

Немесе қайта қарап шығудың қажеті болмаса, оны қарапайым түрде орындаңыз

public class sampleClass
{
public string mongoFormId {get; set;}
}
0
қосылды
ол орнына revalidateTransformation (); деп қоңырау шалғысы келетінін тексеріңіз. Ешқандай назар аудармасаңыз '-' аласыз
қосылды автор meorfi, көзі