【问题标题】:Basic C# property question基本 C# 属性问题
【发布时间】:2010-12-29 14:14:37
【问题描述】:

在 C# 中,属性是否需要引用私有成员变量,或者我可以只声明属性并直接在类代码中使用它们吗?

如果前者是最佳实践,那么这是否排除了使用 C# 属性速记的可能性? IE。

public string FirstName { get; set; }

【问题讨论】:

  • 你不应该公开成员字段——即它们应该是私有的,并且当你需要在你的类之外提供对它们的访问时应该被属性包装。然而,这并不意味着 每个 属性都必须包装一个私有字段。

标签: c# oop properties


【解决方案1】:

属性,当这样实现时:

public string FirstName { get; set; }

自动创建一个私有成员变量(编译器为你做这件事),所以你不必担心。这将与您的行为完全相同:

private string firstName;
public string FirstName { 
    get { return firstName; }
    set { firstName = value; }
}

没有理由不使用自动属性 ​​( { get; set; } )。提供与创建自己的私有成员变量相同的优点。

此外,如果您稍后决定需要进行额外处理(例如,如果您决定在属性设置器中实现 INotifyPropertyChanged),您可以在不更改公共 API 的情况下添加它,而是手动添加一个支持字段。

【讨论】:

  • 创建自己的琐碎属性没有任何优势 - 但您无法创建真正的只读属性(即 no setter,甚至不是私有属性)使用自动实现的属性的只读变量:(
  • 非常正确。使用手动属性而不是自动实现的属性是有原因的(只读属性是原因之一),但对于许多用途,自动属性非常好,而且更易于键入。
  • 您可以执行类似public string FirstName { get; private set; } 的操作。如果有人获得实例,它本身不会保护类的成员,但它适用于基本类型。
  • 乔恩正在谈论做 public string FirstName { get { return something; } },其中某些内容是只读的,并且没有任何设置器。这是自动属性无法处理的一种情况。
  • 没想到还设置了私有变量,感谢指点!
【解决方案2】:

您不需要属性来访问私有字段,但通常认为这是最佳实践。

您可以使用自动属性(简写),直到您需要向属性添加更多功能,例如验证。将其更改为“真实”属性始终是一项非破坏性更改。

【讨论】:

    【解决方案3】:

    这样创建的属性

    public String Caption{ get; set; } 
    

    这将被编译为

    [CompilerGenerated]
    private string <Caption>k__BackingField;
    
    public string Caption
    {
        [CompilerGenerated]
        get
        {
            return this.<Caption>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            this.<Caption>k__BackingField = value;
        }
    }
    

    以上代码是使用反射工具编译后提取出来的。

    【讨论】:

      【解决方案4】:

      它们不需要引用私有成员变量。您可以直接在课堂上使用它们。

      【讨论】:

        【解决方案5】:

        属性不需要引用私有成员变量。但是,最好让他们这样做。如果属性更容易理解,您可以将其视为方法。您可以在其中运行代码。您可以退回任何您想要的东西。您可以调用方法并使用私有成员变量。您甚至可以简单地返回一个常量。

        我几乎在所有情况下都使用私有成员变量。它允许我创建一个只读属性,或者为我的班级之外的人提供一些规则来获取或设置我的班级不必遵循的属性。

        【讨论】:

          【解决方案6】:

          要补充 Reed 的答案,在您的代码内部(在类本身内),成员函数应该遵守这一点并实际使用 Property 而不是实际的私有成员。例如,如果你有这个:

          public string FirstName { get; set; }
          

          你有一个奇怪的方法,叫做 public char GetFirstLetter(),它返回一个人名字的第一个字母,你想这样做:

           public char GetFirstLetter()
                  {
                      return FirstName[0];
                  }
          

          而不是实际使用您的私有变量。当您设置一个属性时,程序员可能已经编写了代码来以特定方式设置它。因此,仅在类方法中使用该属性才有意义。

          【讨论】:

            【解决方案7】:

            C# 可以引用私有变量,如下所示:

            public class A
            {
                private string _b;
            
                public string B
                {
                    get { return _b; }
                    set { _b = value; }
               }
            }
            

            get;set;指定是自动属性,在编译时会为您生成私有变量,以方便您设置代码。

            【讨论】:

              【解决方案8】:

              使用属性是为类中的属性提供控制和安全方法的最佳方式,如果可能,请始终保持属性私有。

              【讨论】:

                【解决方案9】:

                如果你喜欢使用

                public string FirstName { get; set; }
                

                编译器会自动为这个属性添加getter和setter。这不是一个坏习惯。

                这是证据

                如果你声明

                private string firstName;
                        public string FirstName
                        {
                            get { return firstName; }
                            set { firstName = value; }
                        }
                

                这样编译器也会把它当作

                所以不排除... :)

                【讨论】:

                  猜你喜欢
                  • 2010-12-28
                  • 1970-01-01
                  • 2013-08-07
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-03-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多