2014-10-07 3 views
0

Этот вопрос может показаться глупым для некоторых, но я хочу понять концепцию позади, у меня есть одно свойство (например, TestNumber) в пределах TestClass.Каков правильный способ вызова свойств внутри класса?

public class TestClass 
{ 
    private uint testNumber=0; 
    public uint TestNumber 
    { 
     get { return testNumber; } 
     set { testNumber = value; } 
    } 

    public TestClass() 
    { 
     TestNumber = 0; 
     // or 
     testNumber = 0; 
    } 
} 

Теперь, если я хочу set или get значение свойства вне класса, я могу просто сделать следующее,

TestClass tc = new TestClass(); 
tc.TestNumber = 10; 

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

testNumber = 0;

или

TestNumber = 0;, поэтому какой из них & Почему?

Спасибо!

+2

Оба являются законными. Но если вы используете свойство, то код * setter * будет выполнен. Этот вопрос (или аналогичный) уже был [задан] (http://stackoverflow.com/q/295104/1997232). – Sinatr

ответ

2

Зависит от того, что вы хотите сделать ...

  • Вы хотите непосредственно установить переменную?
  • Вы хотите вызвать логику сеттера?

    set { testNumber = value; } 
    

    Но когда-нибудь это мощь:

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

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

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

private uint _testNumber = 0; 

По соглашению о команде мы рассматриваем это как показатель того, что эта переменная не должна быть установлена ​​непосредственно, так ничего, что делает необходимо установить его прямо, явно и, очевидно, делать это даже от случайного взгляда на код. (Это также помогает с intellisense, потому что если вы пытаетесь установить «тестовый номер», тогда, когда один из них называет это имя, intellisense по умолчанию будет использовать свойство, а не переменную.)

1

Хотя оба они действительны, последний является лучше, потому что вы можете использовать логику seters/getters (если его более просто вернуть/установить значение заднего поля). Таким образом, у вас есть одна точка доступа для ваших членов, а не много возможных.

1

Почти 99% времени, которое вы хотели бы использовать. Зачем?
Его простые свойства позволяют добавлять логику за сценой, пока ваш код продолжает работать так же, как раньше.
Используя свойство, вы сохраняете головную боль при пропуске некоторых частей при обновлении других, распространяя логику везде, где вы использовали поле в вашем классе.
Вы когда-нибудь задумывались, почему автоматические свойства введены в C#?
Одна из причин заключается в том, что он позволяет использовать свойство, выставлять его по своему усмотрению и продолжать кодирование остальной части приложения, а затем, если вам нужно вставить в него какую-то логику, вы можете сделать это эффективно, не нарушая существующий код! это просто похоже на обычные поля. вы просто пишете свойство в первую очередь, а затем делаете, как хотите.

Have a look at here too. это может быть полезно.

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