在课堂内设置属性或字段?

时间:2011-02-25 10:33:07

标签: c# .net properties automatic-properties

我正在学习属性,我不确定以下内容:

class X
{
  private int y;

  public X(int number)
  {
    this.Y=number; // assign to property
    OR
   this.y=number //?
  }

  public int Y;
  {
    get; set;  
  }

}

7 个答案:

答案 0 :(得分:1)

使用自动属性(get; set;或其变体)时,无法访问支持变量。在大多数情况下,这些可以被视为简单的变量,尤其是内部变量。

如果您需要在mutator中执行自定义验证或变异逻辑,或者需要显式支持变量,则不能使用自动属性,但必须写入存根getset方法你自己。

答案 1 :(得分:1)

他们做不同的事情;我会Y = number;删除(未使用的)字段y。在自动实现的属性中,编译器创建它自己的字段(在C#中无法看到可怕的名称) - 您不需要提供自己的字段。所以:

class X
{
  public X(int y)
  {
    Y = y;
  }
  public int Y { get; set; }    
}

其他要点:将number更改为y以使调用者更清楚,而且您不需要this.,因为它不含糊不清(字段与参数等)

答案 2 :(得分:1)

仅分配给表示该字段的属性内的字段(private int y)(public int Y {get; set})。否类中的其他位置应将后备字段分配给直。总是通过属性来做...即使在构造函数中也是如此。它源于不重复自己( DRY )的原则。

这是推荐的,因为以后您希望将某些行为与该分配相关联时,您只有一个地方(设置访问者)将代码写入....并非所有场地被分配到的地方!!

   class X   
   {   
    private int y; //not strictly necessary but good for documentation

    public X(int number)
    {
        Y = number;
    }

    public int Y { get; set; }


    }

答案 3 :(得分:0)

当您使用autoproperties时:

  public int Y;
  {
    get; set;  
  }

你不需要私有财产,因为它是自动生成的。所以你的课程将是:

class X
{   
  public X(int number)
  {
    Y = number;
  }

  public int Y // no semicolon here, comment added for edit length
  {
    get; set;  
  }
}

希望这有帮助

答案 4 :(得分:0)

您有两种选择:

class X
{
    private int y;

    public int Y
    {
        get { return y; }
        set { y = value; }
    }

    public X(int number)
    {
        Y = number;
        //equivalent to 
        y = number;
        // but you should use the public property setter instead of the private field
    }
}

或使用自动属性,它甚至更简单:

class X
{
    private int y;

    public int Y
    {
        get; set;
    }

    public X(int number)
    {
        Y = number;
    }
}

答案 5 :(得分:0)

当不使用自动属性时,我总是使用属性设置器,因为在我需要执行的setter中可能存在或将存在代码。此代码可以是域检查或引发诸如PropertyChanged之类的事件。

答案 6 :(得分:0)

我通常会尝试访问支持变量:

有时,公共getter可能包含复杂的数据验证,引发属性更改事件或某些外部代码更改其值时触发的其他复杂代码。

当更改内部(来自类内)时,如果您的目的是跳过来自公共设置器的所有验证和事件,则直接使用支持变量可能是一个有效点。这就像说“我是班级实例,我知道我在做什么”。通过这种方式,公共安装人员就像一只守护狗,消毒外部输入,而我仍然可以在内部将财产设置为我需要的任何东西。

class X   
   {   
     private int y; //not strictly necessary but good for documentation

    public X(int number)
    {
        y = GetYValueFromDB();  //we assume the value from DB is already valid

    }

    public int Y { 
       get{ return y}; 
       set { 
       if (ComplexValidation(value)
         {
           RaiseOnYPropertyChanged();
           y = value;
         }
        }


    }