Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 属性和变量之间的区别是什么_C# - Fatal编程技术网

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

C# 属性和变量之间的区别是什么,c#,C#,我对理解属性和变量感到困惑 public class ABC() { public int A; public int B { get; set; } } A和B的确切区别是什么?在您的示例中,A是类ABC上的公共字段,B是类ABC上的公共属性。具体而言,B是一个。这意味着“幕后”编译器会为您做一些工作,并有效地将您的代码转换为: public class ABC() { private int b; public int A; public int B

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

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

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

在您的示例中,
A
是类
ABC
上的公共字段,
B
是类
ABC
上的公共属性。具体而言,
B
是一个。这意味着“幕后”编译器会为您做一些工作,并有效地将您的代码转换为:

public class ABC()
{
   private int b;

   public int A;
   public int B
   {
       get
       {
          return b;
       }
       set
       {
          b = value;
       }
   }
}

变量是一个变量

属性是公开该变量的特殊类型的方法。由于它是一种方法,因此,除了公开变量之外,您还可以在其中执行其他一些操作

从MSDN:

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

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

默认情况下,属性使用公共访问。可以使用property语句上的访问修饰符调整属性的访问级别,也可以选择将其某个属性过程调整为更严格的访问级别


A是字段,B是属性。属性基本上是getter和setter的语法糖。您定义的类将编译成如下内容:

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的访问将转换为方法调用。属性基本上提供了“变量”的假象,而实际上只是一对巧妙伪装的方法

这一点很重要,因为它允许您声明自己的get和set方法体,该方法体可以验证值或执行其他有趣的操作:

private int b;

public int B {
    get { return b; }
    set {
        if (value < 0) throw new ArgumentOutOfRangeException("value");
        b = value;
    }
}
private intb;
公共int B{
获取{return b;}
设置{
如果(值<0)抛出新ArgumentOutOfRangeException(“值”);
b=数值;
}
}

请注意,大多数属性将使用字段存储其值。除了字段之外,属性很少单独存在。

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

正如许多人指出的,a是字段,B是属性

真正的问题是,你为什么要在意,用什么

我指的是:

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

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

1.字段不能在接口中使用 你不能强制执行一个 对象的公共契约中的字段 通过接口。物业 虽然它很好用

2.验证 而你的申请目前可能 不需要任何验证逻辑来验证 设置一个特定的值,更改 业务需求可能需要 稍后插入此逻辑。在那 将字段更改为属性的点 这对消费者来说是一个突破性的变化 你的API。(例如,如果某人 通过反思检查课堂)

3.二进制序列化 将字段更改为属性是一个简单的过程 如果使用二进制文件,则中断更改 序列化。顺便说一句,这是 VB10的原因之一 自动实现的属性具有 “可绑定”支持字段(即,您可以 表示支持字段的名称 这样,如果您更改了 自动实现的属性 扩展属性,您仍然可以 保持序列化兼容性 通过保留备份字段名 同样(在C#中,你必须改变它) 因为它会生成备份字段 使用无法绑定的名称)

4.许多.NET数据绑定基础结构绑定到属性,但不绑定字段 我听到了双方的争论 不管这是不是件好事, 但事实就是这样 现在就开始工作。(请注意:WPF绑定处理属性)

5.公开一个公共领域是一项艰巨的任务 出于上面列出的许多原因 :)

可能还有更多的原因

我还想指出一个例子,并引用其中的一段话作为结束:

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


变量的定义基本上是为了根据指定给这些变量的修饰符从类或同一类访问值

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

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

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

我的编程指导老师让我们对Java中创建的几乎每个变量都有getter和setter。即使是索引变量,如果它们是在全局类范围内声明的,他也让我们使用getter和setter。我认为这可能有点过分了,但它确实让我成为了一名能手和二传手

getter和setter的真正意义在于,它们很可能不仅仅是设置一个内部变量。大多数setter将执行某种类型的数据验证,以确保可以将数据设置为变量。getter还可以检查返回的数据是否符合某些条件

如果您的属性是私有的,而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
    }
}