C# 在保存实例方法的对象的构造函数中调用实例方法是一种好的做法吗?

C# 在保存实例方法的对象的构造函数中调用实例方法是一种好的做法吗?,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,例如: public class EmailBusinessLogic { #region Fields and Constructors SmtpClient smtp; Parameter prm; public EmailBusinessLogic() { prm = CostHelper.GetParameter(); smtp = new SmtpClient(prm.EmailHost, prm.EmailPo

例如:

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等)注意到。非常感谢。因此,只有当您创建一个静态类时,它才会保留在内存中。这是真的吗?我会将该方法设置为静态的,因为它实际上只是从
String
SmtpDeliveryMethod
的“转换”,并且它不使用来自对象的任何实例信息。像Andrew Russell一样,我认为你混淆了静态方法和静态字段。您担心什么不会被垃圾收集?@Freeman没有“那个”——静态方法不会创建任何实例。您似乎在考虑一个与单例无关的。好吧,更具体地说,如果我在GetDelivery方法中有一个变量,它会保留在内存中吗?这也是我不确定的。静态方法不会导致使用任何额外的内存。(只不过是等效的实例方法-代码存在于程序集中,得到JITted等)注意到。非常感谢。因此,只有当您创建一个静态类时,它才会保留在内存中。这是真的吗?我会将该方法设置为静态的,因为它实际上只是从
String
SmtpDeliveryMethod
的“转换”,并且它不使用来自对象的任何实例信息。像Andrew Russell一样,我认为你混淆了静态方法和静态字段。您担心什么不会被垃圾收集?@Freeman没有“那个”——静态方法不会创建任何实例。您似乎在考虑一个与单例无关的。好吧,更具体地说,如果我在GetDelivery方法中有一个变量,它会保留在内存中吗?这是我也不确定的。非常感谢你,马克,你的回答迅速而清晰。祝你有一个愉快的一天。非常感谢你,马克,你的回答迅速而清晰。祝您有个美好的一天。