Unity (Unity5) 中 c# 中的属性 - 你能避免支持变量吗

Properties in c# in Unity (Unity5) - can you avoid the backing variable

使用 Unity5(很难确切知道使用的是哪个版本的 c#/Mono/.Net),我们做的属性完全像这样:

private int _distance;
public int Distance
    {
    private set
        {
        _distance = value;
        controls.Blahblah(_distance);
        }
    get
        {
        Debug.Log("hah!);
        return _distance;
        }
    }

但是考虑一下c#中新的"automatic properties",好像是

 public int Distance {get; set;}   // ?

但我不知道如何在 getter/setter 中 "do something" ??

或者换句话说,有没有办法在 "manually" 制作 属性 时自动生成支持变量(以及方便 - 使其保密)?

要重复,因为这被标记为重复,我如何 "do stuff" 在自动 属性 习语中 getter/setter ...

...或相反...

如果您编写自己的 "manual" 属性,如何隐藏、删除或自动提供支持者?

请注意,您或其他程序员当然可能会不小心触及 _underscore 支持变量:有什么办法可以避免这种情况吗??

如果您想在 getter/setter 中 "do something",则不能使用自动属性,除了仅分配给该字段。对于您的示例代码描述的用例,自动属性不是一个选项。有一个明确的支持字段没有错。

如果您只有私有变量而没有任何其他逻辑,那么您可以使用自动属性。

Class Something something
{
    public int Distance
    {
    private set
     {
       _distance = value;
     }
    get
     {
       return _distance;
     }
    }

// Keep this at the end of the class
// In visual studio you can collapse region and wont attract
// attention/distracting in your editor.

#region data members
private int _distance;
#endregion data members
}

你可以用public int Distance {get; set;}

代替

但是如果你做其他的操作,比如logging,那么你就得用传统的方式写了。

编辑

全是编码练习。我通常将私有变量包含在 #region p ...#endregion 中。并且只使用属性来设置 - 距离并且从未使用过_distance。它更像是一种编码实践,而不是对您正在做的事情的实际修复。

我这样做的另一个原因是 - 在 WPF 中,我们需要在设置属性时调用 NotifyPropertyChanged 事件。如果我不使用 属性 名称,这将是一个错误。所以这种使用 Properties 而不是私有变量的习惯就一直存在。

您不能使变量不可发现,只是将它们组合在一起以便于阅读,是的,这是人类强制执行的做法。

如果您的 get 和 set 需要像日志记录一样有额外的代码,您必须按照您最初的方式实现它们,如果您只需要获取和设置值,那么自动实现的属性会更好我的意思是第二种方法。

自动属性不允许您在其中执行 'anything'。它们只是 shorthand 用于:

public int Distance
{
    get
    {
        return _distance;
    }
    set
    {
        _distance = value;
    }
}
private int _distance = default(int);

在此属性中使用实际变量没有任何问题,不会影响任何事情。

不过要记住一件事,如果您想在编辑器中编辑变量,则不能使用 属性。您将需要公开一个 public 字段:

public int Distance;