【问题标题】:Is it a good practice to call an instance method in the constructor of the object that holds the method?在持有该方法的对象的构造函数中调用实例方法是一种好习惯吗?
【发布时间】:2012-06-10 10:13:03
【问题描述】:

例子:

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();
        }
    } 

我问这个是因为它是一个小悖论,我知道在将此类实例化为新对象时总是首先调用构造函数。而且我不想让它成为一个静态方法,因为这将创建一个不会被垃圾收集的静态实例。

如果我错了,请纠正我,非常欢迎有经验的程序员同行给出明确的答案。谢谢。

【问题讨论】:

  • 静态方法不会导致使用任何额外的内存。 (无非是等效的实例方法——代码存在于程序集中,被 JITted 等)
  • 注明。谢谢你。因此,仅当您创建一个确实会保留在内存中的静态类时,才考虑此事。这是真的吗?
  • 我会将该方法设为静态,因为它实际上只是从StringSmtpDeliveryMethod 的“翻译”,并且它不使用来自对象的任何实例信息。像 Andrew Russell 一样,我认为您将静态方法与静态字段混淆了。你担心什么不会被垃圾收集?
  • @Freeman 没有“那个”——静态方法不会创建任何实例。您似乎在考虑一个单身人士 - 不相关。
  • 好的,更具体地说,如果我在 GetDelivery 方法中有一个变量,它会保留在内存中吗?这就是我也不确定的。

标签: c# .net asp.net-mvc


【解决方案1】:

在构造函数中调用非静态方法可以是可以的 - 但你应该避免使用虚拟方法,因为如果方法被覆盖,实际方法将是在尚未调用类型级构造函数的类型上调用 - 可能会导致问题。

调用静态方法会更可靠。我认为您想要静态方法的原因有点混乱,不适用。绝对没有理由避免使用静态方法。静态方法不是作为“不会被垃圾收集的静态实例”上的实例方法实现的。 没有静态方法的实例

【讨论】:

  • 非常感谢 Marc,您的回答迅速而清晰。祝你有美好的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多