Тот факт, что класс может получить к нему доступ, не обязательно является недостатком. Он все еще логически заключен в том же объекте.
То, что вы после , невозможно так, как вы хотите. Переменные-члены видны во всех областях класса, а локальные переменные ограничены определенной областью.
То, что вы могли бы вместо этого сделать, это поместить объект в класс контейнера. Этот класс является вашей переменной-членом. Возвращая IWGSLocation
, вы просто переходите к классу контейнера:
public class LocationContainer
{
public IWGSLocation InnerLocation { get; private set; }
public void SetLocation(WGSLocation loc)
{
InnerLocation = loc;
}
}
private readonly LocationContainer _container = new LocationContainer();
public IWGSLocation Location
{
get
{
if (_container.InnerLocation == null)
{
_container.SetLocation(...);
}
return _container.InnerLocation;
}
}
Это не остановит класс от прикосновения к _container
, но заставит других разработчиков подумать дважды, прежде чем они это сделают, и они не смогут случайно изменить местоположение без явного вызова SetLocation
.
Вы могли бы даже тогда установить однократную охрану в SetLocation
контейнера.
Обновление: Я бы на самом деле использовал здесь ленивый класс, что-то вроде:
private readonly Lazy<IWGSLocation> _location = new Lazy<IWGSLocation>(()
=>
{
var l = new WGSLocation();
l.Latitude = Latitude.GetValueOrDefault(0);
l.Longitude = Longitude.GetValueOrDefault(0);
return l;
});
public IWGSLocation Location
{
get { return _location.Value; }
}
Имейте в виду, это было скомпилировано головой! : -)