gpt4 book ai didi

c# - 处理后的闭包有奇怪的行为

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:39 25 4
gpt4 key购买 nike

我有一个这样的一次性类(class):

public class Person:IDisposable
{
public string Name{get;set;}

public void Dispose()
{}
}

下面是一组扩展方法,如果调用者为 null,则返回默认值:

static class Extensions
{

public class Option<T>
{
private readonly Func<T> _resultGetter;

public bool HasValue { get; }

public Option(Func<T> resultGetter, bool hasValue)
{
_resultGetter = resultGetter;
HasValue = hasValue;
}

public T Value => _resultGetter();
}

public static Option<TResult> SafeGetter<T, TResult>(this T self, Func<T, TResult> getter, Func<TResult> defaultGetter = null) where T : class
{
defaultGetter = defaultGetter ?? (() => default(TResult));
return new Option<TResult>(self == null ? defaultGetter :()=> getter(self),self!=null);
}
}

如您所见,SafeGetter 方法返回一个 Option 对象,该对象具有一个 getter 函数,该函数具有一个作为闭包的 self 参数。

因此,为了在处理对象后测试 getter 函数,我编写了如下测试:

public void SafeGetterDisposableTest()
{
Extensions.Option<string> nameGetter;
using (var john = new Person { Name = "John" })
{
nameGetter = john.SafeGetter(x => x.Name);
}
Console.WriteLine(nameGetter.Value);
}

如您所见,我已经获得了 Option 对象并在 john 被释放后调用它。我以为我会得到一个异常(exception),但令我惊讶的是测试正在运行。为什么会这样?这段代码是否会以某种方式引入内存泄漏?

最佳答案

I thought that I would get an exception but to my surprise the test is working.

仅通过简单地实现 IDisposable,您不会收到 ObjectDisposedException(或与此相关的任何其他异常)。您的 Dispose 方法是,并且即使在您的 using 语句调用它之后也不会改变对象。如果你改变它在对象被释放后在你的 getter 中抛出一个异常,你将得到一个异常。否则,什么也不会发生。

关于c# - 处理后的闭包有奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33347684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com