Открытый доступ .net - PullRequest
       4

Открытый доступ .net

6 голосов
/ 24 декабря 2009

Я думаю, что это было в .net 2.0, Microsoft представила средство доступа, которое было сокращено до

public string Name { get; set; }

Но есть ли реальная разница между приведенным выше кодом и просто:

public string Name;

Ответы [ 7 ]

6 голосов
/ 24 декабря 2009

Основным отличием является то, что если вам позже потребуется добавить логику в ваш метод получения или установки, а другие библиотеки DLL уже скомпилированы с вашими, вы можете легко изменить

public string Name { get; set; }

в

public string Name { get{/*special code*/} set{/*special code*/} }

и это не будет серьезным изменением для публикации вашей новой библиотеки DLL и не будет перекомпилировать другие библиотеки DLL.


Принимая во внимание, что если вы изменили

public string Name;

в

public string Name { get{/*special code*/} set{/*special code*/} } 

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

Это, очевидно, большая проблема, когда вы отправляете библиотеки DLL другим программистам (например, как проект с открытым исходным кодом или как поставщик компонентов), чем если вы просто создаете приложение для себя / работодателя

4 голосов
/ 24 декабря 2009

Автоматические свойства были впервые введены в C # 3.0. Разница между:

public string Name { get; set; }

и

public string Name;

означает, что первое объявляет свойство , а второе поле . В ООП свойства используются для инкапсуляции полей. Свойство может иметь setter или getter или оба, и вы также можете указать разные уровни доступности для каждого.

4 голосов
/ 24 декабря 2009

Разница между Поле и Свойство . Поле - это просто переменная-член в экземпляре класса. Напротив, свойство является сокращением для двух отдельных действий - получить и установить:

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

private string _name;

Это слишком упрощенный пример, поскольку свойство просто «оборачивает» приватное поле, возвращая его в метод получения и устанавливая его в установщике. Однако свойства становятся очень полезными, когда они становятся «воротами» к базовому значению. Если выполнение программы требует, чтобы что-то происходило каждый раз при установке значения поля (скажем, событие вызывается), его можно запустить из установщика свойства:

set
{
    this.InvokePropertyChangedEvent();
    _name = value;
}

Точный синтаксис, о котором вы спрашиваете, называется Автоматически реализуемые свойства , что является просто сокращением для простого примера, который я привел выше. Компилятор создает приватный член, который получается и устанавливается свойством.

2 голосов
/ 24 декабря 2009

Нет функциональной разницы в том, что касается написания кода для получения значения или его сохранения. Но есть случаи, когда вызывающая сторона может ожидать поле или свойство и будет принимать одно или другое только с помощью отражения. Например, WPF может связываться только со свойством, а не с полем.

2 голосов
/ 24 декабря 2009

Разница между сокращенным объявлением свойства заключается в том, что вы можете определить его следующим образом.

public string Name { get; private set; }

Это означает, что свойство может быть прочитано публично, но только частные члены могут писать в него Вы не можете сделать такую ​​вещь для поля.

Если вы посмотрите на сгенерированный IL из краткие декларации собственности, вы обнаружит, что компилятор добавил / автоматически сгенерированные поля-члены свойство будет читать или писать в.

1 голос
/ 24 декабря 2009

Да, код во второй строке вы делаете доступным непосредственно члену в памяти, тогда как в первой строке у вас есть один уровень косвенности, где вы можете добавить некоторую логику в будущем для проверки и ленивого назначения.

Кроме того, если вы используете отражение, вам придется искать Property Setter и Getter для первой строки примера, а для второй вам нужно будет непосредственно получить переменную-член.

Обычно использование свойств намного лучше.

0 голосов
/ 24 декабря 2009

Одно полезное отличие, которое я нашел для пользователей таблицы свойств, заключалось в том, что публичная строка Name {get; задавать; } мы могли бы легко установить исходные данные в Propertygrid.

при объявлении публичная строка Name; не будет использоваться полностью для Propertygrid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...