在C#中使用自动实现的属性是否正确?

时间:2010-06-24 07:30:58

标签: c# .net properties

我想为属性分配一些默认值,或者想要替换下面给出的某些字符。它是正确的语法还是应该通过创建变量来实现。

 public string Login_Name 
        { 
          get 
            { return this.Login_Name; } 
          set { this.Login_Name = value.Replace("'", "''"); } 
        }

6 个答案:

答案 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("'", "''"); }