2008-11-17 2 views
2

У меня есть класс, который имеет некоторые свойства. И я хочу что-то, что вычисляет показатель из этих свойств. Так как это тривиальная задача (некоторые дополнения и деления, но ничего впечатляющего).Изменение свойства в методе - любые побочные эффекты?

Так что, естественно, возникает вопрос: «Когда использовать свойство с некоторым кодом в геттере, а также когда использовать функцию?» И that question was already answered.

Теперь я задаюсь вопросом об одном: если - против всех ожиданий - мне когда-либо понадобилось сделать этот Геттер настолько сложным, что он должен быть функцией (например, потому что мне нужно поместить данные или потому, что они могут бросать исключение или что-то еще), легко ли изменить свойство в метод?

Конечно, это действительно кажется тривиальным, просто изменяя

public double Score { 
    get { 
     return Math.Round(A + B/C * D,3); 
    } 
} 

в

public double Score(){ 
    return Math.Round(A + B/C * D,3); 
} 

Но я задаюсь вопросом: Есть ли какие-либо побочные эффекты? Разве что-нибудь сломается при смене вещей, подобных этому? Я могу только увидеть это как возможную проблему, когда задействован Reflection, но что в ситуациях, когда у меня есть 2 Assemblies - тот, который определяет класс и тот, который использует этот класс, и только меняет тот, который содержит класс, не перекомпилируя пользователя сборка. Это возможный источник «странных ошибок, которые почти невозможно отслеживать», или вполне безопасно изменять свойства на методы?

ответ

1

Нет. Есть ни одна из сторон не влияет на это вообще.

Потяните отражатель, вы увидите, что ваши свойство уже методы

Под капотом get и set аксессоров в собственности просто преобразуются в get_MyPropertyName() и set_MyPropertyName() методов. Вот почему вы можете (но обычно не должны) добавлять параметры к свойству.

Единственная «полученная» - это то, что в C# вам нужно будет добавить «()» к любым существующим вызовам.

Также

в соответствии с принципами кодирования, имя свойство обычно существительное (т.е. Score), но методы должны описывать действия (глагол), поэтому правильнее зовут GetScore() или CalculateScore()

+0

Спасибо. Я просто боялся, что есть еще одна скрытая черная магия. Принимая этот ответ, потому что он более сложный, но он поддерживает оба. – 2008-11-17 20:30:10

3

Потяните отражатель, вы увидите, что ваши свойства уже есть методы :)

+0

Да, точно такая же вещь под обложками – 2008-11-17 20:25:54

1

Если вы собираетесь перейти от собственности методы и позволяют компилятору, чтобы показать вам где добавить parethesis, вы можете получить тонкие ошибки в object ting = thing.scoreting будут коробочным двойной для версии имущественного балла, но делегат для версии методы нот поэтому другой код путь приведет где:

public void erm(double param){ //stuff here} 
public void erm(func<double> param) {// different stuff here} 

когда вы звоните в

erm(thing.score) 

с категорией свойств против метода оценки.

1

Побочные действия затрагивают это свойство. У вас будет обновление всех вызывающих абонентов нам методу, а не по умолчанию.

0

Как уже указывали другие - не о чем беспокоиться. Я просто отправляю сообщение, чтобы уточнить, что в соответствии с правилами кодирования имя свойства обычно является существительным (например, Score), но методы должны описывать действия (глагол), поэтому более правильным именем является GetScore() или CalculateScore() :)

Грамматика Нацист в действии :)

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