首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Getter setter差异

Getter setter差异
EN

Stack Overflow用户
提问于 2016-11-04 13:40:32
回答 5查看 107关注 0票数 1

我正在用C#编写getter setter,我可以用样式或语法来编写,他们有什么特定的场景可以使用其中之一吗?封装是从它们两个实现的吗?

示例1:

代码语言:javascript
复制
public List<ChatMessage> MessageListWithoutPrivateVariable { get; set; }

示例2:

代码语言:javascript
复制
public List<ChatMessage> MessageList {
  set {
    messageCollection = value;
  } get {
    return messageCollection;
  }
}
EN

回答 5

Stack Overflow用户

发布于 2016-11-04 13:49:00

一般来说,这两种方式都是这样做的。在C# v3.0之前,程序员不存在第一种可能性。但微软认为,如果程序员能像你之前描述的那样编写速记风格,效率会高得多。

因此,实际上它只是一种缩写形式,也称为自动实现属性。C#会在后台自动生成一个支持字段,因此会授予封装权限。

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

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

票数 5
EN

Stack Overflow用户

发布于 2016-11-04 13:50:44

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-11-04 13:57:06

Example 1C# 3.0中引入的Example 2的简写语法。如果你用C# 2.0编写代码,你应该使用Example 2,但是在3.0之后,你可以像在Example 1中一样使用一个简写版本。

无论如何,如果您需要进行一些操作(或)计算,可以在3.0中/之后使用like Example 2,如下所示。

代码语言:javascript
复制
private List<ChatMessage> messageCollection;

public List<ChatMessage> MessageList {
  set {
    messageCollection = value;
  } get {
    if(messageCollection == null) {
      return new List<ChatMessage>();
    } else {
      return messageCollection;
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40415991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档