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;
使用 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;