代码之家  ›  专栏  ›  技术社区  ›  Rami Alshareef

将私有成员封装为属性与定义没有私有成员的属性有什么区别?

  •  12
  • Rami Alshareef  · 技术社区  · 14 年前

    封装这样的私有成员有什么区别(性能、内存等)

    private int age;
    public int Age
    {
      get { return age; }
      set { age = value; }
    }
    

    定义这样的属性

    public int Age
    {
      get ;
      set ;
    }
    
    5 回复  |  直到 14 年前
        1
  •  6
  •   Ani    14 年前

    C编译器为其生成的代码 auto-implemented properties 几乎 与您的第一个示例相同(它使用一个私有的支持字段),所以我不会太担心它。

    这个 只有 真正的区别在于它用 [CompilerGenerated] 属性。这不会对获取和设置属性的性能产生任何影响。(作为一个小挑剔,这应该稍微增加组件的二进制文件的大小)。

    我喜欢自动实现的属性,当然除了简洁性之外,它还防止声明类型访问支持字段而不是属性(支持字段是匿名的)。这使得代码更加清晰,通常也使得重构/更改属性实现变得更加容易。

        2
  •  11
  •   cdhowie    14 年前

    在第二种情况下,C编译器将为您生成一个字段,并生成一个getter和setter来访问它。换句话说,您发布的两个代码示例之间没有功能差异。唯一的区别是私有字段的名称,它将由编译器生成。

        3
  •  1
  •   Community CDub    8 年前

    我刚才问过这个问题:

    看见 Correct use of C# properties

    引用答案:

    它们在内部编译形式中是等效的,除非您不能访问第二种形式中编译器生成的私有变量。

    从代码效率的角度来看,它们也是等效的,实时编译器通常直接访问私有变量,而不需要调用访问函数(在运行时环境检查了可访问性等之后)。

    从编码的角度来看,我更喜欢第二个版本,它更紧凑(写的更少,读的更少)。

    第二种语法是在C 3.0中引入的。因此,第一个变体将更兼容旧的编译器。

        4
  •  1
  •   Pieter van Ginkel    14 年前

    不同的是你可以控制getter和setter。

    使用自动实现,您不能执行以下操作:

    private int age;
    
    public int Age
    {
        get { return age; }
        set
        {
            if (age != value)
            {
                age = value;
                OnAgeChanged(EventArgs.Empty);
            }
        }
    }
    
    public event EventHandler AgeChanged;
    
    protected virtual void OnAgeChanged(EventArgs e)
    {
        var handler = AgeChanged;
    
        if (handler != null)
            handler(this, e);
    }
    

    如果您不需要这样做,那么自动实现就足够了。

    与字段相比,使用自动属性实现的主要优势在于,当使用自动属性实现时,稍后希望将实现更改为(例如)上面的实现时,类的接口不会更改。

        5
  •  1
  •   TalentTuner    14 年前

    与第二种情况下的性能相比,没有区别的是用于写入被称为自动属性的属性的合成糖。

    如果您想在集合或获取部分中放入一些逻辑,您将无法执行自动属性。