【发布时间】: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 等)
-
注明。谢谢你。因此,仅当您创建一个确实会保留在内存中的静态类时,才考虑此事。这是真的吗?
-
我会将该方法设为静态,因为它实际上只是从
String到SmtpDeliveryMethod的“翻译”,并且它不使用来自对象的任何实例信息。像 Andrew Russell 一样,我认为您将静态方法与静态字段混淆了。你担心什么不会被垃圾收集? -
@Freeman 没有“那个”——静态方法不会创建任何实例。您似乎在考虑一个单身人士 - 不相关。
-
好的,更具体地说,如果我在 GetDelivery 方法中有一个变量,它会保留在内存中吗?这就是我也不确定的。
标签: c# .net asp.net-mvc