2010-03-30 2 views
9

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

public int EmployeeAge 
{ 
    get{return intEmployeeAge}; 
} 

И

public int EmployeeAge() 
{ 
    return intEmployeeAge; 
} 

Какой из них лучше и почему? И какая лучшая практика программирования для использования, когда у нас есть секнарио, как указано выше?

ответ

29

Свойства - полезный способ выражения функции объекта, позволяющий получить/установить обычным способом, который может использоваться API-интерфейсами, такими как привязка данных, отражение и сериализация. Поэтому для простых значений объекта, свойства удобны. Свойства не могут принимать аргументы, не должны иметь существенных побочных эффектов * и должны возвращаться быстро и повторяемо. Кроме того, нет такой вещи, как «свойство расширения» (для зеркального отображения метода расширения) и не общего свойства.

(* = отложенная загрузка и т.д. не является редкостью, однако)

метода (C# не имеет функции) лучше для выражения вещей, которые либо изменения состояния, или которые имеют ожидание принятия некоторое время и не обязательно воспроизводимо. Они не склонны работать в привязке/сериализации и т. Д.

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

Так что я бы:

public int EmployeeAge { get{return intEmployeeAge}; } 

или просто (если на Employee объекта):

public int Age { get{return intEmployeeAge}; } 

Конечно ... тогда возникает вопрос "в каком блоке?" Я полагаю, что это годы?

+1

хороший ответ .... –

+0

/согласовано. Проще говоря, свойства предназначены для того, чтобы выставлять частные поля вне класса, чтобы не нарушать изменения, если архитектура классов была пересмотрена. – JoeBilly

+0

@ JoeBilly - ну, вы можете сделать * бит * больше, чем без него, становясь слишком грязным. Но простые так же просто, так они говорят. –

1

Метод возвращает значения после завершения работы, а значение - результат выполняемой работы. Я не думаю, что это то, что вы делаете.

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

По MSDN:

Аксессора из свойства содержит исполняемых заявления связаны с с получением (чтением или вычислением) или установки (записи) имущества. Объявления доступа могут содержать get accessor, аксессуар для набора или и то, и другое. Заявления принимают следующие формы:

public int EmployeeAge 
{ 
    get; 
    set; 
} 

look here Есть, поскольку это дает очень хорошее описание на использовании этих.

0

Я думаю, что это имеет много общего с культурой, в которую вы программируете. Как я вижу, культура C#/.NET будет предпочитает использовать свойство для этого случая.

Мой совет: Старайтесь соответствовать основным библиотекам, которые вы используете.

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

+0

Культура? не получил вашей точки зрения, поскольку в обоих случаях он возвращает только возраст сотрудников. –

+0

По * культуре * Я имею в виду тело кода, которое поставляется с языком/платформой, сообществом разработчиков, использующим их, и библиотеками, которые они создают. –

+0

Я не понимаю вашу ссылку на запах кода. У сложного объекта может быть много свойств, особенно если у него есть несколько предков ... –

5

Если все, что вам нужно сделать, это вернуть значение, используйте свойство.

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

+1

Но в случае свойства я также могу добавить некоторую обработку, которую вы называете «делать что-то», перед возвращаемым значением в свойстве, в приведенном выше случае оба возвращают значение. но что лучше? –

+0

Да, вы можете, но вам нужно подумать о _meaning_. Большинство программистов при вызове свойства не ожидают изменения состояния объекта, но при вызове функции они ожидают этого. – Oded

4

Properties содержит данные объекта

функции определяет поведение

объект Взгляните ->Property Usage Guidelines

2

Какой из них лучше и почему? И какая лучшая практика программирования для использования, когда у нас есть secnario, как указано выше?

Я пишу в C#, однако я предпочитаю использовать Get/Set функции, для меня это просто лучший способ выразить то, что я могу получить от объекта, и как я могу изменить это состояние (и это методы сгруппированы по алфавиту в Intelisense, что тоже приятно). Однако, если команда предпочитает другие соглашения, это не проблема, но когда я работаю над своими собственными проектами, просто читать API.

e.g 

Obejct1 o = new Object1(); 
o.P1; 
o.P2; 
o.P3; 

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

Object1 o = new Object1(); 
o.GetP1(); 
o.SetP2(); 
o.SetP3(); 

Из API можно легко найти, как данные могут быть изменены клиентами типа.

1

Свойство - это простой способ изучить внутренний элемент данных класса. Мы можем реализовать свойства с помощью метода get и set типа safe.Property неявно вызывается с использованием call условного обозначения. Работает над компиляцией и временем выполнения.

Метод - это блок кода, который содержит ряд утверждений. Метод явно вызван. Методы работы во время выполнения.

1

Я немного опоздал на эту вечеринку, но я просто упомянул еще одно удивительное различие между свойством и безпараметрическим методом «получить». Как отмечает @MarcGravell, ленивая загрузка является общей схемой при использовании свойств, но остерегайтесь Heisenberg Watch Window gotcha!

Смежные вопросы