我正在学习C#,我遇到了以下代码
public class Album
{
public virtual int AlbumId { get; set; }
public virtual int GenreId { get; set; }
public virtual int ArtistId { get; set; }
public virtual string Title { get; set; }
public virtual decimal Price { get; set; }
public virtual string AlbumArtUrl { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
}
只是想知道以下是什么不同?我的意思是没有get和set你也可以访问这些公共财产。什么使得那些得到和设置变得重要?
public class Album
{
public virtual int AlbumId;
public virtual int GenreId;
public virtual int ArtistId;
public virtual string Title;
public virtual decimal Price;
public virtual string AlbumArtUrl;
public virtual Genre Genre;
public virtual Artist Artist;
}
答案 0 :(得分:2)
您无法声明虚拟字段
public class Album
{
public virtual int AlbumId; // <- Syntax error
...
}
属性实际上是方法:get或(和)设置,所以
public class Album
{
public virtual int AlbumId { get; set; } // <- Both get and set methods declared as virtual ones
...
}
如果你愿意,你可以在派生类中覆盖这些get或(和)set:
public class GreatAlbum: Album {
private Boolean m_IsGreat;
public override int AlbumId {
get {
if (m_IsGreat)
return base.AlbumId
else
return 0;
}
set {
m_IsGreat = (value != 0);
base.AlbumId = value;
}
}
...
}
答案 1 :(得分:2)
控制对象私有字段值。例如,如果您不想允许整数的空值或负值。
bool started;
public bool Started
{
get { return started; }
set
{
started = value;
if (started)
OnStarted(EventArgs.Empty);
}
}
another example
int positiveNumber;
public int PositiveNumber
{
get { return positiveNumber; }
set {
if (value < 0)
positiveNumber = 0;
else positiveNumber = value;
}
}
以及只读属性的另一个实现可以如下
int positiveNumber;
public int PositiveNumber
{
get { return positiveNumber; }
}
答案 2 :(得分:1)
在第一种情况下,您正在处理属性,在第二种情况下处理字段。
与使用属性相比,使用字段有几个缺点。这些缺点包括:
get
或set
中设置断点,但无法在访问该字段时设置断点。简而言之:总是使用公共属性,从不使用公共字段。
答案 3 :(得分:1)
有许多不同之处:
{ get;set;}
)时,您可能看起来也可能只使用公共字段。但是,使用属性意味着您可以在以后更改getter或setter实现,而无需更改类所暴露的接口。如果您使用了某个字段并希望在读取该字段时实施过滤,则必须引入一个新方法,将该字段设为私有并破坏该类型的所有现有使用者。就个人而言,我认为自动实现的属性会促进不良风格,因为它们不鼓励封装。像ReSharper这样的工具也喜欢使用{get;set}
访问器生成属性。因此,新手开发人员通常最终会得到具有大量{get;set;}
属性的类,从而向世界公开类型的状态。默认情况下,您应该至少使用{get; private set;}
。
答案 4 :(得分:1)
通过提供get(accessor)和set(mutator)方法,您可以控制访问和变异。 例如:
您有一个属性,您不希望设置任何超过15的值。因此,您在set方法中进行必要的限制。除非设置方法,否则无法控制。
但是在你的例子中,你的get和set方法是默认的,意味着什么都不控制。
答案 5 :(得分:1)
属性背后的主要原因是以受控方式保护和呈现私人数据。
事实上,属性显示了他们的用法,如下所示:
public virtual int AlbumId
{
get { // ... some magical operations ... }
set { // ... some magical operations ... }
}
关于您的主要问题 - 此示例中的不同之处 - 关注的主要问题是virtual
关键字。
此关键字导致属性可重写,因此任何其他代码都可以覆盖默认的get;
方法。它表明您拥有自己的默认行为,而其他代码(在Entity Framework中极度使用)实现了自己的逻辑!
你的例子中的第二个不是属性,所以他们不表达这种神奇的能力......!