Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Вопрос о свойствах


Автор: Nuzur 5.6.2007, 12:05
Здравствуйте. Я программист на С++, вот изучаю C#.

Немогу понять в чем ошибка кода:

Код

    class Example
    {
        public string Str
        {
            get
            {
                return Str;
            }
            set
            {
                Str = value;
            }
        }
        public void Change( out int i )
        {
            i = 1;
            return;
        }
    }

    class Root
    {
        public static void Main(string[] arg)
        {
            Example Examp = new Example();
            
            Examp.Str = "New Value!";
            Console.WriteLine(Examp.Str);
            return;

        }
    }


При выполнении получаю стековерфлов, подскажите пожалуйста почему так? И что я делаю не верно. Заранее спасибо.

Автор: tol05 5.6.2007, 12:12
а где собственно поле? Str - свойство, поле или свойство-поле?  smile 
Код


string _Str;

public string Str
        {
            get
            {
                return _Str;
            }
            set
            {
                _Str = value;
            }
        }

так помогло? smile

Автор: Nuzur 5.6.2007, 12:18
tol05, помогло то помогло я тоже так делал. Просто я не понимаю логики разработчиков!
Тоесть я должен объявить приватным _Str и публичный "какбыметод" который делает доступ до приватного _Str.
Мне кажется это не логичным.

Автор: tol05 5.6.2007, 12:29
Цитата(Nuzur @  5.6.2007,  12:18 Найти цитируемый пост)
Тоесть я должен объявить приватным _Str и публичный "какбыметод" который делает доступ до приватного _Str.
Мне кажется это не логичным.
странная мысль...

Вот ты присвоил
Код

Examp.Str = "New Value!";

а где ты собираешься хранить эту строку в классе? Свойство - это синтаксическая конфета, превращающаяся при компиляции в пару методов get_XXXX и set_XXXX (кстати, поэтому если у тебя есть свойство с именем Str, то не вздумай объявлять в классе метод get_Str  smile )

Так вот, ты в экземпляр класса данные через свойство загнал. Хранить их в чем?!

p.s. а логика проста - ты скрываешь поле от посторонних и делаешь с ним в классе что хочешь. а посторонние могут только через свойство с полем работать. Вот в свойстве и вводят проверки корректности изменения, или доступ постороннему коду ограничивают, или под конкретные условия вызова данные поля подстраивают...

Автор: Pankon 5.6.2007, 12:48
Цитата(Nuzur @  5.6.2007,  12:18 Найти цитируемый пост)
Тоесть я должен объявить приватным _Str и публичный "какбыметод" который делает доступ до приватного _Str.
 если не подходят свойства, можно использовать public  поля
Код

public string Str;


Где и как (зачем) использовать Свойства tol05 обьяснил...

Автор: Nuzur 5.6.2007, 12:52
tol05, Согласен, просто я немного по другому представлял себе эту модель. На си оно так и есть get_member, set_member. Просто думал что можно метод объявить "в рамках переменной", тоесть в духе я объявляю переменную и сразу же могу объявить методы для нее с тем же именем. Вроде складно получалось ан нет.

Я сразу по аналогии с си сделал так как вы писали в вашем 1м посте, у меня вышло, но мне показалось что я чего-то недопонял, решил спросить.

Спасибо за разъяснения.

ЗЫ а все-таки было б здорово переменная и сразу методы к ней... "Но человек может мечтать" (С) Профессор Фарнсворт(Футурама)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)