相关疑难解决方法(0)

在C#中完成/处理模式

C#2008

我一直在研究这个问题,我仍然对一些问题感到困惑.我的问题如下

  1. 我知道如果你处理非托管资源,你只需要一个终结器.但是,如果您使用托管资源来调用非托管资源,您是否仍需要实现终结器?

  2. 但是,如果您开发一个不直接或间接使用任何非托管资源的类,您是否可以实现IDisposable该类,以便您的类的客户端可以使用'using statement'?

    是否可以接受实现IDisposable,以便您的类的客户端可以使用using语句?

    using(myClass objClass = new myClass())
    {
        // Do stuff here
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我在下面开发了这个简单的代码来演示Finalize/dispose模式:

    public class NoGateway : IDisposable
    {
        private WebClient wc = null;
    
        public NoGateway()
        {
            wc = new WebClient();
            wc.DownloadStringCompleted += wc_DownloadStringCompleted;
        }
    
    
        // Start the Async call to find if NoGateway is true or false
        public void NoGatewayStatus()
        {
            // Start the Async's download
                // Do other work here
            wc.DownloadStringAsync(new Uri(www.xxxx.xxx));
        }
    
        private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            // …
    Run Code Online (Sandbox Code Playgroud)

.net c# idisposable finalizer

369
推荐指数
7
解决办法
17万
查看次数

完成vs Dispose

为什么有些人在Finalize方法上使用该Dispose方法?

在什么情况下你会使用Finalize方法而不是Dispose方法,反之亦然?

c# dispose

207
推荐指数
8
解决办法
13万
查看次数

我应该Dispose()DataSet和DataTable吗?

DataSet和DataTable都实现了IDisposable,因此,通过传统的最佳实践,我应该调用它们的Dispose()方法.

但是,从我到目前为止所读到的,DataSet和DataTable实际上并没有任何非托管资源,因此Dispose()实际上并没有做太多.

另外,我不能只使用,using(DataSet myDataSet...)因为DataSet有一组DataTables.

所以,为了安全起见,我需要遍历myDataSet.Tables,处理每个DataTable,然后处理DataSet.

那么,在我的所有DataSet和DataTables上调用Dispose()是否值得麻烦?

附录:

对于那些认为应该处理DataSet的人:通常,处理的模式是使用usingor try..finally,因为你想保证将调用Dispose().

然而,这对于一个集合来说真的很快.例如,如果对Dispose()的一个调用抛出异常,你会怎么做?你吞下它(这是"坏"),以便你可以继续处理下一个元素?

或者,你是否建议我只调用myDataSet.Dispose(),而忘记在myDataSet.Tables中处理DataTables?

datatable dispose idisposable using dataset

187
推荐指数
7
解决办法
10万
查看次数

究竟什么是非托管资源?

我想知道非托管资源.任何人都可以给我一个基本的想法吗?

c# unmanaged

148
推荐指数
5
解决办法
6万
查看次数

是否滥用IDisposable和"使用"作为获取异常安全的"范围行为"的手段?

我经常在C++中使用的东西是让一个类通过构造函数和析构函数A处理另一个类的状态入口和退出条件,以确保如果该范围内的某些东西抛出异常,那么B将具有已知状态范围已退出.就首字母缩略词而言,这不是纯粹的RAII,但它仍然是一种既定的模式.BA

在C#中,我经常想做

class FrobbleManager
{
    ...

    private void FiddleTheFrobble()
    {
        this.Frobble.Unlock();
        Foo();                  // Can throw
        this.Frobble.Fiddle();  // Can throw
        Bar();                  // Can throw
        this.Frobble.Lock();
    }
}
Run Code Online (Sandbox Code Playgroud)

这需要像这样做

private void FiddleTheFrobble()
{
    this.Frobble.Unlock();

    try
    {            
        Foo();                  // Can throw
        this.Frobble.Fiddle();  // Can throw
        Bar();                  // Can throw
    }
    finally
    {
        this.Frobble.Lock();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我想保证退货Frobble时的状态FiddleTheFrobble.代码会更好

private void FiddleTheFrobble()
{
    using (var janitor = new FrobbleJanitor(this.Frobble))
    {            
        Foo();                  // Can throw
        this.Frobble.Fiddle();  // Can throw …
Run Code Online (Sandbox Code Playgroud)

c# exception-handling raii

107
推荐指数
6
解决办法
6151
查看次数

将对象转换为XML字符串

我有一个名为WebserviceType我从XSD文件中的工具xsd.exe 获得的类.

现在我想将WebServiceType对象的实例反序列化为字符串.我怎样才能做到这一点?

MethodCheckType对象具有params WebServiceType数组.

我的第一次尝试就像我序列化了一样:a XmlSerializer和a StringWriter(序列化我使用了a StringReader).

这是我序列化WebServiceType对象的方法:

XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType));
        MethodCheckType output = null;
        StringReader reader = null;

        // catch global exception, logg it and throw it
        try
        {
            reader = new StringReader(path);
            output = (MethodCheckType)serializer.Deserialize(reader);
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            reader.Dispose();
        }

        return output.WebService;
Run Code Online (Sandbox Code Playgroud)

编辑:

也许我可以用不同的语言说:我有一个这个MethodCheckType对象的实例另一方面我有一个XML文档,我从中序列化了这个对象.现在我想以字符串的形式将此实例转换为XML文档.在此之后,我必须证明两个字符串(XML文档)是否相同.我必须这样做,因为我对第一种方法进行单元测试,在该方法中我将XML文档读入StringReader并将其序列化为MethodCheckType对象.

c# xml serialization

78
推荐指数
3
解决办法
18万
查看次数

析构函数与IDisposable?

我已经读过在C#中处理对象/ IDisposable接口和析构函数,但对我来说它们似乎做同样的事情?

两者有什么区别?为什么我会使用一个而不是另一个?实际上,在此示例(下面的链接)中,此代码使用IDisposable接口和析构函数:

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

评论说析构函数是否使用了终结代码,但我如何决定何时使用其中一个?

.net c#

64
推荐指数
3
解决办法
3万
查看次数

如何以编程方式从URL保存图像?

如何以编程方式从URL保存图像?我正在使用C#,需要能够从URL中获取图像并将其存储在本地.......不,我不偷东西:)

.net c# image

53
推荐指数
2
解决办法
8万
查看次数

我什么时候应该实现IDisposable?

何时实施IDisposable的最佳做法是什么?

如果在类中有一个托管对象,那么实现它是最好的经验法则,还是依赖于对象是在类中创建还是只是传入?我是否也应该为没有托管对象的类做到这一点?

.net c# vb.net idisposable

37
推荐指数
5
解决办法
1万
查看次数

如何在.Net中实现ConcurrentHashSet

我试图在ConcurrentDictionary的精神中实现一个ConcurrentHashSet,采取的方法是使用内部支持ConcurrentDictionary并编写小的委托方法,这是我得到了多远,但很好的设置理论方法是我坚持,尤其是.我不确定我是否可以使用foreach并且仍然不违反并发性

public class ConcurrentHashSet<TElement> : ISet<TElement>
{
    private readonly ConcurrentDictionary<TElement, object> _internal;

    public ConcurrentHashSet(IEnumerable<TElement> elements = null)
    {
        _internal = new ConcurrentDictionary<TElement, object>();
        if (elements != null)
            UnionWith(elements);
    }

    public void UnionWith(IEnumerable<TElement> other)
    {
        if (other == null) throw new ArgumentNullException("other");

        foreach (var otherElement in other)
            Add(otherElement);
    }

    public void IntersectWith(IEnumerable<TElement> other)
    {
        throw new NotImplementedException();
    }

    public void ExceptWith(IEnumerable<TElement> other)
    {
        throw new NotImplementedException();
    }

    public void SymmetricExceptWith(IEnumerable<TElement> other)
    {
        throw new NotImplementedException();
    }

    public bool IsSubsetOf(IEnumerable<TElement> other)
    { …
Run Code Online (Sandbox Code Playgroud)

.net c# concurrency dictionary hashset

31
推荐指数
3
解决办法
2万
查看次数