C#:受保护成员字段的命名规则

本文关键字:规则 字段 受保护 成员 | 更新日期: 2023-09-27 17:56:04

在我们的.NET软件组件中,我们使用以下命名约定。当客户从 VB.NET 使用我们的 DLL 时,编译器无法区分distance成员字段和 Distance 属性。您建议使用哪种解决方法?

谢谢。

public class Dimension : Text
{
    private string _textPrefix;
    protected double distance;
    /// <summary>
    /// Gets the real measured distance.
    /// </summary>
    public double Distance
    {
        get { return Math.Abs(distance); }
    }
}

C#:受保护成员字段的命名规则

不应使用受保护的字段,因为无法保护版本控制和访问。请参阅现场设计指南。将字段更改为属性,这也将强制您更改为名称(因为不能有两个同名的属性)。或者,如果可能,将受保护字段设为私有。

若要使属性设置仅对继承类可访问,请使用受保护的 setter:

public class Dimension : Text
{
    private string _textPrefix;
    private double _absoluteDistance;
    /// <summary>
    /// Gets the real measured distance.
    /// </summary>
    public double Distance
    {
        get { return _absoluteDistance  }
        protected set { _absoluteDistance = Math.Abs(distance); }
    }
}

尽管这确实会导致 get 和 set 之间的分歧,因为功能并不相同。在这种情况下,也许单独的受保护方法会更好:

public class Dimension : Text
{
    private string _textPrefix;
    /// <summary>
    /// Gets the real measured distance.
    /// </summary>
    public double Distance { get; private set; }
    protected void SetAbsoluteDistance(double distance)
    {
        Distance = Math.Abs(distance);
    }
}

好吧,总结已经说过的内容,您可以做这样的事情:

public class Dimension : Text
{
    private string _textPrefix;
    private double _rawDistance;
    /// <summary>
    /// Gets the real measured distance.
    /// </summary>
    public double AbsoluteDistance
    {
        get; private set;
    }
    /// <summary>
    /// Gets the raw distance
    /// </summary>
    public double RawDistance
    {
        get { return _rawDistance; }
        protected set { _rawDistance = value; AbsoluteDistance = Math.Abs(value); }
    }
}

当设置RawDistance的值时,它也为AbsoluteDistance设置值,因此不需要在"绝对距离"getter调用Math.Abs()