Позвольте мне только предварить это, сказав, что я знаю, что это, вероятно, вопрос новичка, я пытался найти его и не могу найти для него подходящего ответа (вероятно, задал его неправильно).
Поэтому обычно, когда я хочу использовать другое значение вне его класса, я просто делаю его общедоступным и получаю к нему доступ.
Тем не менее, часто я вижу, что другой код использует частные значения в своем классе, а затем создает отдельные функции для получения и установки значения, например:
private bool fooBar;
public void SetFooBar(bool boolean)
{
fooBar = boolean;
}
public bool GetFooBar()
{
return fooBar;
}
Извините за невежество, а в чем конкретно смысл? Они оба делают по сути одно и то же (по крайней мере, по моей логике новичка). Я знаю, что приватные переменные полезны тем, что они гарантируют, что вы не сможете нарушить функциональность программы, изменив их в другом месте кода, но вы все равно изменяете их в другом месте кода, так что же дает? Почему я вижу, как люди это делают?
Обычно вы не должны создавать поле public
, но должны сделать его общедоступным (например: public bool FooBar { get; set; }
). Использование методов для получения и установки не характерно для С#.
Поскольку некоторые вещи (например, привязки WPF) работают только со свойствами, а не с полями.
Поскольку вы можете захотеть изменить способ извлечения/сохранения значения (не только в памяти) позже
(Обратите внимание, что в C# вы обычно делаете это как свойство, а не методы, как public bool Foo {get; set;}
)
Спасибо за информацию, в следующий раз сделаю это через свойства. Я где-то читал, что смысл делать это с помощью метода заключался в том, чтобы поле оставалось закрытым, и что вы хотите, чтобы они были закрытыми по соображениям безопасности или что-то в этом роде (?). Тем не менее, если я использую public bool Foo {get; set;}
, то я, по сути, делаю это общедоступным полем, верно?
Моя ошибка, я имел в виду, что если я использую public bool Foo {get; set;}
, то я делаю его общедоступным, но чем оно отличается от публичного поля?
@ Mathue24 Mathue24 На самом деле это не причина «безопасности» (особенно потому, что к закрытым членам можно получить доступ через отражение, несмотря ни на что), а скорее причина «хорошего дизайна». Свойства отличаются от полей в пунктах 2, 3, 4 и 5 моего ответа. Свойства Авто (то, что я перечислил) различаются в 2 и 4
Это позволяет изменить способ хранения значения независимо от того, как к нему обращаются внешние пользователи.
Используя функции Getter и Setter, вы можете запрашивать данные из локального кеша или извлекать их из базы данных.
C# поддерживает реализации функций Getter Setter с использованием метода доступа к стилю свойства.
private bool _fooBar
public bool FooBar
{
get { return _fooBar; }
set { _fooBar = value; }
}
Как упоминалось в комментариях БрэдлиДотНЕТ, вы можете написать их так, как напоминает лямбды, начиная с C# 7.0.
private bool _fooBar
public bool FooBar
{
get => _fooBar;
set => _fooBar = value;
}
Как упоминалось в БрэдлиДотНЕТ, вы можете написать эту точную реализацию как
public bool FooBar { get; set; }
Который будет действовать так же.
Вы также можете расширить это, сделав значение общедоступным для получения, но устанавливаемым только в классе.
public bool FooBar { get; protected set; }
А с C# 7 получить можно get => _fooBar
В C# вы должны использовать свойства вместо методов Get/Set, но общий смысл заключается в том, чтобы скрыть реализацию того, как значение сохраняется внутри, и упростить внесение некритических изменений.