【问题标题】:Accessing the private field of an auto-implemented property访问自动实现属性的私有字段
【发布时间】:2016-05-09 14:49:36
【问题描述】:

下面,当我尝试使用应该通过自动属性功能自动生成的 _currentTemp 变量时,我收到一条未找到变量的消息:

名称_currentTemp 在当前上下文中不存在。

使用{ get; set; } 应该会自动创建这个私有变量(_currentTemp),对吧?

public class DogTemperature
{
    public double CurrentTemp { get; set; }

    public DogTemperature(double dCurrentTemp)
    {
        _currentTemp = dCurrentTemp;  //***this line***
    }
}

【问题讨论】:

  • “应该是通过自动属性功能自动生成的” - 你能解释一下是什么让你这么想的吗?

标签: c# properties


【解决方案1】:

由自动属性创建的支持字段在源代码中不可用于交互,因为它是由编译器生成的。

如果您想与支持字段进行交互,您需要以详细的方式创建属性。

【讨论】:

  • 另一个有用的帖子:stackoverflow.com/questions/40730/… - 可能有用
  • “无法在源代码中与之交互,因为它是由编译器生成的” 并不正确。后者不排除前者。使用反射,您可以找到并访问该字段。 “不 [直接] 可访问”是更正确的说法。
  • @CodeCaster:反射,我的死敌。
  • 反射本身并没有错,你只需要知道什么时候应用它。
【解决方案2】:

在我看来,如果您只想存储一个值,那么定义这样的属性是完全没有意义的。

double _currentTemp;
public double CurrentTemp
{
   get { return _currentTemp; }
   set { _currentTemp = value; }
}

您在这里所做的只是为私有上下文提供两种设置相同值的方法。您可以直接设置 _currentTemp 字段,也可以设置设置 _currentTemp 字段的 CurrentTemp 属性。如果你没有对该属性做任何事情,那么只需使用默认的 get/set ,如下所示:

public double CurrentTemp { get; set; }

如果您需要在属性中执行更复杂的工作,请继续定义这样的字段。更复杂的工作,例如条件、计算或引发事件:

double _currentTempFarenheit;
double _currentTempCelcius;

public double CurrentTemp
{
   get 
   { 
       if(UseFarenheit)
           return _currentTempFarenheit;
       else
           return _currentTempCelcius;
   }
   set 
   { 
       if(UseFarenheit)
           _currentTempFarenheit = value;
       else
            currentTempCelcius = value;
   }
}

此外,如果您只希望您的属性值由 DogTemperature 类的构造函数设置,那么您应该将设置器设为私有。这将只允许公开阅读该属性。

public double CurrentTemp { get; private set; }

【讨论】:

  • 你可以使用默认的{ get; set; },或者更复杂的get/set计算方式;但这首先取决于财产的使用情况。如果您需要引发 PropertyChanged 事件,冗长的完整属性方法很有用 - 根本没有意义
  • @GeoffJames 是的,当然,使用 PropertyChanged 事件属于我给出的“更复杂”的示例。如果您只是提供一个值而仅此而已,那么使用冗长的方式毫无意义。
  • @CathaIMF:就其本身而言 - 是的;同意。同样,首先取决于属性的使用情况。例如:我倾向于在模型类中没有 INotifyPropertyChanged 实现,并且只使用 { get; set; } 声明。更明显;在 ViewModel 中拥有这些属性是有意义的
【解决方案3】:

基于@Alex Gravely 的回答...

如果我理解您对完整属性的必要性:您可以像这样创建完整属性和支持字段:

private double _currentTemp;

public double CurrentTemp
{
     get { return _currentTemp; }
     set { _currentTemp = value; }
}

然后在DogTemperature 的构造函数中,您只需将CurrentTemp 设置为您传入的双精度:

public void DogTemperature(double temp)
{
    DogTemperature = temp;
}

取决于您想从 CurrentTemp 属性中获得什么用途 - 即在视图中显示并更新它;您可能想阅读实现INotifyPropertyChanged。这是一个链接:https://msdn.microsoft.com/en-us/library/ms229614(v=vs.100).aspx

如果它只是一个普通的旧属性,并且没有用于任何特殊的东西(例如在模型中);那么

public double DogTemperature { get; set; }

财产就足够了;如上所述在构造函数中设置它。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2012-06-30
    • 2013-08-26
    • 2012-02-07
    • 2013-07-09
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多