我可以通过C#中的自动属性封装私有字段吗?当我使用C#属性时,我肯定可以封装私有字段,如。
private string owner;
public string Owner
{
get { return owner; }
set { owner=value;}
}
使用自动属性时会发生什么?
public string Owner { get; set; }
那样我只与房产本身互动,对吧?有没有办法使用自动属性来封装私有字段?它是如何工作的?
答案 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相同。)