我刚刚开始学习c#,而且我对getter和setter的简写有点挣扎.
据我了解,下面的两种方法是等效的.它是否正确?
//Method 1
public string name { get; set; }
//Method 2
private string name
public string getName() { return name;}
public string setName(string newName) { this.name = newName; }
Run Code Online (Sandbox Code Playgroud)
其次,如果我们想要在getter/setter和实例变量上使用不同的访问修饰符,这是如何工作的.以下代码错误,告诉我访问者必须比属性更具限制性,并且我无法为烦恼访问器指定修饰符.有人可以澄清一下吗?
private int maxTime { public get; public set; }
Run Code Online (Sandbox Code Playgroud)
编辑:澄清一下,我没有具体的目标,只有理解.我不明白这个简写符号是做什么的.在其他语言中,我有私有实例变量,并使用公共getter和setter来管理这些实例变量.如果我自己写出方法,它就允许这样做,但不能用这个简写符号.为什么是这样?
编辑2:检查我的理解的最后一个问题.下面的两个代码片段都使用属性来管理maxTime变量.两者之间的唯一区别是风格.它是否正确?
private int maxTime;
public int MaxTime{ get; set; }
Run Code Online (Sandbox Code Playgroud)
VS
private int maxTime;
public int MaxTime
{
get { return maxTime; }
set { maxTime= value; }
}
Run Code Online (Sandbox Code Playgroud)
Zoh*_*led 15
private int maxTime { public get; public set; }您可以编写一个将填充私有字段的属性,而不是错误的:
private int maxTime;
public int MaxTime
{
get { return maxTime; }
set { maxTime = value; }
}
Run Code Online (Sandbox Code Playgroud)
当您想要获取或设置maxTime的值时应用逻辑时,这非常有用.如果没有,一个简单的速记属性将做:
public int MaxTime { get; set; }
Run Code Online (Sandbox Code Playgroud)
您可以创建一个具有公共getter但私有setter的属性,如下所示:
public int MaxTime { get; private set; }
Run Code Online (Sandbox Code Playgroud)
这对于只读属性很有用,通常会在类的构造函数中填充该属性.
你甚至可以创建一个属性,其中setter是公共的,但是getter是私有的,尽管我无法想象这会有用的任何场景.而且,代码标准声称这样的东西应该是一个方法,而不是一个属性. (读这个)
public int MaxTime { private get; set; }
Run Code Online (Sandbox Code Playgroud)
编辑2中你的问题的答案是否定的.
第一个代码永远不会改变私有int maxTime,而第二个代码也是如此.但是,如果你的班级只使用该属性MaxTime,那么它们在功能上是等价的.
更新:
从c#6开始,你可以在没有setter的情况下编写速记属性:
public int MaxTime {get;}
Run Code Online (Sandbox Code Playgroud)
这些属性只能在构造函数中初始化,或者硬编码如下:(也是c#6的新功能)
public int MaxTime {get;} = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
这对于不可变属性很有用(与readonly属性不同,这样的属性的值在初始化后甚至在托管类内部也不会改变.
//Method 1
public string name { get; set; }
//Method 2
public string name
public string getName() { return name;}
public string setName(string newName) { this.name = newName; }
Run Code Online (Sandbox Code Playgroud)
以上两种方法并不相同.
比较它们会更准确:
//Method 1
public string name { get; set; }
//Method 2
private string name; // this is private, not public.
public string Name // this is a property, not a method.
{
get
{
return this.name;
}
set
{
this.name = value;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想玩访问修饰符,比如make getpublic和setprivate,那么你会这样做:
public int maxTime { get; private set; }
Run Code Online (Sandbox Code Playgroud)
有关Auto-Implemented Properties的更多信息以及幕后发生的编译器魔术.
| 归档时间: |
|
| 查看次数: |
5606 次 |
| 最近记录: |