c#in Unity(Unity5)中的属性-可以避免使用支持变量吗

c#in Unity(Unity5)中的属性-可以避免使用支持变量吗,c#,unity3d,unity5,C#,Unity3d,Unity5,对于Unity5(很难确切知道使用的是什么版本的c#/Mono/.Net),我们的属性完全如下所示: private int _distance; public int Distance { private set { _distance = value; controls.Blahblah(_distance); } get { Debug.Log("hah!);

对于Unity5(很难确切知道使用的是什么版本的c#/Mono/.Net),我们的属性完全如下所示:

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

但在C中考虑新的<强>“自动属性”<强>,这似乎是

 public int Distance {get; set;}   // ?
但我不知道如何“做点什么”在getter/setter中

或者换句话说,当“手动”创建属性时,是否有一种方法可以自动生成支持变量(以及方便性——使其保持私有)

重复一下,因为这被标记为重复,我如何在getter/setter期间在自动属性习惯用法中“做一些事情”

。。。或者反过来

如果您编写自己的“手动”属性,如何隐藏、摆脱或自动提供后台


请注意,当然,您或其他程序员可能会意外地接触到_下划线支持变量:是否有任何方法可以避免这种情况???

如果您想在getter/setter中“做点什么”,除了分配给字段之外,您不能使用自动属性。对于示例代码描述的用例,自动属性不是选项。有一个明确的支持字段没有什么错。

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

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;}

但是,如果您执行其他操作,如日志记录,则必须以传统方式编写

编辑

它的所有编码实践。我通常将私有变量括在
#region p…#endregion
中。并且仅使用设置-Distance的属性,并且从未使用过-Distance。它更多的是一种编码实践,而不是对您正在做的事情的实际修复

我这样做的另一个原因是——在WPF中,无论何时设置属性,我们都需要调用NotifyPropertyChanged事件。如果我不使用属性名,这将是一个bug。因此,在私有变量上使用属性的习惯仍然存在


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

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

自动属性不允许您在其中执行任何操作。它们只是以下方面的简写:

public int Distance
{
    get
    {
        return _distance;
    }
    set
    {
        _distance = value;
    }
}
private int _distance = default(int);
在这个属性中使用一个实际变量没有什么错,它不会影响任何东西

但要记住的一点是,如果要在编辑器中编辑变量,则不能使用属性。您需要公开一个公共字段:

public int Distance;

如果您必须添加更多代码,那么您做得很对。自动属性中不能有额外的代码,它只是一种简写。“自动属性”只是语法上的糖分,可以精确地描述您使用显式支持字段所做的事情,所以它很好。(与自动属性的最大区别在于,支持字段对您是隐藏的,您无法编写任何代码来响应正在读取或写入的属性。)这个问题与unity无关,应该删除标记然后我站出来更正:)@JoeBlow您是对的,它在编译器方面做了很多工作。啊。。很好的解释,谢谢凯。您能否澄清:关于支持变量:在我的示例中,有没有一种方法可以“摆脱”支持变量?(这类支持变量存在许多问题:例如,想象一下它是否被意外地触碰到了其他地方。)无论如何,在我的示例中,现在有没有办法“摆脱”支持变量?谢谢不,你被卡住了。您可以通过约定仅通过定义良好的方法/属性访问操作字段来降低风险。这通常是通过确保团队中的每个人都知道“规则”并进行代码审查来实现的!你太棒了,凯。有什么理由用自动属性代替字段吗?反射和代码统一是我看到的唯一原因,但它们对我来说还不够好。我习惯于使用公共字段而不是公共自动属性,因为出于安全原因,这是相同的解决方案。一个(不是很有说服力)论点是“将来更容易扩展”,但您的IDE可以为您解决这个问题。另一个是调试断点。我认为最好的方法是能够指定一个公共getter和一个私有setter。我认为带有公共设置器的自动属性是一种反模式,应该像公共字段本身一样避免。谢谢Ehsan。。。正如你所看到的,我只是在检查。。有没有一种方法可以“摆脱”示例代码中的支持变量?@JoeBlow对于使用自动实现的属性,您在第二个代码blockquit中有一个关于检查器变量的极好的观点。(在这种情况下,这是一个方便快捷的解决方案——比如说,在开发过程中,您希望从Inspector设置一个属性。我们只需使用另一个普通Inspector变量,然后使用
void OnValidate()
从中设置有问题的属性。这非常方便。或者您可以通过
[SerializeField]公开私有字段。)
在文件中查找…
不应该给你任何点击,除非你要做
对象。.\u variable
在某个地方…嘿,很抱歉混淆了。它在整个类中都是可用的。你可以在visual studio编辑器中折叠区域。这样,当你阅读代码时,不需要的混乱就会隐藏起来。@Mat'smugg顺便说一句,我有一个原因虽然这篇文章在重构方面有很好的观点。我完全有理由使用区域来隐藏使代码混乱的样板代码。这是主观的,但我倾向于在这种情况下使用区域。在上面的场景中,你需要一个非av的私有变量