Unity中的c#中的属性(Unity5) – 可以避免支持变量

使用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期间在自动Property idiom中“做东西”……

……或相反……

如果您编写自己的“手动”属性,如何隐藏,摆脱或自动供应支持者?

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

如果你想在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;} public int Distance {get; set;}

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

编辑

它的所有编码实践。 我通常将私有变量括在#region p ...#endregion 。 并且仅使用属性进行设置 – 距离并且从未使用_distance。 它更像是一种编码实践,而不是对你正在做的事情的实际修复。

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

你不能让变量不可发现,只是将它们分组在一起以便于阅读,是的,这是人类强制实践。

自动属性不允许您在其中执行“任何操作”。 它们只是简写:

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

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

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

 public int Distance; 

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