目前我正在使用.Net 3.0,但我不知道如何使用自动属性。
例如,如果我想通过Authomatic Properties编写此示例代码,我该怎么办?
private string _name = string.Empty;
private string _family = string.Empty;
//A field with default value
private DateTime _releaseDate = System.DateTime.Now;
//ReadOnly Property
public string Name
{
get {return _name; }
}
//enforce validation rules on setting
public string Family
{
get { _family; }
set
{
if (value.Length < 3)
return new Exception("Family need at least 3 character long");
else
_family = value;
}
}
// A property from two other fields
public string FullName
{
get { return _name + " " + _family; }
}
谢谢大家的回复,我得到了答案
答案 0 :(得分:6)
你做不到。
自动属性只是为您创建一个私人支持字段,并将其隐藏。如果您需要在您的财产中拥有逻辑,您应该自己实施。
使用自动属性,你必须同时拥有一个getter和一个setter,但你可以将setter设为私有,例如:
public string Foo { get; private set; }
顺便说一下,你不能从字符串属性返回异常。例外应为 抛出 ,而不是已退回。
public string Family
{
get { _family; }
set
{
if (value.Length < 3)
return new Exception("Family need at least 3 character long");
else
_family = value;
}
}
这应该是:
public string Family
{
get { _family; }
set
{
if (value.Length < 3)
throw new Exception("Family need at least 3 character long");
else
_family = value;
}
}
答案 1 :(得分:3)
您说您使用的是.NET 3.0 - 您使用的是VS2005吗?如果是这样,您使用的C#2不支持自动实现的属性。
如果您正在使用VS2008并且目标是.NET 3.0,那么它们应该可以正常工作 - 但无论如何它们实际上并不适用,因为您的属性都不是“微不足道”的属性。自动实现的属性是一种紧凑的写作方式:
private string foo;
public string Foo { get { return foo; } set { foo = value; } }
如果您的属性不遵循该模式(属性的模访问修饰符),那么自动属性将无法帮助您。
答案 2 :(得分:3)
你做不到。自动属性不能只读,也不能包含正文中的逻辑。
自动属性只是此
的简短形式private string _name;
public string Name
{
get{return _name;}
set{_name = value;}
}
到此
public string Name{get;set;}
答案 3 :(得分:2)
当您只想要一个属性“重复”一个支持字段时,就会使用自动属性。
即
string _name;
public string Name { get { return _name; } set { _name = value; } }
可以简单地重写为
public string Name { get; set; }
编译器会为您扩展一个随机命名的专用后备字段,并编写与第一个代码示例等效的代码。
但是,如果您想要执行任何特殊操作(例如默认值)或验证集value
,则无法使用它们。
实际上,可能的例外是默认初始化。
您可以使用构造函数来默认初始化属性。