【问题标题】:Setting property or field when inside of class?在课堂内设置属性或字段?
【发布时间】:2011-07-04 05:19:02
【问题描述】:

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

class X
{
  private int y;

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

  public int Y;
  {
    get; set;  
  }

}

【问题讨论】:

标签: c# .net properties automatic-properties


【解决方案1】:

关于访问支持变量,我通常会尝试说明一点:

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

在内部(从类内部)更改该值时,如果您的意图是跳过来自公共 setter 的所有验证和事件,那么直接使用支持变量可能是一个有效点。这就像说“我是班级实例,我知道自己在做什么”。这样,公共设置器就像看门狗一样,清理外部输入,而我仍然可以在内部将属性设置为我需要的任何内容。

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;
         }
        }


    }

【讨论】:

    【解决方案2】:

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

    这是推荐的,因为将来无论何时您想关联一些由该分配触发的行为,您只有一个地方(set 访问器)可以将代码写入......不是全部字段分配到的地方!

       class X   
       {   
        private int y; //not strictly necessary but good for documentation
    
        public X(int number)
        {
            Y = number;
        }
    
        public int Y { get; set; }
    
    
        }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你有两个选择:

        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】:

          当您使用自动属性时:

            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;  
            }
          }
          

          希望对你有帮助

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

              • 那么当我不想暴露“支持”变量时,使用它们有什么好处呢?我现在无法访问它
              • 自动属性的优势在于,当您不需要执行任何属性逻辑时(特别是在 mutator 中的情况),您可以节省相当多的样板代码。
              • @Cocodrilo 你可以通过Y,在大多数情况下应该自动内联。
              • @Marc Gravell:好吧,但是任何其他类都可以更改 Y 的值,所以它就像公共字段
              • @Cocodrilo 它可以是 {get;private set;} 如果您希望它在 epublic API 上只读
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多