classA{publiceventEventHandlerAEvent;}classB{privateA_foo;privateint_bar;publicvoidAttachToAEvent(){_foo.AEvent+=delegate(){...UseBar(_bar);...}}}由于delegate捕获变量this._bar,它是否隐含地持有B的实例?B的实例是否会通过事件处理程序引用并由A的实例捕获变量?如果_bar是AttachToAEvent方法的局部变量,会有不同吗?因为在我的例子中,A的实例比B的实例生命周期长得多并且小得多,我担心会导致“内存泄漏”这样做。
如果我有这个:publicstringDoSomething(stringarg){stringsomeVar=arg;DoStuffThatMightTakeAWhile();returnSomeControl.Invoke(newFunc(()=>someVar));}并且可以从多个线程并发调用此方法,一个线程卡在DoStuffThatMightTakeAWhile,然后第二个线程使用不同的arg调用DoSomething,这是否会更改所有线程的someVar的值,因此DoSomething在两次调用中都返回someArg的第二个版本,还是每个线程都存在一个someVar?编辑我认
考虑以下代码:usingSystem;namespaceConsoleApplication2{classProgram{staticvoidMain(string[]args){varsquare=newSquare(4);Console.WriteLine(square.Calculate());}}classMathOp{protectedMathOp(Funccalc){_calc=calc;}publicintCalculate(){return_calc();}privateFunc_calc;}classSquare:MathOp{publicSquare(intoper
除了使用yield对于Ruby中的迭代器,我还使用它在被调用方法中恢复控制之前将控制权短暂地返回给调用者。我想在C#中做的是类似的。在测试类中,我想获取一个连接实例,创建另一个使用该连接的变量实例,然后将该变量传递给调用方法,以便对其进行调整。然后我希望控制返回到被调用的方法,以便可以处理连接。我想我想要像Ruby中那样的block/闭包。这是总体思路:privatestaticMyThinggetThing(){using(varconnection=newConnection()){yieldreturnnewMyThing(connection);}}[TestMethod]pu
闭包捕获的变量如何与不同的线程交互?在下面的示例代码中,我想将totalEvents声明为易变的,但C#不允许这样做。(是的,我知道这是错误的代码,这只是一个例子)privatevoidWaitFor10Events(){volatileinttotalEvents=0;//errorCS0106:_someEventGenerator.SomeEvent+=(s,e)=>totalEvents++;while(totalEvents编辑:人们似乎有点忽略了我的问题。我知道我不能在本地变量上使用volatile。我也知道示例代码代码不好,可以用其他方式实现,因此我的“错误代码”免责声明
我还是不太明白什么是闭包,所以我贴了这两个例子,我想知道这两个例子是不是都是闭包?示例A:ListsubFolders=newList();ActionFilterSubFoldersStartA=s=>subFolders.AddRange((newDirectoryInfo(s)).GetDirectories().Where(d=>d.Name.StartsWith("A")));FilterSubFoldersStartA(@"c:\tempa");FilterSubFoldersStartA(@"c:\tempb");示例B:ListsubFolders=newList();
我是否需要将MyAction设置为null以便垃圾回收能够继续处理这些类中的任何一个?当两个类的生命周期几乎相同时,我就不那么担心了。当Class1的生命周期比Class2长得多或Class2的生命周期比Class1长得多时,我的问题更合适。这里的代码被精简了。假设Class1和Class2都包含其他可能影响其生命周期的成员和方法。publicclassClass1:IDisposable{publicActionMyAction{get;set;}//Isthisnecessary?publicvoidDispose(){MyAction=null;}}publicclassClas
这是关于ReSharper的警告“Accesstodisposedclosure”,通常出现在lambda中使用稍后处置的对象时。AccesstodisposedclosureinC#?对此进行了更详细的讨论。我的问题是:对于采用此类lamdb并立即执行它们的方法(因此您可以确保它们始终在处理所述对象之前执行):有没有办法将它们标记为安全的,以便使用该方法的任何代码都不会再产生这些警告?例子:using(varmyObject=newMyDisposableObject()){DoThisTwice(()=>myObject.DoSomething());}...voidDoThisT
我在调查一些奇怪的对象生命周期问题时,发现了C#编译器的这种非常令人费解的行为:考虑以下测试类:classTest{delegateStreamCreateStream();CreateStreamTestMethod(IEnumerabledata){stringfile="dummy.txt";varhashSet=newHashSet();varcount=data.Count(s=>hashSet.Add(s));CreateStreamcreateStream=()=>File.OpenRead(file);returncreateStream;}}编译器生成以下内容:int
我刚刚遇到了以下行为:for(vari=0;i{Debug.Print("Error:"+i.ToString());});}会导致一系列“错误:x”,其中大部分x等于50。类似地:vara="Before";vartask=newTask(()=>Debug.Print("Usingvalue:"+a));a="After";task.Start();将导致“使用值:之后”。这显然意味着lambda表达式中的串联不会立即发生。在声明表达式时,如何在lambda表达式中使用外部变量的副本?以下不会更好地工作(这不一定是不连贯的,我承认):vara="Before";vartask=ne