在C#中,null如果你已经完成使用它,是否有必要分配一个对象变量,即使它会超出范围?
我在C#工作,并且我一直非常松懈地使用using块来声明实现的对象IDisposable,这显然是你应该做的.但是,我没有看到一种简单的方法来了解我何时滑倒.Visual Studio似乎没有以任何方式表明这一点(我只是错过了什么?).我每次申报任何东西时都应该检查帮助,然后逐渐建立一个百科全书式的记忆,对象是哪些,哪些不是一次性的?似乎没有必要,痛苦和容易出错.
如何你处理这个问题?
编辑:
看一下相关问题的侧边栏,我发现了另一个问题,它明确表示Dispose()应该被对象的终结器调用.因此,即使你自己也没有自己调用它,它最终会发生,这意味着如果你不使用它就不会有内存泄漏using(这是我认为我一直非常担心的).唯一需要注意的是,垃圾收集器不知道对象作为非托管内容持有多少额外内存,因此无法准确了解通过收集对象将释放多少内存.这将导致垃圾收集器的性能低于平常.
简而言之,如果我错过了,那就不是世界末日了using.我只是希望有些东西会产生至少一个警告.
(偏离主题:为什么链接到另一个问题没有特殊的降价?)
编辑:
好的,好的,别叫吵了.这是超级决斗所有激烈的戏剧性 - 花栗鼠级别的重要打电话Dispose()或我们都会死.
现在.鉴于此,为什么这么容易 - 地狱,为什么甚至允许 - 做错了?你必须尽力去做正确的事.像其他一切一样做它会导致世界末日(显然).封装这么多,是吧?
[偷偷摸摸,反感]
Microsoft.NET框架提供了IDisposable需要实现void Dispose()方法的接口.其目的是IDisposable实现可能已分配实施的昂贵资源的手动或基于范围的发布.示例包括数据库集合,流和句柄.
我的问题是,如果该Dispose()方法的实现是幂等的 - 当在同一个实例上多次调用时,该实例仅被"处置"一次,并且后续调用不会抛出异常.在Java中,大多数具有相似行为的对象(作为示例再次出现流和数据库连接)对于它们的close()操作是幂等的,这恰好是该Dispose()方法的模拟.
但是,我个人使用.NET(特别是Windows Forms)的经验表明,并非所有实现(它们都是.NET框架本身的一部分)都是幂等的,因此后续调用这些实现会引发争议ObjectDisposedException.这真的让我对如何处理一次性对象的实现感到困惑.该场景是否有共同的答案,还是取决于对象的具体上下文及其用法?
我正在为我的公司清理一些C#代码,我注意到的一件事是构建此应用程序的承包商将对象引用设置为null.
例:
get {
Object o = new Object(); // create a new object that is accessed by the reference 'o'
try {
// Do something with the object
}
finally {
o = null; // set the reference to null
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,创建的对象仍然存在.有可能它现在无法访问,具体取决于是否有任何其他引用,但它仍然存在,直到GC到来并清理它.
有没有理由在最后一个块中有这个?在任何情况下,这可能会产生广告中的内存泄漏吗?
谢谢!
在Joseph Albahari的书中简要介绍了C#5.0,我找到了这个
一旦你传递了最后一个变量使用的代码行,它就会说它所引用的对象有资格进行垃圾收集(即如果没有其他变量持有对该对象的引用).
但是根据UC Berkley的这个讲座,只要对象上存在对象的引用,它就不会被垃圾回收.我的理解是,在方法返回之前,变量保留在堆栈上.这意味着它引用的任何对象都是活动的,直到该方法返回.
这是本书中的错误还是java和.net垃圾收集的工作方式不同?
我正在尝试将此代码段添加到我的代码中:
public string Highlight(string InputTxt)
{
string Search_Str = txtSearch.Text.ToString();
// Setup the regular expression and add the Or operator.
Regex RegExp = new Regex(Search_Str.Replace(" ", "|").Trim(), RegexOptions.IgnoreCase);
// Highlight keywords by calling the
//delegate each time a keyword is found.
return RegExp.Replace(InputTxt, new MatchEvaluator(ReplaceKeyWords));
// Set the RegExp to null.
RegExp = null;
}
Run Code Online (Sandbox Code Playgroud)
但是,由于某种原因,"Regex"没有显示 - 找不到类型或命名空间.我想我必须使用更新版本的C# - 任何人都可以用更新的方式来帮我解决这个问题吗?我使用的是System.Text.RegularExpressions.Regex - 也许他们完全摆脱了它?
在我的WCF服务上调用close会终止所有资源还是为GC设置它们还是应该将它设置为null?
**Public Sub ExecuteQuery(ByVal pQueryString As String, Optional ByVal pConn As Odbc.OdbcConnection = Nothing)
Dim Mycmd As New Odbc.OdbcCommand(pQueryString, MyConn)
Mycmd.ExecuteNonQuery()
Mycmd.Dispose()
End Sub**
Run Code Online (Sandbox Code Playgroud)
这里我使用Dispose(Mycmd.Dispose())清除对象.我可以在这里使用Nothing(Mycmd = Nothing?.哪个最好?
请帮助我先生,
通过
了Arul.
对于大型或高流量网站:
第一个问题:
将设置Object=null(不是Disposable)释放内存?或者是释放记忆的其他方式?
第二个问题:
在正常代码中是否需要显式释放内存?
我已经看到开发人员在他们编写的几乎所有方法中都尝试,捕获并最终消除了他们在Finally块中创建的对象.
例如-
public void Demo()
{
Something s = null;
try
{
s = new Something();
}
catch (Exception ex)
{
throw;
}
finally
{
s = null;
}
}
Run Code Online (Sandbox Code Playgroud)
这样做有什么用吗?建议这样做是为了使对象无效,因此GC可以收集它们.
如果不这样做,我们可以使用" 使用 "或IDisposable吗?
什么是最佳做法?