2016-05-10 1 views
2
  • Когда мне следует переопределить метод ToString() с помощью свойств класса и когда с полями?
  • Есть ли только один способ, действительный или оба?
  • Если оба варианта в порядке, в каких случаях мы должны использовать каждый из способов?Чтобы переопределить метод ToString() со свойствами или полями?

    public override string ToString() 
    { 
        return String.Format("{0},{1}", this.field1, this.field2); 
        // ..or 
        return String.Format("{0},{1}", this.Property1, this.Property2); 
    } 
    

Пожалуйста, помогите ???

ответ

1

Очевидно, что вы должны переопределить метод ToString, если хотите вернуть строку, которую вы подготовили специально. Это не повторение.

  • Оба способа в порядке, хотя использование свойств настоятельно рекомендуется, потому что у вас будет больше контроля над возвращаемыми значениями.
2

Любое допустимо.

Однако следует учитывать, что свойства более общеприняты как «публичные», тогда как поля обычно считаются «частными» большинством разработчиков C#.

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

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

+0

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

+0

@juharr, что произойдет, если свойства заданы с помощью конструктора, а затем изменены позже? Это изменило бы ожидаемое поведение и было бы невозможно с помощью полевого подхода (без отражения). Возможно, свойства НЕ читаются только ... в вопросе не хватает деталей.Речь идет о правильном инкапсулировании поведения и предотвращении непреднамеренных побочных эффектов. Это может быть или не быть релевантным, поэтому я вызвал его. –

+0

ОК, поэтому из всех ваших ответов я понимаю, что оба пути на самом деле возможны, но с точки зрения выбора в специальном случае полностью зависит от средств функциональности класса в программе. Спасибо за внимание к этой проблеме! Я не могу голосовать за лучший ответ, так как я здесь слишком новый. Привет! – CSharp4eto

0

Часто свойства представляют собой поля, например.

// Property1 represent field1 
    public String Property1 { 
    get { 
     if (null == field1) 
     return "[empty]"; // <- more readable 

     return field1; 
    } 
    } 

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

// Terse C# 6.0 syntax 
    public override string ToString() { 
    return $"{Property1},{Property2}"; 
    } 
0

Если геттер содержит некоторую логику, например. он использует значение поля для вычисления результата, затем использует свойство. Будучи пользователем вашего класса, я был бы удивлен, увидев различные значения в пользовательском интерфейсе (если бы я использовал свойство напрямую) и в трассировке стека, если я использовал ToString().

Отредактировано: По умолчанию классы не должны предоставлять поля экземпляра, которые являются общедоступными или защищенными. Поэтому я рекомендую вам избегать использования полей в ToString(), когда доступны средства, потому что вы можете подвергать уязвимые данные или состояние неправильного объекта.