当我在C#编译器遇到一些非常奇怪的代码时,我正在回答关于闭包(合法地)延长对象生命周期的可能性的问题(如果重要的话,那就是4.0).
我能找到的最短的repro如下:
结果:编译器创建一个闭包对象,该对象引用创建lambda的对象,当它没有理由时 - 委托的"内部"目标是静态方法,并且lambda-creation-object的实例成员不需要在委托执行时被(并且没有)触摸.实际上,编译器的行为就像程序员this无缘无故地捕获的那样.
class Foo
{
private Action _field;
public void InstanceMethod()
{
var capturedVariable = Math.Pow(42, 1);
_field = () => StaticMethod(capturedVariable);
}
private static void StaticMethod(double arg) { }
}
Run Code Online (Sandbox Code Playgroud)
发布版本生成的代码(反编译为'simpler'C#)如下所示:
public void InstanceMethod()
{
<>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1();
CS$<>8__locals2.<>4__this = this; // What's this doing here?
CS$<>8__locals2.capturedVariable = Math.Pow(42.0, 1.0);
this._field = new Action(CS$<>8__locals2.<InstanceMethod>b__0);
}
[CompilerGenerated]
private sealed class …Run Code Online (Sandbox Code Playgroud) IEnumerable中是否允许索引是否有任何特定原因.
我找到了解决问题的方法,但只是想知道它为什么不允许索引.
谢谢,
这些术语似乎有 不同的定义,但我总是想到一个暗示另一个; 当表达式是引用透明但不纯粹时,我无法想到任何情况,反之亦然.
维基百科为这些概念维护单独的文章并说:
从参考透明度:
如果表达式中涉及的所有函数都是纯函数,则表达式是引用透明的.此外,如果丢弃它们的值并且它们的副作用无关紧要,则表达式中可以包含一些不纯的函数.
来自纯粹的表达:
构造纯表达式需要纯函数.[...]纯表达通常被称为引用透明.
我发现这些陈述令人困惑.如果副作用所谓的"非纯函数"是微不足道的,足以让不执行他们(即替换其这种函数的调用值没有实质性改变程序),它是一样的,如果它的是纯粹的第一名,不是吗?
有没有更简单的方法来理解纯表达式和引用透明的表达式之间的差异(如果有的话)?如果存在差异,则可以理解清楚地表明它的示例表达.
language-agnostic functional-programming side-effects referential-transparency purely-functional
我有这个结构
Customer
- has many Orders
- has many OrderItems
Run Code Online (Sandbox Code Playgroud)
我想生成一个CustomerItemsvia LINQ 列表给出一个子集OrderItems:
List of new { Customer, List<OrderItem> Items }
Run Code Online (Sandbox Code Playgroud)
这是客户从商品子集中订购的所有商品的分组
我如何使用LINQ来跟踪客户的订单和分组以生成此对象?
到目前为止,我有点像
items
.GroupBy(i => i, i => i.Order.Customer, (i, customer) => new {customer, i})
Run Code Online (Sandbox Code Playgroud)
但那显然不是列表.我猜我在那里需要一个SelectMany,但是可以用一些指针来做.
我在应用程序中观察到了很多"堆栈内省"代码,这些代码通常隐含地依赖于它们的包含方法没有内联的正确性.这些方法通常涉及到:
MethodBase.GetCurrentMethodAssembly.GetCallingAssemblyAssembly.GetExecutingAssembly现在,我发现围绕这些方法的信息非常混乱.我听说运行时不会内联调用GetCurrentMethod的方法,但我找不到任何相关的文档.我曾多次在StackOverflow上看过帖子,比如这个帖子,表明CLR没有内联交叉汇编调用,但GetCallingAssembly 文档强烈指出不是这样.
还有备受诟病的人[MethodImpl(MethodImplOptions.NoInlining)],但我不确定CLR是否认为这是"请求"或"命令".
请注意,我要求从合同的角度来概述资格,而不是当前JITter的实施由于实施困难而拒绝考虑方法,或者JITter最终在评估交易后最终选择内联合格方法时权衡.我已经阅读了这个和这个,但他们似乎更关注最后两点(有传递提到的MethodImpOptions.NoInlining和"异国情调的IL指令",但这些似乎是作为启发而不是义务呈现).
什么时候CLR 允许内联?
我没有Single在LINQ下面使用,但我仍然得到一个'Sequence contains no elements'异常:
allNames = StockCollection.Where((s) => s.Name.IndexOf("A") == 0)
.Select((s) => s.Name)
.Aggregate((namesInfo, name) => namesInfo += ", " + name);
Run Code Online (Sandbox Code Playgroud)
如果没有以名称开头的库存,则会出现此异常'A'.
似乎一种扩展方法期望至少一个元素满足条件,但这不是预期的.
能否请您提出解决此问题的最佳解决方案?
提前致谢.
我想制作一个需要一个月和一年的功能,并在本月返回List<DateTime>所有日期.
任何帮助将不胜感激
提前致谢
我想获得鼠标指针所在的控件的鼠标位置.这意味着当我将光标放在控件的起点(左上角)时,它应该给出(0,0).我使用以下代码:
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
this.Text = Convert.ToString(Cursor.Position.X + ":" + Cursor.Position.Y);
}
Run Code Online (Sandbox Code Playgroud)
但是这给出了与屏幕无关的控制位置.
代码示例将不胜感激.