2016-11-04 44 views
2

我正在用C#编写getter setter,我可以使用样式或语法编写,他们是否有任何特定场景何时使用它们?封装是从两者中实现的?Getter setter差异

实施例1:

public List<ChatMessage> MessageListWithoutPrivateVariable { get; set; } 

实施例2:

public List<ChatMessage> MessageList { 
    set { 
    messageCollection = value; 
    } get { 
    return messageCollection; 
    } 
} 
+0

第二个与第一个隐含地实现的相同;所以没有理由使用其中一个。另一方面,如果get/setter中有更有趣的事情发生,那么差异,原因和好处是显而易见的。 – ChiefTwoPencils

+1

这两者之间的唯一区别在于,在方法本身内部使用get或set方法之前,实际上可以在第二个方法中执行一些检查。 –

+0

可能的重复 - http://stackoverflow.com/questions/8116951/any-reason-to-use-auto-implemented-properties-over-manual-implemented-properties – RBT

回答

5

一般而言两种方式这样做。在C#v3.0之前,第一种可能性不适合程序员。但是微软认为,如果程序员能够像你先描述的那样写速记风格,效率会更高。

所以实际上它只是缩写形式,也被称为自动执行的属性。 C#在后台自动生成一个后台字段,因此封装被授予。

在某些情况下,您将需要第二种方法,也称为手动属性。例如,如果您想在设置器中使用INotifyPropertyChanged或其他值检查。

要回答你的问题:使用你喜欢的。或者如果可能的话使用第一种方法,如果需要使用第二种方法

0

正如你可以看到,如果你运行下面的代码,编译器为变量免费版本生成一个私有变量。

using System; 
using System.Reflection; 

namespace SO40415991 
{ 
    class MyClass 
    { 
    public int MyFirstValue { get; set; } 

    private int m_mySecondValue; 
    public int MySecondValue 
    { 
     get { return m_mySecondValue; } 
     set 
     { 
     m_mySecondValue = value; 
     } 
    } 

    } 


    class Program 
    { 
    static void Main(string[] args) 
    { 
     FieldInfo[] fis = typeof(MyClass).GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 

     foreach (var fi in fis) 
     { 
     Console.WriteLine($"{ fi.Name} {fi.IsPrivate}"); 
     } 

     Console.WriteLine(); 
     Console.WriteLine("END"); 
     Console.ReadLine(); 
    } 
    } 
} 

,除非你想用它在内部你班有没有必要明确地私有变量(一个场稍快比属性访问)。

0

Example 1是在C# 3.0中引入的Example 2的简写语法。如果您在C# 2.0中编码,则应该使用Example 2,但在3.0之后,可以使用如Example 1中的简写形式。

无论如何,如果你需要做一些如下操作(或)计算,你可以在3.0之后使用像Example 2

private List<ChatMessage> messageCollection; 

public List<ChatMessage> MessageList { 
    set { 
    messageCollection = value; 
    } get { 
    if(messageCollection == null) { 
     return new List<ChatMessage>(); 
    } else { 
     return messageCollection; 
    } 
    } 
} 
+2

这似乎是一个坏主意,返回一个新的列表而不是先将它分配给'messageCollection'。有人可能会调用'obj.MessageList.Add(item)'而不会得到他们期望的结果。 –

+0

哈哈,这不是一个答案,而是解释他在哪里使用完整的财产,而不是速记:-) – Aruna

0

{get;组; }被称为“自动属性”,本质上是一个简写(你的“示例2”) 当你写{get;组; } - 编译器会生成类似的代码(如例2)。

0

两者相同但不同。

只要你不提供额外的定义,既表示行为 一样的,像下面

public int weight { get; set; } 

private int _weight; 
public int weight 
{ 
    get { return _weight;} 
    set { _weight = value;} 
} 

但是,让我们考虑另一种情况,如果体重> 40,你要定义不同的东西是什么。它可以修改后台字段_weight,也可以更改其他私有变量(_charge)。

public int weight 
    { 
    get { return _weight; } 
    set 
    { 
     _weight = value; 
     if (_weight > 40) 
      _charge = _weight * 2; 
     else 
     _charge = _weight * 1; 
    } 
    } 

    private int _charge; 
    public int Charge 
    { 
    get { return _charge; } 
    set { _charge = value; } 
    } 

当你想在你的财产上应用一些业务逻辑时,它会产生巨大的差异,就像上面一样。