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

これは小さなパラドックスであるため、このクラスを新しいオブジェクトにインスタンス化するときにコンストラクターが常に最初に呼び出されることを知っています。また、ガベージコレクションを行わない静的インスタンスが作成されるため、静的メソッドにはしたくありません。

私が間違っている場合は訂正してください。経験豊富なプログラマー仲間からの明確な回答を歓迎します。ありがとうございました。

4

1 に答える 1

8

コンストラクターで非静的メソッドを呼び出すことは問題ありませんが、仮想メソッドでは避ける必要があります。メソッドがオーバーライドされると、実際のメソッドは、型レベルのコンストラクターがまだ呼び出されていない型で呼び出されるためです。問題を引き起こす可能性があります。

静的メソッドを呼び出す方が信頼性が高くなります。静的メソッドを望まない理由は少し混乱していると思いますが、当てはまりません。静的メソッドを回避する理由はまったくありません。静的メソッドは、「ガベージコレクションされない静的インスタンス」のインスタンスメソッドとして実装されていません。静的メソッドのインスタンスはありません

于 2012-06-10T10:28:38.937 に答える