1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
1
.NET 4.x

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

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

Author24 — интернет-сервис помощи студентам
Ранее до изучения C# я постоянно использовал методы Set и Get для работы с приватными переменными класса. Как оказалось, в C# имеется альтернативная возможность этому варианту в виде свойств класса. Тока вот я не особо понял их назначение. И есть ли в этом хоть какое-то приемущество. Ведь вызывая свойство вызываются сразу и get и set. А это не оптимально... И, наоборот, если работать без свойств, то всё гораздо прозрачнее и канкретнее. Если нужно задать значение приватной переменной, вызвал Set, а если получить, то get. Т.е. не будет вызов обоих методов (get и set) одновременно, при вызове свойства.
Следовательно, возник вопрос о надобности свойств вообще.. Зачем они?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2015, 14:23
Ответы с готовыми решениями:

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

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

свойства get;set;
Доброе время суток, решил на досуге почитать тут про лямбда выражения и с ужасом для себя открыл,...

Свойства get и set
Можно ли изменить тип возвращаемого значения через свойства? Или же свойства не приспособлены к...

29
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
25.01.2015, 14:26 2
Цитата Сообщение от hoz Посмотреть сообщение
Зачем они?
Блин, ну вы дали... В принципе, свойства - это просто упрощение жизни разработчиков, в реальности они разворачиваются как раз в те самые два метода: Get() и Set().
Миниатюры
Свойства или Set & Get ?  
1
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
25.01.2015, 14:28 3
Цитата Сообщение от hoz Посмотреть сообщение
Ведь вызывая свойство вызываются сразу и get и set.
Цитата Сообщение от hoz Посмотреть сообщение
Т.е. не будет вызов обоих методов (get и set) одновременно, при вызове свойства.
Простите, а где вы прочитали о том, что они вызываются одновременно?
Вас обманули, вызывается либо геттер, либо сеттер. Ну или оба, но в некоторых случаях (инкремент, например).
0
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
25.01.2015, 14:43  [ТС] 4
Цитата Сообщение от 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
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
25.01.2015, 14:50 5
Цитата Сообщение от hoz Посмотреть сообщение
Так у Троелсена то и узнал.
Не надо выдумывать. Все у него там верно написано!
Миниатюры
Свойства или Set & Get ?  
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
25.01.2015, 15:04 6
Цитата Сообщение от hoz Посмотреть сообщение
Он меня обманул?
Так у него нигде не написано, что они оба сразу вызываются

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

Цитата Сообщение от hoz Посмотреть сообщение
Как же тут можно было иначе подумать то?
Если что-то не очевидно из текста книги, то проверьте сами: поставьте точку остановки в отладчике в коде геттера и сеттера, потом попробуйте получить значение свойства. Если при получении тормознет и в геттере и в сеттере, то ваш вывод подтверждается, в противном случае — опровергается.
Если не знаете как работать с отладчиком, то просто и там и там пропишите что-то типа:
C#
1
2
get { Console.WriteLine("In getter"); }
set { Console.WriteLine("In setter"); }
0
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
25.01.2015, 19:09  [ТС] 7
Цитата Сообщение от 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();
    }
Вывод такой:

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


Делаю предположение, что у свойство есть какая-то реализация, чтобы если это свойство вызывается с параметров, который отличается от value в свойстве, то оно меняется, и ессно set срабатывает, а если нет, то срабатывает только get. Получается так?
0
458 / 402 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
25.01.2015, 19:23 8
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
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
25.01.2015, 19:31 9
Цитата Сообщение от hoz Посмотреть сообщение
Делаю предположение
hoz, да какие тут еще предположения, что непонятного? Рассматривайте свойство просто как два отдельных метода, совмещенных вместе. Вам и Троелсен об этом в книге говорит, и тут уже какой пост показывают...
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
26.01.2015, 11:08 10
Цитата Сообщение от hoz Посмотреть сообщение
Делаю предположение, что у свойство есть какая-то реализация, чтобы если это свойство вызывается с параметров, который отличается от value в свойстве, то оно меняется, и ессно set срабатывает, а если нет, то срабатывает только get.
Все намного проще: если свойство стоит в левой части присваивания, то вызывается set, если в правой, то get.
1
Эксперт .NET
1695 / 1324 / 316
Регистрация: 15.06.2012
Сообщений: 5,038
Записей в блоге: 3
26.01.2015, 16:03 11
Лучший ответ Сообщение было отмечено 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
NickoTin
27.01.2015, 01:54
  #12
 Комментарий модератора 
Оффтоп прекращаем.
0
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
27.01.2015, 19:13  [ТС] 13
Ev_Hyper, То что всё не понять не будучи разработчиком языка это понятно. Но я ж в дебри то не лезу. Это ж базовые знания вроде как. Тем более у меня поставлена задача изучить базу за пару месяцев. Примерно так. А практиковать то я смогу серьёзнее когда будут знания уже по увереннее. Причина тому то, что писать мне нада dll-ки, и использовать WPF. К изучение WPF планирую приступить через месяца 2-3.
wmclik, Согласен. Книги пишут наверное для себя. Их мало кто понимает сходу. И очевидностей не много для новичков.
Цитата Сообщение от kolorotur Посмотреть сообщение
Все намного проще: если свойство стоит в левой части присваивания, то вызывается set, если в правой, то get.
По ходу Вы ошибаетесь. Вот смотрите:
Свойства или Set & Get ?

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

Добавлено через 1 минуту
Цитата Сообщение от hoz Посмотреть сообщение
писать мне нада dll-ки, и использовать WPF
Одно немного противоречит другому.
dll - как правило логика реализации программы, вне зависимости от интерфейса.
WPF - это именно интерфейс. Так что же вы хотите ?)))
0
Warrior
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
27.01.2015, 19:33 15
За месяц можно выучить базу спокойно, если вам кто то умный подберет нужный индивидуальный материал в зависимости от ваших знаний. Но в вашем случае мне кажется вы не те книги абсолютно читаете
0
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
27.01.2015, 19:41 16
Цитата Сообщение от _exp10der_ Посмотреть сообщение
За месяц можно выучить базу спокойно
_exp10der_, если не секрет, что в вашем понимании база?
Мое видение:
1. Основы, т.е. классы, структуры, поля, методы. свойства, модификаторы и так далее, встроенные типы, конструкторы и так далее...
2. Файлы и потоки, сериализация.
3. Базы данных, работа с ними.
4. LINQ во всех проявлениях (LINQ to Object, LONQ to Xml, LINQ to DataSet).
5. Лямбда выражения, анонимные методы и делегаты, методы расширения.
6. Многопоточность и асинхронность, параллельное выполнение. Начиная от потоковых примитивов до работы с PLINQ и Parallel.
Примерно так, хотя, возможно, что-то и забыл упомянуть. Вы считаете, на все это хватит месяца?)))
0
Warrior
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
27.01.2015, 19:49 17
1. Основы, т.е. классы, структуры, поля, методы. свойства, модификаторы и так далее, встроенные типы, конструкторы, события
2. Файлы и потоки, сериализация.
3. Лямбда выражения, анонимные методы и делегаты, методы расширения.
4. LINQ to Object
Как то так но это не значит что человек благодаря получим знаниям не сможет зайти на мсдн и сделать допустим Linq to Xml и другие базовые вещи
0
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
27.01.2015, 19:51 18
_exp10der_, а как же базы данных, многопоточность? Это тоже база, как же без хранения данных? Да и подвисающие приложения тоже не фонтан для пользователей?)))
0
1 / 1 / 0
Регистрация: 25.08.2014
Сообщений: 104
27.01.2015, 19:54  [ТС] 19
Цитата Сообщение от insite2012 Посмотреть сообщение
Оно вас обманывает, поверьте. При взгляде на код все становится ясно без глубоких раздумий.
Я на него смотрел уже ни раз. И редактировал и добавлял варианты. Как-то отрабатываются Set и Get не так как выше изложено. Очень хотелось бы услышать конкретный ответ дабы прикрыть эту тему и я сдвинулся с места..
0
Эксперт .NET
5531 / 4296 / 1216
Регистрация: 12.10.2013
Сообщений: 12,329
Записей в блоге: 2
27.01.2015, 19:58 20
Цитата Сообщение от hoz Посмотреть сообщение
отрабатываются Set и Get не так как выше изложено
Все отрабатывается верно. Можете не сомневаться. Мыслите логически и поймете.
0
27.01.2015, 19:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2015, 19:58
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru