get set



Get set

Автор M задал вопрос в разделе Другие языки и технологии

C# get и set и получил лучший ответ

Ответ от Алекс Красс[гуру]
Одним из соглашений объектно-ориентированного программирования и разработки является инкапсуляция данных. Инкапсуляция данных означает, что поля типа НИ В КОЕМ СЛУЧАЕ не следует открывать для общего доступа, так как в этом случае слишком просто написать код, способный испортить сведения о состоянии объекта путем ненадлежащего применения полей. Банальный пример, поле возраста: people.age = -5 рушит всю логику. Особенно если вы работаете в команде или забыли за что это поле отвечает и задали неправильное значение. То есть соглашения устраняют потенциальные ошибки, которые вы можете совершить по неосторожности.
Есть и другие причины для инкапсуляции доступа к полям данных типа. Допустим, вам нужен доступ к полю, чтобы что-то сделать, разместить в кэше некоторое значение или создать какой-то внутренний объект, создание которого было отложено, причем обращение к полю не должно нарушать безопасность потоков. Или, скажем, поле является логическим и его значение представлено не байтами в памяти, а вычисляется по некоторому алгоритму.
Каждая из этих причин заставляет при разработке типов, во-первых, помечать абсолютно все поля как закрытые (private), во-вторых, давать пользователю вашего типа возможность получения и задания сведений о состоянии через специальные методы, предназначенные исключительно для этого. Методы, выполняющие функции оболочки для доступа к полю, обычно называют аксессорами (accessor). Аксессоры могут выполнять дополнительную зачистку, гарантируя, что сведения о состоянии объекта никогда не будут искажены.
private string _myString;
public string getMyString()
{
return _myString;
}
public void setMyString(string value)
{
_myString = value
}
Как видите, у инкапсуляции данных есть два недостатка: во-первых, из-за реализации дополнительных методов приходится писать более длинный код, во-вторых, вместо простой ссылки на имя поля пользователям типа приходится вызывать соответствующие методы. Но благодаря свойствам, этого можно избежать.
Поэтому код:
public string myString { get; set; }
Является заменой вот такого кода:
private string _myString;
public string myString
{
{ return _myString; }
{ _myString = value; }
}
Который на самом деле должен выглядеть как-то так без свойств:
private string _myString;
public string getMyString()
{
return _myString;
}
public void setMyString(string value)
{
_myString = value
}
И все потому, что бы не делать потенциальных ошибок и следовать ООП парадигме и ее правилам. Даже если вы считаете, что данные никак нельзя испортить, лучше иметь привычку делать все правильно. И согласитесь, писать одну строчку кода свойств взамен аксессоров в пять строк и их вывод, это очень разные вещи.
Ну и да, закрытое свойство при использовании свойств генерируется автоматически и его не обязательно объявлять.Алекс Красс
Просветленный
(39782)
Это подразумевается во втором абзаце ответа, но не акцентировано явно. Я предполагаю автора интересовало больше почему не используется прямое обращение к открытому полю вместо свойства, поэтому ответ по сути вопроса и дан. Текст взят из CLR via C# и немного подредактирован под требования.

Ответ от Sawoot[гуру]
Синтаксический сахар. Просто для сокращения количества кода.
Кста, хз как до них, но в интерфейсах так же можно указывать проперти.
public interface ITestInterface
{
string MyString { get; }
}
При имплементации в классе будет
public string MyString { get; private set; }

Ответ от [гуру]
Теоретически, в таком "пустом" свойстве никакого смысла.
Практически - кое-какие библиотеки (например, использующие рефлексию - типа сериализаторов, или какие-нибудь привязки данных к GUI) могут работать только со свойствами или, наоборот, только с полями. Приходится извращаться.

Ответ от Diablo[гуру]
например можно сделать так
public string myString
{
get { return _myString + "some text"; }
set { _myString = value; }
}

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с ответами на Ваш вопрос: C# get и set
спросили в C++ Книги о C++
Чем отличается коренным образом класс от структуры в c#
class C {
public int Value { get; set; }
public C(int value) {
Value = value;
}
подробнее...

Как по английски Ready-steady?
Для спортсменов : On your marks - get set - go! (На старт - внимание - марш! )
Но, например,
подробнее...

C# реализация таймера.
using System;
using System.Threading;
namespace Example {
public class Program {подробнее...
Ответ от 3 ответа[гуру]
Привет! Вот еще темы с похожими вопросами:

Timer C#
using System;
using System.Timers;
namespace Example {
public class Program {подробнее...

Как будет по английски"под кайфом","плохо дело"и "подстава"?
1)под кайфом — stoned
ловить кайф от (рд. ) — get / take off (on); (от наркотиков тж. ) go
подробнее...

Как может переводиться "sodbollocks" ? без всякого контекста, написано правильно
Чушь собачья это очень мягко, скорее "бл*дская ху*ня".
Tmin
(12773)
Если
подробнее...

Для чего нужны статические классы? (C#)
Ярким примером статического класса служит класс Console который имеет туеву хучу свойств и методов,
подробнее...

В чём различие get и set в Java?
private int value;

public int getVal() {return value;}
public void setVal(int v) {value =
подробнее...
спросили в Другое STW
Что значит Sad boys (заранее говорю это не значит - грусные мальчики)?
Sad boys - в разговорно-сленговом варианте: охламоны, растяпы, недотёпы, зануды.
Естественно,
подробнее...
спросили в Музыка Final Fight
Помогите найти песню со словами Oh my God
Oh My God

It's not how you're thinking
Like you've been right
You've been
подробнее...
спросили в Кременец
Скачать GTA SAN ANDREAS
ЛиЦеНзИя ЗдЕсЬподробнее...
Gets на Википедии
Посмотрите статью на википедии про Gets
Геттер программирование на Википедии
Посмотрите статью на википедии про Геттер программирование
Стандартная библиотека шаблонов на Википедии
Посмотрите статью на википедии про Стандартная библиотека шаблонов
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*