2016-05-12 4 views
0

Это мой классResharper, предлагающий поле только для чтения, почему?

public class EmailBuilder 
    { 
     public string Sender { get; set; } 
     public string Receiver { get; set; } 
     public string Subject { get; set; } 
     public string Body { get; set; } 
     public int SmtpServerPort { get; set; } 
     public string SmtpServerAddress { get; set; } 

     private MailMessage _mail; 

     public EmailBuilder() 
     { 
      this._mail = new MailMessage(); 

      this.SmtpServerAddress = CmsConstants.smtpServerAddress; 
      this.SmtpServerPort = CmsConstants.smtpServerPort; 
     } 

     public void SetEmail(string receiver, string subject, string body) 
     { 
      this._mail.To.Add(receiver); 
      this._mail.From = new MailAddress("[email protected]"); 
      this._mail.Subject = subject; 
      this._mail.Body = body; 
      this._mail.Bcc.Add("[email protected]"); 
     } 
} 

ReSharper это позволяет предположить, что _mail должно быть сделано только для чтения, но не будет ли это сделать так, чтобы в моем методе «SetEmail», которые не будут установлены эти свойства? Кто-то хочет объяснить, если я что-то не понимаю.

ответ

4

Readonly означает, что вы не можете переназначить само поле:

_mail = new MailMessage(); // cannot do that outside constructor 

Но это не означает, что свойства самого объекта не могут быть изменены:

_mail.To = new EmailAddress("test"); // perfectly fine with readonly field. 

Так Resharper предложение правильно - вы только присвоить поле в конструкторе, поэтому его можно сделать readonly.

+0

Итак, поле, которое только для чтения, может изменять его свойства везде? Я всегда думал, что это не так, и только его свойства изменились внутри конструктора. – grimsan55

+1

Ну, что вы считали неверным тогда :) – Evk

+0

@ grimsan55, и вы должны спроектировать такой объект неизменным - язык не имеет поддержки из коробки, чтобы сделать объекты магически неизменными. – Evk

Смежные вопросы