我遇到了一个关于C#的有趣问题.我有如下代码.
List<Func<int>> actions = new List<Func<int>>();
int variable = 0;
while (variable < 5)
{
actions.Add(() => variable * 2);
++ variable;
}
foreach (var act in actions)
{
Console.WriteLine(act.Invoke());
}
Run Code Online (Sandbox Code Playgroud)
我希望它输出0,2,4,6,8.但是,它实际输出5个10.
似乎是由于所有操作都涉及一个捕获的变量.结果,当它们被调用时,它们都具有相同的输出.
有没有办法解决这个限制,让每个动作实例都有自己的捕获变量?
我遇到了问题
foreach(var category in categories)
{
foreach(var word in words)
{
var waitCallback = new WaitCallback(state =>
{
DoSomething(word, category);
});
ThreadPool.QueueUserWorkItem(waitCallback);
}
}
Run Code Online (Sandbox Code Playgroud)
当DoSomething执行get时,它会接收每个捕获变量的最新值,而不是我想要的值.我可以想象一个解决方案,但它想象你们可以提出更好的解决方案
在"捕获的变量"中如何捕获变量?
"捕获"一词究竟代表什么?
这是否意味着引用值类型而不涉及拳击?
谢谢
我有以下代码创建10个线程,然后将消息写入控制台:
for (int i = 0; i < 10; i++)
{
{
Thread thread = new Thread((threadNumber) =>
{
for (int j = 0; j < 10; j++)
{
Thread.Sleep(200);
Console.WriteLine(string.Format("Thread: {0}, Line: {1}", threadNumber, j));
}
});
thread.Start(i);
}
}
Run Code Online (Sandbox Code Playgroud)
我的理解是ParameterizedThreadStart将一个引用副本的对象发送到该线程.如果是这种情况,因为我没有i在每个循环中创建一个本地副本,所有新线程将指向相同的内存位置,这意味着某些线程号可能被"遗漏".虽然运行了这个(甚至对更多的线程/休眠时间),每个值i都有自己的线程.有谁能解释为什么?
我试图理解 Java 中捕获变量的概念。
我找到了关于它的非常详细的文章:http : //www.devcodenote.com/2015/04/variable-capture-in-java.html
我不确定字节码部分:
类似地,为了访问封闭方法的局部变量,会制作变量的隐藏副本并将其保存在内部类文件中,从那里访问变量。
在编译时可能不知道最终原始值时,如何将其保存到类文件中(在编译期间)?
例如:
void foo(int x){
final int y = 10 + x;
class LocalClass(){
LocalClass(){
System.out.println(y); // works fine
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果作者错了,运行时是否将局部变量复制到方法区的LocalClass空间中?
我目前正在思考一些我无法做对的想法.
问题是我想使用一个lambda函数来实例化捕获的变量,并使用另一个lambda来访问该变量的属性.
由于实例化发生在lambda中,变量实际上并没有在我想要在第二个lambda中使用它时实例化.这是一种鸡和蛋的问题.
我知道变量将在第二个lambda中使用时被实例化,但编译器却没有.
我的想法有什么办法可行吗?这是实际的代码:
class Program
{
static void Main(string[] args)
{
SqlCommand cmd;
using (new DisposableComposite(
() => cmd = new SqlCommand(),
() => cmd.Connection)) // <- compiler error - variable not instantiated
{
// code
}
}
}
class DisposableComposite : IDisposable
{
private List<IDisposable> _disposables = new List<IDisposable>();
public DisposableComposite(params Func<IDisposable>[] disposableFuncs)
{
// ensure the code is actually executed
foreach (var func in disposableFuncs)
{
IDisposable obj = func.Invoke();
_disposables.Add(obj);
} …Run Code Online (Sandbox Code Playgroud) 我想计算IEnumerable列表中元素的等级并将其分配给成员.但是下面的代码仅在第一次调用时起作用.第二次通话从最后一个等级值开始.所以我没有输出012和012,而是输入了012和345
class MyClass
{
public string Name { get; set; }
public int Rank { get; set; }
}
public void SecondTimeRankEvaluvate()
{
MyClass[] myArray = new MyClass[]
{
new MyClass() { Name = "Foo" },
new MyClass() { Name = "Bar" },
new MyClass() { Name = "Baz" }
};
int r = 0;
var first = myArray.Select(s => { s.Rank = r++; return s; });
foreach (var item in first)
{
Console.Write(item.Rank);
}
// Prints 012
Console.WriteLine("");
foreach …Run Code Online (Sandbox Code Playgroud)