• c#进阶理解property属性和属性值之惑


    目录

    1 简单demo 

    2 使用reflactor分析

    3 使用属性的提醒 

    4 我对属性的理解

    5 属性需要定位吗? 

    6 扩展阅读 

     1 简单demo

    以下是一个常见的属性的使用。其中Name 属性没有定义私有字段,而AGE定义了已有字段。

    public sealed class Employee { 
    // This property is an automatically implemented property 
    public String Name { getset; } 
    private Int32 m_Age; 
    public Int32 Age { 
    get { return(m_Age); } 
    set { 
    if (value < 0// The 'value' keyword always identifies the new value. 
    throw new ArgumentOutOfRangeException("value", value.ToString(), 
    "The value must be greater than or equal to 0"); 
    m_Age 
    = value; 


    }

    2使用reflactor分析

    public sealed class Employee
    {
        
    // Fields
        [CompilerGenerated]
        
    private string <Name>k__BackingField;
        
    private int m_Age;

        
    // Methods
        public Employee()
        {
            
    base..ctor();
            
    return;
        }

        
    // Properties
        public int Age
        {
            
    get
            {
                
    int CS$1$0000;
                CS$
    1$0000 = this.m_Age;
            Label_000A:
                
    return CS$1$0000;
            }
            
    set
            {
                
    bool CS$4$0000;
                
    if (((value < 0== 0!= null)
                {
                    
    goto Label_0023;
                }
                
    throw new ArgumentOutOfRangeException("value"&value.ToString(), "The value must be greater than or equal to 0");
            Label_0023:
                
    this.m_Age = value;
                
    return;
            }
        }

        
    public string Name
        {
            [CompilerGenerated]
            
    get
            {
                
    string str;
                str 
    = this.<Name>k__BackingField;
            Label_0009:
                
    return str;
            }
            [CompilerGenerated]
            
    set
            {
                
    this.<Name>k__BackingField = value;
                
    return;
            }
        }
    }
    Collapse Methods
    image 

    我们可以看到他自动生成了:

    1 SET 方法

    2 Get方法

    3使用属性的提醒:

    1  属性可以是只读或者只写或读写皆可,而字段通常是可读可写。

    2 对属性赋值或取值时可以进行逻辑处理,而字段不可用。

    3 属性不能Ref 和Out ,字段可以。

    4 属性的读取可能花费较长时间,总是比字段长。在一些需要更快的读写的场合可以使用字段。

    5 在一行代码中多次调用属性可能不一样。如取时间。听说这是MS的一个败笔。

         属性是这样的成员:它们提供灵活的机制来读取、编写或计算私有字段的值。 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。 这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。--来自MSDN的解释

    4我对属性的理解:

    属性与字段的异同:

       相同:都是表示类的一个数据(如人的身高、体重等)。

       不同:属性对外部和派生类开放。这也解释了为什么需要加逻辑验证。

                    字段对内部开放。提供更快的性能,更少的验证,信任程序员。

    5 属性需要定位吗?

    用以上的准则为指导。那么遇到下面的情况又该怎么办?

    public sealed class Good {
          // This property is an automatically implemented property
          public Int32 Guality { get; set; }
          private Int32 _price;
          public Int32 Price {
              get { return (_price); }
              set {
                  if (value < 0) // The 'value' keyword always identifies the new value.
                      throw new ArgumentOutOfRangeException("value", value.ToString(),
                      "The value must be greater than or equal to 0");
                  _price = value;
              }
          }

          //性价比
          public Int32 CostPerformance {
              get {
                  return Guality / _price;
              }
          }

      }

    属性的定位应该是怎么样?什么时候用属性?性价比算是他的一个数据吗?应该是使用方法的形式还是属性的形式?如果是以属性的方式提供那么他不是与方法的定位冲突了吗?

    欢迎讨论!

    6扩展阅读

    Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。

    C#中属性的一个容易搞错的问题 即:SET和GET的不一定一样

    C#中的属性

    第三回:历史纠葛:特性和属性

    属性(C# 编程指南)


    系列索引

     C#功能派的进阶2--类型的那些事

  • 相关阅读:
    【LeetCode】048. Rotate Image
    【LeetCode】036. Valid Sudoku
    【LeetCode】060. Permutation Sequence
    【LeetCode】001. Two Sum
    【LeetCode】128. Longest Consecutive Sequence
    【LeetCode】081. Search in Rotated Sorted Array II
    【LeetCode】033. Search in Rotated Sorted Array
    顺时针打印矩阵
    矩形覆盖
    二维数组中的查找
  • 原文地址:https://www.cnblogs.com/facingwaller/p/advance_in_csharp_about_pro6.html
Copyright © 2020-2023  润新知