Бясконцы цыкл у геттере/сетэр C #

class Program
{
    static void Main(string[] args)
    {
        something s = new something();
        s.DoIt(10);
        Console.Write(s.testCount);
    }
}

class something
{
    public int testCount
    {
        get { return testCount; }
        set { testCount = value + 13; }
    }

    public void DoIt(int val)
    {
        testCount = val;
    }
}

Гэта тое, што ў мяне ёсць, таму што я хацеў, каб праверыць і пагуляцца з матэрыялам геттеры/сетары для C #. Тым не менш, я атрымліваю StackOverflowException быў неапрацаванае на «мноства {testCount = значэнне + 13}». І я не магу прайсці праз яго, як я атрымліваю «адладчык не можа працягнуць выкананне працэсу. Працэс быў спынены» паведамленне з Visual Studio. Любыя ідэі, што я раблю не так?

Edit: Сёння я даведаўся, што я зрабіў даволі дурное Derp. Улічваючы мноства людзей хуткарастваральных адказаў. Цяпер я ведаю, што лепш.

5
@Fender - у нейкім сэнсе, існаванне аўто уласцівасцяў робіць гэта лёгкая памылка зрабіць. Калі адзін <�я> HAD , каб выкарыстоўваць поле подкладочный для простых уласцівасцяў, добра ... у вас поле подкладочный.
дададзена аўтар Oded, крыніца
@Fender - у нейкім сэнсе, існаванне аўто уласцівасцяў робіць гэта лёгкая памылка зрабіць. Калі адзін <�я> HAD , каб выкарыстоўваць поле подкладочный для простых уласцівасцяў, добра ... у вас поле подкладочный.
дададзена аўтар Oded, крыніца
Для тлумачэння бясконцага цыклу, што @ToonCasteele азначае, што, так як вы называеце набор метад testCount у <�я> свой уласны сетэр , фактычны метад набору называе сябе бясконца.
дададзена аўтар tnw, крыніца
Для тлумачэння бясконцага цыклу, што @ToonCasteele азначае, што, так як вы называеце набор метад testCount у <�я> свой уласны сетэр , фактычны метад набору называе сябе бясконца.
дададзена аўтар tnw, крыніца
Гэта таксама тлумачыць, чаму адладчык гадзяць сябе пры спробе зламаць там
дададзена аўтар tnw, крыніца
Гэта таксама тлумачыць, чаму адладчык гадзяць сябе пры спробе зламаць там
дададзена аўтар tnw, крыніца
Вы доступ да той жа уласнасці ўнутры сетэраў. Вы, верагодна, трэба мець прыватную зменную якую вы карыстаецеся для доступу да праз грамадскую ўласнасць. (Не палымяны, але гэты код прымусіў мяне дрыжаць)
дададзена аўтар Toon Casteele, крыніца
Вы доступ да той жа уласнасці ўнутры сетэраў. Вы, верагодна, трэба мець прыватную зменную якую вы карыстаецеся для доступу да праз грамадскую ўласнасць. (Не палымяны, але гэты код прымусіў мяне дрыжаць)
дададзена аўтар Toon Casteele, крыніца
Ааа. Я не занадта прывык да таго, як працуюць ўласцівасці, і мне проста трэба кінуць дзярмо стрэл разам, каб паспрабаваць зразумець нешта.
дададзена аўтар Michael Fender, крыніца
Ааа. Я не занадта прывык да таго, як працуюць ўласцівасці, і мне проста трэба кінуць дзярмо стрэл разам, каб паспрабаваць зразумець нешта.
дададзена аўтар Michael Fender, крыніца
Да .. Не думаю, назваўшы яго ў інкубатары можа выклікаць яго працягваць называць сябе. Мае сэнс цяпер, хоць.
дададзена аўтар Michael Fender, крыніца
Да .. Не думаю, назваўшы яго ў інкубатары можа выклікаць яго працягваць называць сябе. Мае сэнс цяпер, хоць.
дададзена аўтар Michael Fender, крыніца

10 адказы

У вас ёсць зацыкленне, так як вы маеце на ўвазе уласнасці у ўласцівасць.

Вы павінны выкарыстоўваць поле подкладочный для гэтага:

private int testCount;
public int TestCount
{
    get { return testCount; }
    set { testCount = value + 13; }
}

Звярніце ўвагу на імя ўласцівасці TestCount (які таксама адпавядае стандарту # назвах C), у адрозненне ад імя поля testCount (у ніжнім рэгістры т ).

17
дададзена

У вас ёсць зацыкленне, так як вы маеце на ўвазе уласнасці у ўласцівасць.

Вы павінны выкарыстоўваць поле подкладочный для гэтага:

private int testCount;
public int TestCount
{
    get { return testCount; }
    set { testCount = value + 13; }
}

Звярніце ўвагу на імя ўласцівасці TestCount (які таксама адпавядае стандарту # назвах C), у адрозненне ад імя поля testCount (у ніжнім рэгістры т ).

17
дададзена

Вы павінны абвясьціць зменную назад ўласцівасць:

class something
{
    private int _testCount;
    public int testCount
    {
        get { return _testCount; }
        set { _testCount = value + 13; }
    }
    ...
4
дададзена

Вы павінны абвясьціць зменную назад ўласцівасць:

class something
{
    private int _testCount;
    public int testCount
    {
        get { return _testCount; }
        set { _testCount = value + 13; }
    }
    ...
4
дададзена

У вас ёсць цыклічная спасылка ў паглынальнікаў вашага маёмасці. Паспрабуйце гэта:

class Something
{
    private int _testCount;
    public int TestCount
    {
        get { return _testCount; }
        set { _testCount = value; }
    }

    public void DoIt(int val)
    {
        _testCount = val;
    }
}
3
дададзена

У вас ёсць цыклічная спасылка ў паглынальнікаў вашага маёмасці. Паспрабуйце гэта:

class Something
{
    private int _testCount;
    public int TestCount
    {
        get { return _testCount; }
        set { _testCount = value; }
    }

    public void DoIt(int val)
    {
        _testCount = val;
    }
}
3
дададзена

гэта:

public int testCount
{
    get { return testCount; }

яна вяртае сябе, што прымушае яго выконваць сам.

Замест таго, каб вярнуць ўласнасць самога па сабе, захоўваць меркаваную велічыню ў іншую (пераважна абаронены або прыватны) пераменны. Затым маніпулююць гэтую зменную як у інкубатары і ў паглынальнікаў.

2
дададзена

гэта:

public int testCount
{
    get { return testCount; }

яна вяртае сябе, што прымушае яго выконваць сам.

Замест таго, каб вярнуць ўласнасць самога па сабе, захоўваць меркаваную велічыню ў іншую (пераважна абаронены або прыватны) пераменны. Затым маніпулююць гэтую зменную як у інкубатары і ў паглынальнікаў.

2
дададзена
class Program
{
    static void Main(string[] args)
    {
        something s = new something();
        s.DoIt(10);
        Console.Write(s.testCount);
    }
}

class something
{
    private int _testCount;

    public int testCount
    {
       //you are calling the property within the property which would be why you have a stack overflow.
        get { return _testCount; }
        set { _testCount = value + 13; }
    }

    public void DoIt(int val)
    {
        testCount = val;
    }
}
1
дададзена
class Program
{
    static void Main(string[] args)
    {
        something s = new something();
        s.DoIt(10);
        Console.Write(s.testCount);
    }
}

class something
{
    private int _testCount;

    public int testCount
    {
       //you are calling the property within the property which would be why you have a stack overflow.
        get { return _testCount; }
        set { _testCount = value + 13; }
    }

    public void DoIt(int val)
    {
        testCount = val;
    }
}
1
дададзена