私有范围的变量仅用于属性内

Ant*_*ott 3 c# properties

是否有可能有一个变量,它是一个类中的实例变量,但只能由特定的属性访问?

我经常创造像这样的"自我创造"属性......

private IWGSLocation _location;
public IWGSLocation Location
{
    get
    {
        _location = _location ?? new WGSLocation();
        _location.Latitude = Latitude.GetValueOrDefault(0);
        _location.Longitude = Longitude.GetValueOrDefault(0);
        return _location;
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着WGSLocation每次访问该属性时,我都不会重新创建一个新的(或者我需要的任何其他类型的对象,创建起来可能很昂贵,或者可能只需要创建一次).缺点是我的类可以访问_location变量.但我真的不想要它,所以如果有任何方法有一个只能在属性本身内使用的实例变量?

我正在思考这些问题......

public IWGSLocation Location
{
    get
    {
        WGSLocation _location = _location ?? new WGSLocation();
        _location.Latitude = Latitude.GetValueOrDefault(0);
        _location.Longitude = Longitude.GetValueOrDefault(0);
        return _location;
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 5

我同意拥有持久性本地化是一个很好的语言特性- 即,其生命周期基于实例的生命周期但其范围(程序文本的区域,通过名称访问变量是合法的)的变量是当地的.像某些语言一样,拥有"静态"本地人也会很不错.

遗憾的是,这不是C#的一个功能,我们没有计划添加它.很高兴拥有,但很高兴不足以证明费用,或推迟或取消"更好的"功能.

它只是"很高兴",因为当然如果你有一个私有字段,它已经是该类的私有实现细节.如果您不希望它在属性外部使用,则不要编写在属性外部使用它的代码.如果你的一个同事试图这样做,那就在代码审查中把它们放在一边.

我想我可能会补充一点:在编写改变状态的属性getter时要非常小心.默认情况下,在查看调试器中的对象时会对属性getter进行求值,调试某些内容并让调试器更改字段值只是因为您正在检查对象,这可能非常令人困惑.