В чем разница между свойством readonly и функцией в .net?

Помимо архитектурной точки зрения, мне интересно, есть ли какая-либо разница в .net между свойством readonly и функцией. Являются ли свойства только концептуальными оболочками вокруг функций?

    Private m_Property As String 
    Public ReadOnly Property PropertyGet() As String
        Get
            Return m_Property
        End Get
    End Property

    Public Function FunctionGet() As String
        Return m_Property
    End Function

Разборка IL показывает, что нет разницы, кроме имени, но существуют ли различия на другом уровне? Является ли геттер только функцией в короткой (!?) Руке?


Edit: wow, мне очень жаль, что я не могу отметить несколько ответов.

Первый ответ, который указывал на использование свойств для сериализации, - это путь к просветлению, так как я полностью покинул этот аспект. До этого объяснение свойства vs как "is" vs "does" считается произвольным. Теперь я больше его понимаю.

Я думаю, что консенсус в отношении того, что собственность не занимает много времени, проистекает из "is" /serializable концепция. Если моя собственность ведет переговоры с базой данных, чтобы сохранить значение "is" , она ломается ужасно.

Ответы

Ответ 1

Свойство объединяет обе концепции полей и методов. Фактически, свойство доступно как поле, но основные части кода - это методы. Полевая часть свойства позволяет вам получить доступ к значению, точно так же, как это делает поле, хотя это позволяет вам обмануть эту функцию getter и процедуру установки, если можно так выразиться. Свойства чаще всего используются для управления значением поля, которое назначено или возвращено. И под риском повториться, они доступны как поле.

С другой стороны, функции, процедуры, известные как методы в ООП, являются подпрограммами определения для обработки информации. Должен быть процесс над объектом или частью информации, например, редко встречается имя функции, например DoThis, DoThat... Они могут использоваться по полям или свойствам, но функции известны воздействовать не только на поле, но и контролировать значение над полем. Функции, противостоящие свойствам, могут иметь несколько параметров, необязательные параметры и даже быть дженериками!

Я хотел бы добавить, что, насколько мне известно, свойство не может быть анонимным, но не общим. Внимание, я не говорю, что свойство не может вернуть общий, я говорю, что само свойство не может быть общим. Функция может быть как anonymous, и generic.

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

Ответ 2

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

Обратите внимание, что это не обязательно так; вы можете очень хорошо реализовывать очень легкие функции и очень тяжелые свойства getters, но, как правило, свойство getter обычно не должно ничего больше, чем просто получить значение.

Ответ 3

Там одно важное отличие, если вы используете привязку данных, вы просто не можете привязываться к методу, вы можете привязываться только к свойствам.

Ответ 4

Вся собственность была, вероятно, задумана, чтобы не получить кучу отдельных методов GetSomething(), SetSomething (var x), которые раньше были нормой, например Java в начале 2000-х для доступа к данным. Это позволит избежать публично открытых переменных.

Поверьте, эти классы выглядели ужасно. Я лично считаю, что концепция собственности - отличный скачок в читабельности и структуре.

Ответ 5

да, свойство - это просто концепция высокого уровня над методами Set/Get.

Ответ 6

Свойство такое же, как функция. Но свойство указывает, что вы получаете (или устанавливаете) "свойства" (переменные-члены) объекта и что эти параметры getter/setter не занимают много времени, то есть f.e. вычисляет что-то или запрашивает базу данных. Поэтому они являются полезным синтаксическим сахаром (если они реализованы правильно).

Ответ 7

Ожидается, что свойства

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

Ответ 8

Свойство get/set является синтаксическим сахаром. Readonly в VB - это просто способ указать, что вы хотите получить функцию "

он может выглядеть так: вы должны передавать свойства по ссылке (ByRef) в методы, но, как вы указываете, это функция, которая не является фактическим типом.

Я обычно использую функции для геттеров, когда операция стоит дорого, например. GetCustomersFromDatabase()

Ответ 9

Я хотел бы добавить, как con для использования свойств, что сериализация понимает концепцию свойств и использует их, пока она ничего не знает о методах getter/setter. Кроме того, если вы используете свойство в компактном стиле, например:

public int MyProperty { get; private set; }

вы можете сэкономить немало строк кода из ваших исходных файлов, делая их более читабельными.

Ответ 10

ключевое слово readonly просто означает, что "Дорогой компилятор не ожидает сеттер", и если я это сделаю, наказать меня ". Это решение синтаксиса VB. За кулисами функции и свойства getters одинаковы.

Ответ 11

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

Кроме того, неиндексированные свойства, в отличие от методов, не требуют a() после имени; Я считаю, что индексированные свойства в С# должны использовать [], а не() для их параметров.

Ответ 12

Я только что понял, что вы можете отправлять параметры в свойстве точно так же, как вы делаете это с помощью методов. Это означает, что вы можете написать что-то вроде:

Private _ClientName As String

Public WriteOnly Property ClientName(isValid As Boolean) As String
    Set(value As String)
        If isValid Then
            _ClientName = value
        End If
    End Set
End Property

И тогда вы можете написать это:

ClientName(debt = 0) = "Richard"

Или вот еще одна идея проверить текстовый набор для любого элемента управления меткой:

Public WriteOnly Property OnlyNumbers(label As Label) As String
    Set(value As String)
        If Double.TryParse(value, New Double) Then
            label.Text = value
        End If
    End Set
End Property

Тогда вы можете использовать это так:

OnlyNumbers(lblTotal) = debt

Я не уверен, что это считается "хорошей практикой" или, по крайней мере, "правильным" использованием собственности.