代码之家  ›  专栏  ›  技术社区  ›  Vijjendra

属性和变量之间的区别是什么

c#
  •  62
  • Vijjendra  · 技术社区  · 15 年前

    我对理解属性和变量感到困惑

    public class ABC()
    {
        public int A;
        public int B { get; set; }
    }
    

    A和B的确切区别是什么?

    8 回复  |  直到 8 年前
        1
  •  67
  •   mfaani    9 年前

    正如许多人指出的,A是 领域 ,B是a 财产

    真正的问题是,你为什么要在乎,以及该用什么?

    我指的是 blog post of Jonathan Aneja

    (它在VB中,但也适用于C)

    所以为什么要在字段上使用属性,原因有五:

    一。不能在接口中使用字段

    你不能强迫存在 对象公共契约中的字段 尽管它工作得很好。

    2。验证

    不需要任何验证逻辑 设置特定值,更改 稍后插入此逻辑。在那里 对于 你的API。(例如,如果某人 通过反思检查你的课程)。

    三。二进制序列化

    如果你使用二进制 序列化。顺便说一下,这是 VB10s的原因之一 可装订的背衬区域(即您可以 表示支持字段的名称 自动实现的属性 扩展属性,您仍然可以 保持序列化兼容性 同样的(在C#你被迫改变它 因为它会生成备份字段

    四。许多.NET数据绑定基础结构绑定到属性而不是字段

    我听到双方的争论 不管这是不是件好事, 但事实是 现在有效。 (注意:WPF绑定在属性上工作)

    5个。公开一个公共领域是 FxCop violation

    因为上面列出的许多原因 :)

    我还想指出 blog post of Jeff Atwood 最后引用它的一句话:

    这里真正重要的是避免编写无关紧要的代码。公共变量周围的属性包装器是无意义代码的本质。

        2
  •  22
  •   cdhowie    15 年前

    public class ABC()
    {
        public int A;
    
        private int backing_B;
    
        public void set_B(int value)
        {
            backing_B = value;
        }
    
        public int get_B()
        {
            return backing_B;
        }
    }
    

    注意,这种转换对于所有C#属性都是正确的——对ABC.B的访问将转换为方法调用。属性基本上提供了“变量”的幻觉,而实际上只是一对巧妙伪装的方法。

    拥有 获取并设置方法体,它可以验证值或执行其他有趣的操作:

    private int b;
    
    public int B {
        get { return b; }
        set {
            if (value < 0) throw new ArgumentOutOfRangeException("value");
            b = value;
        }
    }
    

    请注意,大多数属性将使用一个字段来存储其值。除了田地之外,物业本身很少存在。

        3
  •  4
  •   Tomas Jansson    15 年前

    属性是一种短的getter和or setter。您可以将逻辑添加到 set get 或者使它们成为私有的,这意味着它们不能从外部访问,因为变量总是可以访问的(如果它是公共的)。

        4
  •  4
  •   hemal7735    10 年前

    在C中,任何具有getter和setter的“变量”都称为属性。变量没有getter和setter,这就是教科书上说的。

    我的编程老师让我们几乎对用Java创建的每个变量都有getter和setter。即使是他使用的索引变量,如果在全局类范围内声明,我们也会使用一个吸收器和设置器。我想这可能是杀伤力太强了,但它确实让我成为了一个能手和二传手。

    如果您的属性是私有的,并且您的setter和getter在技术上是公共的,那么任何人都可以访问您的变量并更改它,就像他们对实际的变量具有公共访问一样。因此,实际上,您应该检查您的数据以确保它是有效的,或者进行其他数据检查。

    private int myVariable;
    public int myVariable 
    {
        get 
        { 
           return myVariable; 
        }
        set 
        {
            if (value < 0) 
            { 
               throw new Exception("This is your exception some where else in code");
            }
            myVariable = value; //remember value is something that is
                                //declared automatically
        }
    }
    
    public string FirstName { get; set; }
    

    以上是以下文字的速记法

    private string firstName;
    
    public string FirstName
    {
        get
        {
           //...code here
        }
    
        set
        {
           //...code here
        }
    }
    
        5
  •  3
  •   Aamir    15 年前

    变量是一个变量。

    属性是公开该变量的特殊类型的方法。因为它是一个方法,所以除了公开变量之外,您还可以在其中做一些其他事情。

    Property语句引入属性的声明。属性可以有Get过程(只读)、Set过程(只读)或两者都有(读写)。使用自动实现的属性时,可以省略Get和Set过程。有关详细信息,请参见自动实现的属性(Visual Basic)。

    只能在类级别使用属性。这意味着属性的声明上下文必须是类、结构、模块或接口,并且不能是源文件、命名空间、过程或块。有关详细信息,请参阅声明上下文和默认访问级别。

        6
  •  0
  •   Rob    15 年前

    在你的例子中 A 是班上的公共场地 ABC B 是班上的公共财产 . 明确地, auto-implemented property

    public class ABC()
    {
       private int b;
    
       public int A;
       public int B
       {
           get
           {
              return b;
           }
           set
           {
              b = value;
           }
       }
    }
    
        7
  •  0
  •   Steve Czetty Wilko van der Veen    13 年前

    变量的定义基本上是为了访问一个类中的值,或者根据分配给这些变量的修饰符访问同一个类中的值。

    定义属性时,会为单个属性创建两个方法,因此会产生额外的开销,这是属性的缺点。

    属性的优点是获取或设置类的私有变量的值。

        8
  •  0
  •   Stephan Vierkant null    7 年前

    文章节选:

    字段的主要用途应作为实现细节。 字段应该是私有的或内部的,并且应该通过使用 属性访问器中的代码可以随着类型的特性而更改 在不引入破坏性更改的情况下展开。

    参考: https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-3.0/ms182141(v=vs.80)