2012-06-10 23 views
1

例子:在包含该方法的对象的构造函数中调用实例方法是否是一种很好的做法?

public class EmailBusinessLogic 
{ 
    #region Fields and Constructors 
    SmtpClient smtp; 
    Parameter prm; 

    public EmailBusinessLogic() 
    { 
     prm = CostHelper.GetParameter(); 
     smtp = new SmtpClient(prm.EmailHost, prm.EmailPort); 
     smtp.UseDefaultCredentials = prm.EmailUseDefaultCredentials; 
     smtp.DeliveryMethod = GetDeliveryMethod(prm.EmailDeliveryMethod); //CALL TO METHOD DOWN BELOW, IS THIS A GOOD PRACTICE? 
     smtp.EnableSsl = prm.EmailEnableSSL; 
     smtp.Credentials = new NetworkCredential(prm.AppUserName, prm.AppPass, prm.AppNetworkDomain); 

    } 
    #endregion 

    #region Instance Methods 
    public SmtpDeliveryMethod GetDeliveryMethod(string name) 
    { 
     switch (name) 
     { 
      case "Network": return SmtpDeliveryMethod.Network; 
      case "IISDirectory": return SmtpDeliveryMethod.PickupDirectoryFromIis; 
      case "OtherDirectory": return SmtpDeliveryMethod.SpecifiedPickupDirectory; 
      default: throw new NonExistentObjectException(); 
     } 
    } 

我问这个,因为它是一个小矛盾,我知道这个实例类到一个新的对象的时候,总是构造被称为第一次。我不想让它成为一个静态方法,因为这会创建一个不会收集垃圾的静态实例。

如果我错了,请纠正我,经验丰富的程序员的明确答复是非常受欢迎的。谢谢。

+2

静态*方法*不会导致使用任何额外的内存。 (没有什么比等效的实例方法 - 代码存在于程序集中,得到JITted等) –

+0

已注意。谢谢。所以关于这个问题,只有当你创建一个静态类时,它才会真正留在内存中。这是一个真实的陈述吗? – Freeman

+1

我会让这个方法变成静态的,因为它实际上只是一个从“String”到“SmtpDeliveryMethod”的“翻译”,并且它不使用对象中的任何实例信息。像Andrew Russell一样,我认为你会将静态方法与静态域混淆。你担心什么是不会被垃圾收集的? –

回答

8

在构造函数中调用非静态方法可以是好的 - 但你应该避免对虚方法,因为如果该方法被重写的实际方法会被调用上一直没有一个类型调用的类型级别构造函数 - 可能会导致问题。

调用静态方法会更可靠。我想你的原因不是想要一个静态方法有点困惑,并且不适用。绝对没有理由避免静态方法。一个静态方法没有作为一个“没有被垃圾回收的静态实例”的实例方法实现。对于静态方法,不是实例

+0

非常感谢Marc,你的回答很快捷。祝你今天愉快。 – Freeman

相关问题