Это правильный способ использовать автоматически реализованные свойства в C # - PullRequest
4 голосов
/ 24 июня 2010

Я хочу присвоить некоторому значению по умолчанию свойство или заменить некоторый символ, как указано ниже.Это правильный синтаксис или я должен сделать это путем создания переменной.

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

Ответы [ 6 ]

13 голосов
/ 24 июня 2010

При доступе к 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;

Если вы намеревались использовать автоматически внедряемое свойство , оно выглядело бы так:

public string Login_Name {get;set;}

Но к автоматически реализуемым свойствам не может быть применена дополнительная логикаих получает или устанавливает.

4 голосов
/ 24 июня 2010

Это не сработает;вы фактически создали бы бесконечный цикл.

Вместо этого используйте отдельное приватное поле:

private string m_loginName;

public string Login_Name 
{ 
    get 
    { 
        return m_loginName; 
    } 
    set 
    {
       m_loginName = !string.IsNullOrEmpty(value) ? value.Replace("'", "''") : value;
    } 
}
3 голосов
/ 24 июня 2010

То, что вы написали, не является автоматически реализованным свойством. автоматически реализованное свойство будет выглядеть так:

 public string Login_Name { get; set; } 

Вот цитата из MSDN, выделено мое:

В C # 3.0 и более поздних версиях автоматически реализованные свойства делают объявление свойства более кратким , когда в средствах доступа к свойствам не требуется дополнительная логика .

Когда у вас есть дополнительная логика, как в вашем примере, вы не можете использовать автоматически реализованное свойство. Вы можете использовать обычное свойство и объявить вспомогательное поле самостоятельно.

 private string loginName;

 public string LoginName 
 { 
      get
      {
          return loginName;
      } 

      set
      {
          loginName = (value == null) ? null : value.Replace("'", "''");
      } 
 }
2 голосов
/ 24 июня 2010

Я делаю это так.

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
  } 
}
1 голос
/ 24 июня 2010

Вам нужно будет установить переменную, иначе вы получите бесконечную рекурсию и переполнение стека.С тем, что у вас есть, ваш установщик вызывает себя с помощью:

this.Login_Name = ... 

Это так же, как ваш получатель вызывает себя с:

0 голосов
/ 24 июня 2010

Это правильно.Единственная проблема в предоставленном вами фрагменте - это рекурсивный вызов метода установки свойства.

set { this.Login_Name = value.Replace("'", "''"); } 

вам следует установить значение для какого-то частного поля, а не рекурсивно для самого свойства, например:

set { loginName = value.Replace("'", "''"); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...