这是我的电话采访问题:是否有时间不会在使用块声明范围的对象上调用Dispose?
我的回答是否定的 - 即使在使用块期间发生异常,仍会调用Dispose.
面试官不同意并说如果using包裹在try- catch块中,那么当你进入catch块时就不会调用Dispose.
这与我对构造的理解相反,我无法找到任何支持采访者观点的东西.他是正确的还是我误解了这个问题?
如果我有以下情况:
StreamWriter MySW = null;
try
{
Stream MyStream = new FileStream("asdf.txt");
MySW = new StreamWriter(MyStream);
MySW.Write("blah");
}
finally
{
if (MySW != null)
{
MySW.Flush();
MySW.Close();
MySW.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
MySW.Dispose()即使提供了,我可以打电话并跳过关闭吗?是否存在任何不能按预期工作的Stream implament(如CryptoStream)?
如果没有,那么以下只是错误的代码:
using (StreamWriter MySW = new StreamWriter(MyStream))
{
MySW.Write("Blah");
}
Run Code Online (Sandbox Code Playgroud) 在Java中,有一个等同于C#"using"语句,允许为对象定义范围:
using (AwesomeClass hooray = new AwesomeClass())
{
// Great code
}
Run Code Online (Sandbox Code Playgroud) 有什么用using namespace std?
我想看看Layman的解释.
我已经编写了自己的自定义数据层来保存到特定文件,并使用自定义DataContext模式对其进行抽象.
这完全基于.NET 2.0 Framework(给定目标服务器的约束),所以尽管其中一些可能看起来像LINQ-to-SQL,但它不是!我刚刚实现了类似的数据模式.
请参阅下面的示例,以了解我无法解释的情况示例.
获取Animal的所有实例 - 我这样做,它工作正常
public static IEnumerable<Animal> GetAllAnimals() {
AnimalDataContext dataContext = new AnimalDataContext();
return dataContext.GetAllAnimals();
}
Run Code Online (Sandbox Code Playgroud)
并在下面的AnimalDataContext()中实现GetAllAnimals()方法
public IEnumerable<Animal> GetAllAnimals() {
foreach (var animalName in AnimalXmlReader.GetNames())
{
yield return GetAnimal(animalName);
}
}
Run Code Online (Sandbox Code Playgroud)
AnimalDataContext()实现了IDisposable,因为我在那里有一个XmlTextReader,我想确保它快速清理.
现在,如果我将第一个调用包装在using语句中,就像这样
public static IEnumerable<Animal> GetAllAnimals() {
using(AnimalDataContext dataContext = new AnimalDataContext()) {
return dataContext.GetAllAnimals();
}
}
Run Code Online (Sandbox Code Playgroud)
并在AnimalDataContext.GetAllAnimals()方法的第一行放置一个断点,在AnimalDataContext.Dispose()方法的第一行放置另一个断点,然后执行...
Dispose()方法被称为FIRST,因此AnimalXmlReader.GetNames()给出"对象引用未设置为对象的实例"异常,因为在Dispose()中AnimalXmlReader已设置为null ???
有任何想法吗?我有一种预感,它关系到产生收益没有被允许一个try-catch块,其内部被称为使用有效的代表,编译一次...
我的理解是,一旦代码退出块,.NET 中的using语句就会调用IDisposable对象的Dispose()方法.
using声明是否还做其他事情?如果没有,似乎以下两个代码示例实现完全相同的事情:
Using Con as New Connection()
Con.Open()
'do whatever '
End Using
Dim Con as New Connection()
Con.Open()
'do whatever '
Con.Dispose()
Run Code Online (Sandbox Code Playgroud)
我会给那些确认我是正确的人或者指出我错了并给出解释原因的人给出最好的答案.请记住,我知道某些类可以在其Dispose()方法中执行不同的操作.这个问题是关于using语句是否达到与调用对象Dispose()方法完全相同的结果.
我刚刚安装了resharper,它让我知道我在每个课程中都没有实际使用的命名空间.
这引出了我的问题 - 实际上是否存在使用声明留下这些未使用的开销?
它只是一个严密的代码问题,还是在我不需要时调用这些命名空间的性能?
如果在using语句中发生异常,该对象是否仍然处理?
我问的原因是因为我试图决定是否在整个代码块或内部使用语句中进行尝试.请记住,某些例外情况正在设计中被重新抛出.
using (SPSite spSite = new SPSite(url))
{
// Get the Web
using (SPWeb spWeb = spSite.OpenWeb())
{
// Exception occurs here
}
}
Run Code Online (Sandbox Code Playgroud) use会捕获异常还是抛出异常?即
using (StreamReader rdr = File.OpenText("file.txt"))
{
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
如果streamreader抛出异常是通过使用或抛出来捕获的,那么调用函数可以处理它吗?
在C++头文件中是否安全(和正确)以在命名空间中使用using声明,如下所示:
#include <boost/numeric/ublas/vector.hpp>
namespace MyNamespace {
using boost::numeric::ublas::vector;
vector MyFunc(vector in);
}
Run Code Online (Sandbox Code Playgroud)
即,正确地包含在MyNamespace块中的"使用boost :: numeric :: ublas :: vector",还是会污染包含此标头的任何文件的命名空间?
using ×10
c# ×8
.net ×2
c++ ×2
idisposable ×2
namespaces ×2
.net-2.0 ×1
dispose ×1
exception ×1
java ×1
performance ×1
scope ×1
std ×1
try-catch ×1
vb.net ×1
yield-return ×1