Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
 Аватар для hoz
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
.NET 4.x

Свойства или Set & Get ?

25.01.2015, 14:23. Показов 5075. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ранее до изучения C# я постоянно использовал методы Set и Get для работы с приватными переменными класса. Как оказалось, в C# имеется альтернативная возможность этому варианту в виде свойств класса. Тока вот я не особо понял их назначение. И есть ли в этом хоть какое-то приемущество. Ведь вызывая свойство вызываются сразу и get и set. А это не оптимально... И, наоборот, если работать без свойств, то всё гораздо прозрачнее и канкретнее. Если нужно задать значение приватной переменной, вызвал Set, а если получить, то get. Т.е. не будет вызов обоих методов (get и set) одновременно, при вызове свойства.
Следовательно, возник вопрос о надобности свойств вообще.. Зачем они?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.01.2015, 14:23
Ответы с готовыми решениями:

Будет ли корректным вызывать внутри методов get или set другие функции или менять свойства контролов?
Всем привет. Скажите разрешается, не в том смысле, что понятно все разрешено, а будет ли корректным вызывать внутри методов get или set...

Свойства get set
Доброй ночи. public class Date { private int month = 7; public int Month { get { ...

Где автоматические свойства сохраняют значения?
Доброе время суток, решил на досуге почитать тут про лямбда выражения и с ужасом для себя открыл, что код public class MyClass { ...

29
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.01.2015, 14:26
Цитата Сообщение от hoz Посмотреть сообщение
Зачем они?
Блин, ну вы дали... В принципе, свойства - это просто упрощение жизни разработчиков, в реальности они разворачиваются как раз в те самые два метода: Get() и Set().
Миниатюры
Свойства или Set & Get ?  
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.01.2015, 14:28
Цитата Сообщение от hoz Посмотреть сообщение
Ведь вызывая свойство вызываются сразу и get и set.
Цитата Сообщение от hoz Посмотреть сообщение
Т.е. не будет вызов обоих методов (get и set) одновременно, при вызове свойства.
Простите, а где вы прочитали о том, что они вызываются одновременно?
Вас обманули, вызывается либо геттер, либо сеттер. Ну или оба, но в некоторых случаях (инкремент, например).
0
 Аватар для hoz
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
25.01.2015, 14:43  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Простите, а где вы прочитали о том, что они вызываются одновременно?
Вас обманули, вызывается либо геттер, либо сеттер. Ну или оба, но в некоторых случаях (инкремент, например).
Так у Троелсена то и узнал. Он меня обманул?
Вот пример из учебника:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Properties!
        public string Name
        {
            get { return empName; }
            set
            {
                if (value.Length > 15)
                    Console.WriteLine("Error!  Name must be less than 16 characters!");
                else
                    empName = value;
            }
        }
 
        // We could add additional business rules to the sets of these properties,
        // however there is no need to do so for this example.
        public int ID
        {
            get { return empID; }
            set { empID = value; }
        }
        public float Pay
        {
            get { return currPay; }
            set { currPay = value; }
        }
 
        public int Age
        {
            get { return empAge; }
            set { empAge = value; }
        }
А вот его вызов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void Main( string[] args )
        {
            Console.WriteLine("***** Fun with Encapsulation *****\n");
            Employee emp = new Employee("Marvin", 456, 30000);
            emp.GiveBonus(1000);
            emp.DisplayStats();
 
            // Set and get the Name property.
            emp.Name = "Marv";
            Console.WriteLine("Employee is named: {0}", emp.Name);
 
            // Longer than 15 characters!  Error will print to console. 
            Employee emp2 = new Employee();
            emp2.SetName("Xena the warrior princess");
 
            Console.ReadLine();
        }
Например, из этого примера вызов свойства имени происходит вот так:
C#
1
 emp.Name = "Marv";
В вызове не упоминается ни про Get, ни про Set. Я сделал вывод, что код свойства отрабатывается весть и сразу. Как же тут можно было иначе подумать то?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.01.2015, 14:50
Цитата Сообщение от hoz Посмотреть сообщение
Так у Троелсена то и узнал.
Не надо выдумывать. Все у него там верно написано!
Миниатюры
Свойства или Set & Get ?  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.01.2015, 15:04
Цитата Сообщение от hoz Посмотреть сообщение
Он меня обманул?
Так у него нигде не написано, что они оба сразу вызываются

Цитата Сообщение от hoz Посмотреть сообщение
Я сделал вывод, что код свойства отрабатывается весть и сразу.
Вывод неправильный, к сожалению.

Цитата Сообщение от hoz Посмотреть сообщение
Как же тут можно было иначе подумать то?
Если что-то не очевидно из текста книги, то проверьте сами: поставьте точку остановки в отладчике в коде геттера и сеттера, потом попробуйте получить значение свойства. Если при получении тормознет и в геттере и в сеттере, то ваш вывод подтверждается, в противном случае — опровергается.
Если не знаете как работать с отладчиком, то просто и там и там пропишите что-то типа:
C#
1
2
get { Console.WriteLine("In getter"); }
set { Console.WriteLine("In setter"); }
0
 Аватар для hoz
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
25.01.2015, 19:09  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Если не знаете как работать с отладчиком, то просто и там и там пропишите что-то типа
То что приходилось делать умею. В принципе, поправил метод Main() вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static void Main(string[] args)
    {
     Console.WriteLine("***** Fun with Encapsulation *****\n");
     Employee emp = new Employee("Marvin", 456, 30000);
     emp.GiveBonus(1000);
     emp.DisplayStats();
    
     // Set and get the Name property.
     emp.Name = "Marv";
     emp.Name = "Marv_1";
     emp.Name = "Marv_2";
     emp.Name = "Marv_3";
     Console.WriteLine("Employee is named: {0}", emp.Name);
    
     // Longer than 15 characters!  Error will print to console. 
     Employee emp2 = new Employee();
     emp2.SetName("Xena the warrior princess");
    
     Console.ReadLine();
    }
Вывод такой:



Делаю предположение, что у свойство есть какая-то реализация, чтобы если это свойство вызывается с параметров, который отличается от value в свойстве, то оно меняется, и ессно set срабатывает, а если нет, то срабатывает только get. Получается так?
0
 Аватар для Prog_maker
459 / 403 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
25.01.2015, 19:23
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        static void Main(string[] args)
        {
            List<Person> persons = new List<Person>();
            persons.Add(new Person{Name = "Иван", LastName="Петров"}); // Set 
            foreach (var p in persons)
                Console.WriteLine(p.Name + "  " + p.LastName); // Get
            Console.ReadKey();
        }
    }
 
    class Person
    {
        public string Name { get; set; }
        public string LastName { get; set; }
    }
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.01.2015, 19:31
Цитата Сообщение от hoz Посмотреть сообщение
Делаю предположение
hoz, да какие тут еще предположения, что непонятного? Рассматривайте свойство просто как два отдельных метода, совмещенных вместе. Вам и Троелсен об этом в книге говорит, и тут уже какой пост показывают...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.01.2015, 11:08
Цитата Сообщение от hoz Посмотреть сообщение
Делаю предположение, что у свойство есть какая-то реализация, чтобы если это свойство вызывается с параметров, который отличается от value в свойстве, то оно меняется, и ессно set срабатывает, а если нет, то срабатывает только get.
Все намного проще: если свойство стоит в левой части присваивания, то вызывается set, если в правой, то get.
1
Эксперт .NET
 Аватар для Wolfdp
3788 / 1765 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
26.01.2015, 16:03
Лучший ответ Сообщение было отмечено hoz как решение

Решение

Свойства это методы в удобном виде. Делается исключительно для логического понимания программы. Свойствами обычно обозначают состояние данного объекта. Методы же подразумевают действие. Например у нас есть объект "мяч". Его характеристики: объем(размер), позиция на координатах.

C#
1
2
3
4
5
6
public Ball
{
public int X { get; set; }
public int Y { get; set; }
public int R { get; set; }
}
Теперь такой ньюанс: радиус не может быть отрицательным, значить имеет смысл добавить проверку. Это демонстрирует приемущество над полями. (если бы мы просто напрямую написали public int R

C#
1
2
3
4
5
6
7
8
9
10
11
public Ball
{
public int X { get; set; }
public int Y { get; set; }
private int r;
public int R { 
get {return r;} 
set {
if(value<0) throw new Exception(); //выдаем исключение (программа упадет)
else r = value; }
}
Теперь такой момент. Например нам мяч нужно двигать. Можно просто менять X, Y и все будет работать. Но как уже писали выше -- более логично действия выносить в метод

C#
1
2
3
4
5
public Ball
{
public void Move(int x, int y)
{
 X = x; Y = y;
А вообще это банально экономит код/работу. Толи постоянно(!) для каждого нового свойства объекта пилить два(!!) однотипных метода Get/Set, когда все можно уместить в одну строчку, без лишних приставок. Для наглядности:

C#
1
2
3
4
5
6
7
8
public Ball
{
public int GetX();
public int SetX();
public int GetY();
public int SetY();
public int GetR();
public int SetR();}
Еще такой момент, когда ты уже знаешь все о шарпе, и занят не сколько разбором работы лямда выражений, сколько бизнес логикой: пишешь код, обращаешься к объекту model, тебе нужно задать его свойство (или получить). После точки ты сразу(!) пишешь имя искомого свойства.

В двух словах: ЭТО УДОБНО.
1
27.01.2015, 01:54
 Комментарий модератора 
Оффтоп прекращаем.
0
 Аватар для hoz
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
27.01.2015, 19:13  [ТС]
Ev_Hyper, То что всё не понять не будучи разработчиком языка это понятно. Но я ж в дебри то не лезу. Это ж базовые знания вроде как. Тем более у меня поставлена задача изучить базу за пару месяцев. Примерно так. А практиковать то я смогу серьёзнее когда будут знания уже по увереннее. Причина тому то, что писать мне нада dll-ки, и использовать WPF. К изучение WPF планирую приступить через месяца 2-3.
wmclik, Согласен. Книги пишут наверное для себя. Их мало кто понимает сходу. И очевидностей не много для новичков.
Цитата Сообщение от kolorotur Посмотреть сообщение
Все намного проще: если свойство стоит в левой части присваивания, то вызывается set, если в правой, то get.
По ходу Вы ошибаетесь. Вот смотрите:

Выходит, что как-то не совсем так вызов происходит. У меня создаётся такое ощущение, что не только я это не допонимаю, но только я это сказал вслух
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.01.2015, 19:29
Цитата Сообщение от hoz Посмотреть сообщение
поставлена задача изучить базу за пару месяцев.
Если вы планируете иметь хорошую базу - это вряд ли. За такой срок.
Цитата Сообщение от hoz Посмотреть сообщение
По ходу Вы ошибаетесь.
Не говорите чепухи. Все там ясно и понятно.
Цитата Сообщение от hoz Посмотреть сообщение
У меня создаётся такое ощущение, что не только я это не допонимаю
Оно вас обманывает, поверьте. При взгляде на код все становится ясно без глубоких раздумий.

Добавлено через 1 минуту
Цитата Сообщение от hoz Посмотреть сообщение
писать мне нада dll-ки, и использовать WPF
Одно немного противоречит другому.
dll - как правило логика реализации программы, вне зависимости от интерфейса.
WPF - это именно интерфейс. Так что же вы хотите ?)))
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
27.01.2015, 19:33
За месяц можно выучить базу спокойно, если вам кто то умный подберет нужный индивидуальный материал в зависимости от ваших знаний. Но в вашем случае мне кажется вы не те книги абсолютно читаете
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.01.2015, 19:41
Цитата Сообщение от _exp10der_ Посмотреть сообщение
За месяц можно выучить базу спокойно
_exp10der_, если не секрет, что в вашем понимании база?
Мое видение:
1. Основы, т.е. классы, структуры, поля, методы. свойства, модификаторы и так далее, встроенные типы, конструкторы и так далее...
2. Файлы и потоки, сериализация.
3. Базы данных, работа с ними.
4. LINQ во всех проявлениях (LINQ to Object, LONQ to Xml, LINQ to DataSet).
5. Лямбда выражения, анонимные методы и делегаты, методы расширения.
6. Многопоточность и асинхронность, параллельное выполнение. Начиная от потоковых примитивов до работы с PLINQ и Parallel.
Примерно так, хотя, возможно, что-то и забыл упомянуть. Вы считаете, на все это хватит месяца?)))
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
27.01.2015, 19:49
1. Основы, т.е. классы, структуры, поля, методы. свойства, модификаторы и так далее, встроенные типы, конструкторы, события
2. Файлы и потоки, сериализация.
3. Лямбда выражения, анонимные методы и делегаты, методы расширения.
4. LINQ to Object
Как то так но это не значит что человек благодаря получим знаниям не сможет зайти на мсдн и сделать допустим Linq to Xml и другие базовые вещи
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.01.2015, 19:51
_exp10der_, а как же базы данных, многопоточность? Это тоже база, как же без хранения данных? Да и подвисающие приложения тоже не фонтан для пользователей?)))
0
 Аватар для hoz
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
27.01.2015, 19:54  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Оно вас обманывает, поверьте. При взгляде на код все становится ясно без глубоких раздумий.
Я на него смотрел уже ни раз. И редактировал и добавлял варианты. Как-то отрабатываются Set и Get не так как выше изложено. Очень хотелось бы услышать конкретный ответ дабы прикрыть эту тему и я сдвинулся с места..
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.01.2015, 19:58
Цитата Сообщение от hoz Посмотреть сообщение
отрабатываются Set и Get не так как выше изложено
Все отрабатывается верно. Можете не сомневаться. Мыслите логически и поймете.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.01.2015, 19:58
Помогаю со студенческими работами здесь

Можно ли изменить тип возвращаемого значения через свойства?
Можно ли изменить тип возвращаемого значения через свойства? Или же свойства не приспособлены к этому..:read: Допустим, у меня есть поле...

Автоматические свойства get set
class Start { static void Main() { Test t = new Test(7); Console.WriteLine(t.a); //вывод 7 } }

Свойства. Недопонимание с акссесорами set и get
Читаю книгу Г. Шилдта по С# и разбираю пример с исключениями. Возникло недопонимание в написании свойств длины массива. Насколько смог...

Свойства get set: каково их назначение
Можете простым языком обьяснить что значат get и set?

Свойства (set,get) трансляция в main
Доброго времени суток компьютерщики! Не получается посмотреть как работает свойство(...,set) . А именно хочу вывести через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru