在静态函数中使用new关键字创建对象时发生了什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在静态函数中使用new关键字创建对象时发生了什么相关的知识,希望对你有一定的参考价值。

到目前为止这是我的代码:

public class ServerUtility
{
    public static int LogError(string source, string detail)
    {
        int iresult = -99;
        try
        {
            BaseRepository repo = new BaseRepository();
            using (SqlConnection con = new SqlConnection(repo.connectionString))
            {
                con.Open();
                using (SqlCommand cmd = new SqlCommand($"INSERT INTO [dbo].[LogError]([source],[detail],[date])VALUES('{source.Replace("'", "''")}','{detail.Replace("'", "''")}',GETDATE());SELECT @@IDENTITY", con))
                {
                    string getValue = cmd.ExecuteScalar().ToString();
                    iresult = Convert.ToInt32(getValue);
                } // command disposed here

            } //connection closed and disposed here
        }
        catch (Exception ex) { throw ex; }
        return iresult;
    }
}

我的问题是关于GetInstance方法:

BaseRepository repo = new BaseRepository();
using (SqlConnection con = new SqlConnection(repo.connectionString))

我总是把它设置为我的静态函数的新对象,只是为了从AppSetting中获取常量值。

如果我将此代码实现到我的项目中,实际发生了什么?表现怎么样?

是否会导致性能问题?

谢谢

答案

就像@gtosto提到的那样,你没有正确实现单身人士。

它应该是:

    public static SenderBackupProvider GetInstance()
    {            
        if (oInstance == null)
        {
            oInstance = new SenderBackupProvider(CommFunction.GetLogNumber(CommonConst.APPID));
        }

        return oInstance;
    }

看看Implementing the Singleton Pattern in C#

编辑:

因为OP不相信oInstance变量在第一次运行时应该为null,所以这是一个截图。

enter image description here

仔细查看代码后,您正在使用Web应用程序。静态变量的生命周期因平台而异。您可能需要在IIS中重新启动应用程序域。在Lifetime of ASP.NET Static Variable中查看更多信息。

以上是关于在静态函数中使用new关键字创建对象时发生了什么的主要内容,如果未能解决你的问题,请参考以下文章

class类和构造函数在使用new创建实例对象时候都做了什么?

C#中啥情况下要使用new关键字?这问题深奥额

前端经典面试题解密:JS的new关键字都干了什么?

前端经典面试题解密:JS的new关键字都干了什么?

关于this的指向问题及new的过程到底发生了什么

详解 JS 中 new 调用函数原理