我想为属性分配一些默认值,或者想要替换下面给出的某些字符。它是正确的语法还是应该通过创建变量来实现。
public string Login_Name
{
get
{ return this.Login_Name; }
set { this.Login_Name = value.Replace("'", "''"); }
}
答案 0 :(得分:13)
通过访问Login_Name
get
将再次返回Login_Name
,让您无限循环(StackOverflowException
)。
您应该使用属性来获取和设置私有成员:
public string Login_Name
{
get
{
return _login_Name;
}
set
{
_login_Name = value;
if (!string.IsNullOrEmpty(_login_Name))
{
_login_Name = _login_Name.Replace("'", "''");
}
}
}
private string _login_Name;
如果您打算使用auto-implemented属性,它将如下所示:
public string Login_Name {get;set;}
但是自动实现的属性不能将任何其他逻辑应用于其获取或集合。
答案 1 :(得分:4)
这不起作用;你实际上是在创造一个无限循环。
请改为使用单独的私人字段:
private string m_loginName;
public string Login_Name
{
get
{
return m_loginName;
}
set
{
m_loginName = !string.IsNullOrEmpty(value) ? value.Replace("'", "''") : value;
}
}
答案 2 :(得分:3)
您所写的不是自动实施的属性。 auto-implemented属性如下所示:
public string Login_Name { get; set; }
这是来自MSDN的引用,强调我的:
在C#3.0及更高版本中,当属性访问器中不需要其他逻辑时,自动实现的属性使属性声明更简洁。
如果您的示例中有额外的逻辑,则无法使用自动实现的属性。您可以使用普通的property并自行声明支持字段。
private string loginName;
public string LoginName
{
get
{
return loginName;
}
set
{
loginName = (value == null) ? null : value.Replace("'", "''");
}
}
答案 3 :(得分:2)
我是这样做的。
private string _Login_Name = "Some Default";
public string Login_Name
{
get { return _Login_Name; }
set
{
_Login_Name = value.Replace("'", "''"); //might want to check for null first
}
}
答案 4 :(得分:1)
你必须设置一个变量,否则你最终会得到无限递归和Stack Overflow。有了你所拥有的东西,你的二传手就会自称:
this.Login_Name = ...
这与你的getter用自己调用的方式相同:
return this.Login_Name;
答案 5 :(得分:-1)
这是对的。您提供的代码段中唯一的问题是对属性的setter方法的递归调用。
set { this.Login_Name = value.Replace("'", "''"); }
您应该将值设置为某个私有字段,而不是递归到属性本身,例如:
set { loginName = value.Replace("'", "''"); }