2015-10-17 153 views
0

我想知道,当你创建一个自动属性 并调用在main()方法set一个随机值,其中该存储是value
如本例:自动属性



    class Program 
     { 
      static void Main(string[] args) 
      { 
       Example W = new Example(); 

       W.Num = 10; 
       Console.WriteLine("{0}", W.Num); 

       Console.WriteLine("{0}", W.getNum()); 
      } 
     } 



    class Example 
      { 
       private int num; 

       public int Num { get; set; } 

       public int getNum() { return num; } 
      } 

为什么是输出:

回答

0

自动实现的属性使得代码更清洁,因为getter或setter不需要额外的逻辑。编译器实际上为自动实现的属性生成了一个后台字段,但是这个后台字段在代码中是不可见的。

在您的示例中,num字段和Num属性之间没有关联,因此没有理由应该更改num

+0

这就是从我身上遗失的^^。 非常感谢,现在我明白了 – Moutasem

1

因为你是返回num,不Num。并且num未初始化,所以此值为0.

+0

那么使用自动属性有什么好处!是不是用来初始化数据字段?! – Moutasem

+0

你没有初始化字段'num'。在'Example','num'和'Num'类中你有两个不同的属性。 – LINQ

0

这里没有什么异常。

当调用

Example W = new Example(); 

然后最初NUM = 0和Num = 0;

您分配了Num,not num。

0

num你的Example类是多余的。

如果你写了这个前自动属性initialisers加入到C#中,它应该是这样的:

private int num; 

public int Num 
{ 
    get{ return num;} 
    set{ num = value;} 
} 

写作公共public int Num { get; set; }基本上是在幕后同样的事情。没有必要实现getNum()(如Java),因为这相当于int a = w.Num;

+0

所以基本上我们可以声明数据字段为private,同时声明那里“set”和“get”,而不必声明整个另一个属性来完成此操作? – Moutasem

+0

您甚至不必包含数据字段。只要写get set属性就足够了。这些字段由编译器添加,因此您不必担心它们。 –

+0

这是惊人的,现在我明白了,非常感谢 – Moutasem

0

如果使用new关键字,则为您的类创建新实例并重新创建所有对象。

例如;

class Program 
    { 
     static void Main(string[] args) 
     { 
      Example W = new Example(); 

      W.Num = 10; 

      Example W1 = new Example(); 

      Console.WriteLine("{0}", W.Num); //10 
      Console.WriteLine("{0}", W1.Num); //0 
     } 
    } 

这只是您的答案信息;你返回不同的变量。你没有设置它们。