Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/520: Рейтинг темы: голосов - 520, средняя оценка - 4.67
 Аватар для Zetway
14 / 14 / 4
Регистрация: 08.08.2010
Сообщений: 117

Что делает конструкция c get и set

26.01.2011, 15:57. Показов 105168. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
что делает код
C#
1
public int Index { get; set; }
?
Хочу сказать что хорошо знаком с ООП на примере С++, но там я прописивал методы setSmth и getSmth, а тут это что? как его потом вызвать из-под обьекта?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2011, 15:57
Ответы с готовыми решениями:

Что делает данная конструкция?
Подскажите пожалуйста что происходит в данной ситуации: Add_Click?.Invoke(sender, e); Так советует мне resharper. Но что это за...

Что делает конструкция (params[] args) => { }
button.HandleDestroyed += new EventHandler((s, args) => { MessageBox.Show("HandleDestroyed"); }); button.Disposed += new EventHandler((s,...

Конструкция get и set для нахождения min и max значений массива
Уважаемые форумчаны! А можно ли воспользоваться конструкция get и set, если найти максимальное/минимальное число в одномерном массиве? Если...

31
 Аватар для Filislav
339 / 285 / 62
Регистрация: 02.09.2010
Сообщений: 547
26.01.2011, 16:06
Управляет доступом к полю обьекта.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Class Class1
{
      private int index; //поле
      public int Index
     {
        get
            {
              return index;
            }
       set
            {
             index = value;
            }
      }
    public Class1(int index) - конструктор не по умолчанию
   {
      Index = index;  //вот тут через свойство, передается значение полю
   } 
}
 
Далее в коде в методе Main
Class1 MyClass = new Class1(1);// 1 - это значение которое запишется в поле index обьета
2
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
26.01.2011, 16:24
Лучший ответ Сообщение было отмечено как решение

Решение

Zetway, это тоже самое что и
C#
1
2
3
4
5
6
int index;
 
public int Index {
    get { return index; }
    set { index = value; }
}
При компиляции оба варианта разворачиваются в такую же форму как привел ты, т.е. создаются 2 метода
C#
1
2
3
4
5
6
7
public void set_Index( Int32 value ) {
    index = value;
}
 
public Int32 get_Index() {
    return index;
}
Только когда создаётся автоматическое свойство
C#
1
public int Index { get; set; }
компилятор автоматически создает переменную в которой будет храниться значение.
6
 Аватар для Zetway
14 / 14 / 4
Регистрация: 08.08.2010
Сообщений: 117
26.01.2011, 16:28  [ТС]
а если так
C#
1
2
3
4
5
6
7
8
9
10
11
12
Class Class1
{
      private int Index; 
      
    public Class1(int index) 
   {
      Index = index;  
   } 
}
 
Далее в коде в методе Main
Class1 MyClass = new Class1(1);
то рабоать не будет?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
26.01.2011, 16:31
Zetway, будет, но доступ к полю Index ты не получишь.
C#
1
2
MyClass.Index = 0; // Error
int a = MyClass.Index; // Error
Почитай о свойствах.
0
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
26.01.2011, 16:36
Это называется свойство. Это нужно для инкапсуляции. То есть ты не даешь полный доступ к полю, а оборачиваешь его свойством, и вместо двух методов setSmth и getSmth ты обращаешься к свойству как к полю, но в то же время это по сути те же методы. Вот простой пример:
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
class A
{
private int a = 0;
 
//для доступа к полю можно сделать два метода:
public void setA(int value)
{
    if(value < 0)
        throw new ArgumentException();
    a = value;
}
 
public int getA()
{
    return a;
}
 
//А можно одно свойство:
public int A
{
    get { return a; }
    set{
        if(value < 0)
            throw new ArgumentException();
        a=value;
    }
}
}
1
 Аватар для Zetway
14 / 14 / 4
Регистрация: 08.08.2010
Сообщений: 117
26.01.2011, 16:42  [ТС]
hasys, как по мне, если можно обращаться к свойству напрямую - это по-любому нарушение инкапсуляции
0
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
26.01.2011, 16:47
Цитата Сообщение от Zetway Посмотреть сообщение
hasys, как по мне, если можно обращаться к свойству напрямую - это по-любому нарушение инкапсуляции
Свойство ничего не хранит. Хранит поле. А свойство это лишь синтаксический сахар, обёртка, которая позволяет не писать два метода getSmth и setSmth.
0
 Аватар для Zetway
14 / 14 / 4
Регистрация: 08.08.2010
Сообщений: 117
26.01.2011, 16:53  [ТС]
Цитата Сообщение от hasys Посмотреть сообщение
Свойство ничего не хранит. Хранит поле. А свойство это лишь синтаксический сахар, обёртка, которая позволяет не писать два метода getSmth и setSmth.
спасибо, буду знать, но я не об этом. я обычно не пишу set, разве что для группы полей, ради инкапсуляции, если к полю можно свободно обращаться то по-моему это явное нарушение инкапсуляции
0
21 / 21 / 3
Регистрация: 11.07.2010
Сообщений: 63
26.01.2011, 17:14
Zetway, с чего бы это?

Вообще-то свойства придуманы, чтобы валидировать данные до присвоения их переменной. И, возможно, обрабатывать каким-то образом переменную до передачи ее кому-то.
0
11 / 11 / 2
Регистрация: 18.01.2010
Сообщений: 53
26.01.2011, 18:37
Цитата Сообщение от nicolaus2 Посмотреть сообщение
Zetway, с чего бы это?

Вообще-то свойства придуманы, чтобы валидировать данные до присвоения их переменной. И, возможно, обрабатывать каким-то образом переменную до передачи ее кому-то.
Свойства придуманы, чтобы не писать два метода getSmth и setSmth при доступе к полям. Рихтер по этому и против свойств, что программисты иногда не осознают, что работают с методами а не с полями. То есть Zetway по сути прав, просто он тоже по началу не очень понял концепт, что свойство это всего лишь простой способ написать два метода. Приведённый выше код по сути одно и то же но в первом варианте выглядит более правильно с точки зрения инкапсуляции, чем во втором. Это просто не очевидно, и это нужно знать. Рихтеру этим свойства и не нравятся.
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
27.01.2011, 17:45
Как по мне свойства и индексаторы очень таки полезная вещь.
Если ими умело пользоваться то они очень полезны, да и код красиво выглядит.
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
28.01.2011, 09:00
Цитата Сообщение от Konctantin Посмотреть сообщение
Да и код красиво выглядит.
Согласен. )))

А никто не проверял, как свойства влияют на эффективность? ( Грубо говоря что эффективнее - public поле или свойство {get;set;} ? )
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
28.01.2011, 09:50
Цитата Сообщение от sigmov Посмотреть сообщение
А никто не проверял, как свойства влияют на эффективность? ( Грубо говоря что эффективнее - public поле или свойство {get;set;} ? )
public поле эффективнее. К примеру, в XNA у векторов поля X, Y, Z объявлены как public. В WPF же, координаты векторов заданы через свойства.
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
28.01.2011, 10:27
Цитата Сообщение от Unril Посмотреть сообщение
public поле эффективнее. К примеру, в XNA у векторов поля X, Y, Z объявлены как public. В WPF же, координаты векторов заданы через свойства.
Тоже так предполагал, хотя думаю компилятор вполне бы мог оптимизировать данные операции до равнозначных....

Добавлено через 18 минут
Провел следующий тест:
Классы и функции:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyClassField { public int Value; }
public class MyClassProperty { public int Value { get; set; } }
 
static void FieldTest()
{
    MyClassField mcf = new MyClassField();
    mcf.Value = 113;
    MyClassField mcf2 = new MyClassField();
    mcf2.Value = 22;
    mcf.Value += mcf2.Value;
}
static void PropertyTest()
{
    MyClassProperty mcp = new MyClassProperty();
    mcp.Value = 113;
    MyClassProperty mcp2 = new MyClassProperty();
    mcp.Value = 22;
    mcp.Value += mcp2.Value;
}
IL развертка:
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
.method private hidebysig static void  FieldTest() cil managed
{
  // Размер кода:       48 (0x30)
  .maxstack  3
  .locals init ([0] class SmtpTest.Program/MyClassField mcf,
           [1] class SmtpTest.Program/MyClassField mcf2)
  IL_0000:  newobj     instance void SmtpTest.Program/MyClassField::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  ldc.i4.s   113
  IL_0009:  stfld      int32 SmtpTest.Program/MyClassField::Value
  IL_000e:  newobj     instance void SmtpTest.Program/MyClassField::.ctor()
  IL_0013:  stloc.1
  IL_0014:  ldloc.1
  IL_0015:  ldc.i4.s   22
  IL_0017:  stfld      int32 SmtpTest.Program/MyClassField::Value
  IL_001c:  ldloc.0
  IL_001d:  dup
  IL_001e:  ldfld      int32 SmtpTest.Program/MyClassField::Value
  IL_0023:  ldloc.1
  IL_0024:  ldfld      int32 SmtpTest.Program/MyClassField::Value
  IL_0029:  add
  IL_002a:  stfld      int32 SmtpTest.Program/MyClassField::Value
  IL_002f:  ret
} // end of method Program::FieldTest
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
.method private hidebysig static void  PropertyTest() cil managed
{
  // Размер кода:       48 (0x30)
  .maxstack  3
  .locals init ([0] class SmtpTest.Program/MyClassProperty mcp,
           [1] class SmtpTest.Program/MyClassProperty mcp2)
  IL_0000:  newobj     instance void SmtpTest.Program/MyClassProperty::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  ldc.i4.s   113
  IL_0009:  callvirt   instance void SmtpTest.Program/MyClassProperty::set_Value(int32)
  IL_000e:  newobj     instance void SmtpTest.Program/MyClassProperty::.ctor()
  IL_0013:  stloc.1
  IL_0014:  ldloc.0
  IL_0015:  ldc.i4.s   22
  IL_0017:  callvirt   instance void SmtpTest.Program/MyClassProperty::set_Value(int32)
  IL_001c:  ldloc.0
  IL_001d:  dup
  IL_001e:  callvirt   instance int32 SmtpTest.Program/MyClassProperty::get_Value()
  IL_0023:  ldloc.1
  IL_0024:  callvirt   instance int32 SmtpTest.Program/MyClassProperty::get_Value()
  IL_0029:  add
  IL_002a:  callvirt   instance void SmtpTest.Program/MyClassProperty::set_Value(int32)
  IL_002f:  ret
} // end of method Program::PropertyTest
Т.е если вызов поля использует инструкции stfld, ldfld, то вызов свойства организуется аж через callvirt....

Правда что потом было странно - мой профайлер показывал одинаковую скорость работы обеих функций. С офигительной точностью шли тютелька в тютельку. (!)

(?) Возможно что оптимизацию произвел уже Jit компилятор и вытянул их на "один уровень".
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
28.01.2011, 22:30
Цитата Сообщение от Zetway Посмотреть сообщение
я обычно не пишу set
в свойствах таже можно не писать set
C#
1
2
3
4
public int A
        {
            get { return a; }            
        }
В таком случае свойство получается "только для чтения", а изменять его могут только члены внутри класса.
0
 Аватар для Gabberr
105 / 105 / 19
Регистрация: 13.10.2009
Сообщений: 406
09.10.2011, 17:29
про get понятно как использовать :
C#
1
int b = A.A;
А вот как быть с set ?
как потом по средствам set изменить поле a ?

вот так нельзя A.A(4);


Объясните плиз.
0
21 / 21 / 3
Регистрация: 11.07.2010
Сообщений: 63
09.10.2011, 17:34
Обращайтесь как к обычному полю:
A.A = 4;
1
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 42
26.08.2012, 23:32
Zetway, согласен с тобой.
если все ровно можно присвоить/читать значение private объекта вне территории класса и их методов,
то это нарушение инкапсуляции ,,, лучше сделать этот объект public и нормально человечески присвоить/читать значение объекта: object.index=10; и не написать лишних {get;set} , имхо
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
27.08.2012, 00:30
Цитата Сообщение от Zetway Посмотреть сообщение
спасибо, буду знать, но я не об этом. я обычно не пишу set, разве что для группы полей, ради инкапсуляции, если к полю можно свободно обращаться то по-моему это явное нарушение инкапсуляции
в c# введена такая своебразная парадигма - property. то, что ты привел - самое примитивное ее выражение:
C#
1
public int prop {get,set}
это объявляет внутри класса член int prop, и делает его доступным снаружи и для чтения, и для записи.
но это - самый непрактичный пример. самое интересное, это когда поля одноименного вообще нет в природе. например, когда это значение, доступное снаружи, должно быть вычислено из чего-то, полученного с других компьютеров (например). здесь такая инкапсуляция, о которой ты еще никогда не слыхал.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class TestClass {
 
  private const int INVALID_INT_VALUE = -1;// ???
 
  public int prop {
    get { 
      int value = INVALID_INT_VALUE;
             // соединяемся с центром, авторизируемся, получаем доступ, получаем код, вычисляем значение, ...
      value = ;alskjdf ;aslkjdf ;aslkdjf a;slkdjf ;aslkdjf a;slkdjf a;slkdjf sd sd()()()()(){}{}{}{},,,,,,;
      return value;
... 
   }
}
где-то в другом месте, где мы имеем этот класс, мы можем просто сделать так:
C#
1
2
TestClass tc = new TestClass();
int v = tc.prop;
, даже не подозревая, какая интрига (инкапсуляция) за этим скрывается!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.08.2012, 00:30
Помогаю со студенческими работами здесь

Что за конструкция meth?.()
Добрый день Изучаю события, наклепал код public static void Alarm() { if (MyEvent != null) ...

Конструкция this[]: что это
Что за свойство, и как в итоге оно должно себя вести? class MyClass { public static string this ...

Что за конструкция в квадратных скобках?
public void ListOrders() { foreach(OrderMarket market in ClientCache.OrderCache.Markets) { ...

Что это за конструкция - (IPEndPoint)smth?
Столкнулся вот с этим: IPEndPoint epTest = (IPEndPoint)tcpClient.Client.LocalEndPoint; Подскажите пожалуйста, зачем нужно указывать это...

Что за конструкция? var Numbers = new List();
Привет всем, теоретический вопрос. например: Engine engine = new Engine(); engine.Petrol = true'


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru