其实问题很简单,举个例子,比如你在写一个DAL层函数时,定义了一个string sql。此时是将其定义在函数内部作为局部变量,还是定义在class下作为全局变量(甚至是重新定义一个class专门放SQL)。将其作为局部变量的好处是,调用函数的时候,变量才进栈,用完就释放,并且每个函数下的SQL都清晰明了。另一种说法是,局部变量每次调用函数都要进栈,对内存管理资源来说是一种浪费,并且这种浪费大于不释放内存的消耗,甚至每次调用初始化都存在内存泄漏的风险。问题很简单,甚至可能两种方法并没有啥质的区别,但还想请教各位大佬给点建议和说明(问题前提:调用此方法的函数个位数,但是程序访问很频繁。SQL的字符串全部加起来占的内存也很小。)

解决方案 »

  1.   

    sql语句作为参数。
    你看SqlCommand,就是让你传递sql。
      

  2.   

    emm,SQL是作为参数,但是我所好奇的问题在于定义在函数下,还是定义在类下,又或者另外定义一个专门放SQL语句的类,哪种写法更好。而为什么产生这样的疑问,开头解释了。
      

  3.   

    这几种方案没有区别,
    从代码可读性考虑,定义在函数里比较好。另外,如果你学习了EF之类的orm框架,你会发现,你在代码里看不到sql了。
      

  4.   

    emm,SQL是作为参数,但是我所好奇的问题在于定义在函数下,还是定义在类下,又或者另外定义一个专门放SQL语句的类,哪种写法更好。而为什么产生这样的疑问,开头解释了。
    我意思是,肯定作为方法参数好啊。
    人家使用方法时,就知道这个字段是要传sql的。
    而不是要到类的内部,去找到这个变量,然后赋值。
    你换一个人交接后,第二个人上来,一输入这个方法,根据方法的参数注释就明白了。
    但是写在类里,人家是不会明白的,只能看文档,“哦,原来要给类里的这个sql变量赋值啊。坑爹了。”
      

  5.   

    第一,如果你是仅仅在内存使用上来说,可以告诉你这两种方法没有区别。无论多么频繁的调用sql,无论多么长的sql语句,也不会影响到内存的占用,挂的只能是你的网络连接或者数据库。具体为什么要你去深入了解一下GC,说什么堆栈消耗内存管理内存泄漏的都是在胡扯。
    第二,如果你是想从设计的角度来说,那么还是要放在函数内部的。定义在函数外部,意义上来说就是外部或公共变量,这个变量意义上来说是任何函数都可以用的。这肯定是不对的,就意义上来说你这个sql变量仅仅是特定的给某几个函数用的。而且起码如果我看这样的代码我会很火大,因为翻来翻去很烦。可读性也是很重要的。
    综上,无论如何都是要放在函数内部的。
      

  6.   

    如果你这个 sql 是硬编码的,那么无论你写在函数内,还是 class 内,其实实例都不会被释放的。在函数里面定义,可能每次调用会产生一个新的指针,理论上的确会增加成本,但是微乎其微吧……