C#自动属性包装私有字段?

时间:2013-07-11 09:12:10

标签: c# properties private encapsulation

我可以通过C#中的自动属性封装私有字段吗?当我使用C#属性时,我肯定可以封装私有字段,如。

private string owner;
public string Owner
{
  get { return owner; }
  set { owner=value;}
}

使用自动属性时会发生什么?

public string Owner { get; set; }

那样我只与房产本身互动,对吧?有没有办法使用自动属性来封装私有字段?它是如何工作的?

7 个答案:

答案 0 :(得分:1)

  

有没有办法使用自动属性封装私有字段?

是; 完全自动实现的属性。简单地说:编译器为您声明字段 - 您永远不会直接看到该字段。也许真正的问题应该是:

  

如果我使用自动实现的属性,我可以直接访问基础字段吗?

答案是:不;只需访问该物业。在JIT内联之后,你永远不会知道差异

答案 1 :(得分:0)

没有办法做到你所要求的。

自动属性定义一个字段,但它在编译时隐藏并创建。

如果问题是打字并且您正在使用 Visual Studio

只需键入内部编辑器 propfull 并在TAB上双击, Visual Studio 将自动在其中创建一个属性和字段encapsulatd,其名称由您指定。< / p>

答案 2 :(得分:0)

私有字段在编译时使用唯一名称创建,它在幕后使用。实现自动属性,以便您可以更改类型界面,例如在setter上添加验证。在你的课堂上,你应该引用公共财产。这样,当您将验证添加到setter时,您的类将没有特权通过验证过程(如果要实现验证过程)。

答案 3 :(得分:0)

C#中的默认属性编译为具有公共getter和setter的私有字段。

public string Name{get;set;}

编译到:

private string name
public string Name
{
    get
    {
        return name;
    }
    set
    {
        name = value;
    }
}

(实际上它没有,变量名称不同,它使用访问器/ mutator,但基本上它们是相同的东西)

答案 4 :(得分:0)

对象呈现给外部世界的方式有所不同,具体取决于值是否公开为:

    public string Owner { get; set; }

这是一个属性,或

    public string Owner;

这是一个字段。

如果您有私有变量,则不需要自动属性,因为如果它是您的类中的字段或属性对您无关紧要。如果你以后想要在外部公开它,那就是当你开始使用代码时:

    private string myPrivateValue;

    public string myPrivateValueAsProperty {
        get { return myPrivateValue; }
        set { myPrivateValue = value; }
    }

答案 5 :(得分:0)

您提供的两段代码都不过是相同的,并且在您的情况下会产生相同的效果。但是,使用本地私有属性或者使用支持字段调用它可以用来提供默认值。

private string owner = "I am the Owner";
public string Owner
{
  get { return owner; }
  set { owner=value;}
}

此外,如果想在内部进行任何验证,则使用支持字段。

private string owner = "I am the Owner";
public string Owner
{
  get { return owner; }
  set 
  { 
        if(!string.IsNullOrEmpty(value))
              owner=value;
  }
}

它们有时也用于通知财产。

private string owner = "I am the Owner";
public string Owner
{
  get { return owner; }
  set 
  { 
       owner=value;
       NotifyPropertyChanges("Owner");
  }
}

希望它有所帮助。

答案 6 :(得分:0)

有趣。顺便说一句,在VB.NET中,您还可以从简短的Property声明中获取自动生成的私有字段,但是您可以 直接访问它们并与之交互(如果您需要/需要):

from PyQt4 import QtCore, QtGui

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        first_dock = None

        for i in range(10):
            dock = QtGui.QDockWidget("title {}".format(i), self)
            dock.setWidget(QtGui.QTextEdit()) # testing
            self.addDockWidget(QtCore.Qt.TopDockWidgetArea, dock)
            if first_dock:
                self.tabifyDockWidget(first_dock, dock)
            else:
                first_dock = dock
                dock.raise_()

        tabbar = self.findChild(QtGui.QTabBar, "")
        tabbar.tabBarClicked.connect(self.onTabBarClicked)

    def onTabBarClicked(self, index):
        tabbar = self.sender()
        text = tabbar.tabText(index)
        print("index={}, text={}".format(index, text))

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

自动生成的私有字段名称总是 属性名称,并带有下划线。 (注意:它不是_camelCased,它与_PropertyName相同。)