C# 是否可以设置;这";在匿名函数中?
我有一个函数C# 是否可以设置;这";在匿名函数中?,c#,anonymous-function,C#,Anonymous Function,我有一个函数 public SharpQuery Each(Action<int, HtmlNode> function) { for (int i = 0; i < _context.Count; ++i) function(i, _context[i]); return this; } 否。 好的,是的,如果操作是在这样一个范围内创建的,其中“this”是可用的,并绑定在一个闭包中——但透明地说:否 传递所有需要的信息,或确保在行动本身中捕
public SharpQuery Each(Action<int, HtmlNode> function)
{
for (int i = 0; i < _context.Count; ++i)
function(i, _context[i]);
return this;
}
否。
好的,是的,如果操作是在这样一个范围内创建的,其中“this”是可用的,并绑定在一个闭包中——但透明地说:否
传递所有需要的信息,或确保在行动本身中捕获/可用。还有其他一些黑客,如线程局部变量等,最好避免。只需稍微更改函数,就可以达到预期效果
public SharpQuery Each(Action<MyObject, int, HtmlNode> function)
{
for (int i = 0; i < _context.Count; ++i)
function(this, i, _context[i]);
return this;
}
注意:匿名函数只能访问公共成员。如果匿名函数是在类中定义的,它将像往常一样访问受保护的和私有的成员
e、 g
类MyObject
{
公共对象(int i)
{
这个数字=i;
}
公共整数{get;private set;}
私有int NumberPlus{get{返回数+1;}}
公共无效行为(行为)
{
行动(本);
}
public void PrintNumberPlus()
{
DoAction(self=>Console.WriteLine(self.NumberPlus));//有权访问私有的`NumberPlus`
}
}
MyObject obj=新的MyObject(20);
obj.DoAction(self=>Console.WriteLine(self.Number));//好啊
obj.PrintNumberPlus();//好啊
obj.DoAction(self=>Console.WriteLine(self.NumberPlus));//错误
想要一点JavaScript进入C#?:)@混沌:我可以没有它生活。。。但我正试图尽可能地模仿某个JS库。我想你可以把它看作是一个“匿名扩展方法”。+1但OP似乎想在C#中完美地模拟jQuery。您的解决方案使。每个方法都不同于jQuery中的方法。无论如何,这是我能想到的最好的解决方案。实际上,我希望“this”指的是HtmlNode,而不是MyObject。它不是真的需要,因为我已经通过了。。。但我正试图从jQuery复制一些功能。我猜答案是“不”。@Mark:答案是“不”。“这个”在JS中比在C#中使用得更自由。恐怕您需要在SharpQuery规范中添加一条注释,说明匿名函数中不支持“this”关键字。
@Mark:当然,用适当的类型替换MyObject
,我不确定您的代码中有什么。不幸的是,关键字this
不能在实例上下文之外使用。即便如此,它也不能被重新分配。我认为这是在C#中最接近的方法。否则,在实例之外就没有这个的概念。不幸的是,您不能用与jQuery完全相同的方式来实现它,这将是一种折衷。
public SharpQuery Each(Action<MyObject, int, HtmlNode> function)
{
for (int i = 0; i < _context.Count; ++i)
function(this, i, _context[i]);
return this;
}
sharpQuery.Each((self, i, node) => /* do something with `self` which is "this" */);
class MyObject
{
public MyObject(int i)
{
this.Number = i;
}
public int Number { get; private set; }
private int NumberPlus { get { return Number + 1; } }
public void DoAction(Action<MyObject> action)
{
action(this);
}
public void PrintNumberPlus()
{
DoAction(self => Console.WriteLine(self.NumberPlus)); // has access to private `NumberPlus`
}
}
MyObject obj = new MyObject(20);
obj.DoAction(self => Console.WriteLine(self.Number)); // ok
obj.PrintNumberPlus(); // ok
obj.DoAction(self => Console.WriteLine(self.NumberPlus)); // error