我正在用C#编写getter setter,我可以用样式或语法来编写,他们有什么特定的场景可以使用其中之一吗?封装是从它们两个实现的吗?
示例1:
public List<ChatMessage> MessageListWithoutPrivateVariable { get; set; }示例2:
public List<ChatMessage> MessageList {
set {
messageCollection = value;
} get {
return messageCollection;
}
}发布于 2016-11-04 13:49:00
一般来说,这两种方式都是这样做的。在C# v3.0之前,程序员不存在第一种可能性。但微软认为,如果程序员能像你之前描述的那样编写速记风格,效率会高得多。
因此,实际上它只是一种缩写形式,也称为自动实现属性。C#会在后台自动生成一个支持字段,因此会授予封装权限。
在某些情况下,您将需要第二种方法,也称为手动属性。例如,如果您想在设置器中使用INotifyPropertyChanged或其他一些值检查。
回答你的问题:使用你喜欢的。或者,如果可能,使用第一种方法,如果需要,使用第二种方法。
发布于 2016-11-04 13:50:44
如果您运行下面的代码,您可以看到,编译器为无变量版本生成了一个私有变量。
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();
}
}
}不需要显式的私有变量,除非你想在你的类内部使用它(字段的访问速度比属性快一点)。
发布于 2016-11-04 13:57:06
Example 1是C# 3.0中引入的Example 2的简写语法。如果你用C# 2.0编写代码,你应该使用Example 2,但是在3.0之后,你可以像在Example 1中一样使用一个简写版本。
无论如何,如果您需要进行一些操作(或)计算,可以在3.0中/之后使用like Example 2,如下所示。
private List<ChatMessage> messageCollection;
public List<ChatMessage> MessageList {
set {
messageCollection = value;
} get {
if(messageCollection == null) {
return new List<ChatMessage>();
} else {
return messageCollection;
}
}
}https://stackoverflow.com/questions/40415991
复制相似问题