小编Ani*_*Ani的帖子

这个object-lifetime-extends-closure是一个C#编译器错误吗?

当我在C#编译器遇到一些非常奇怪的代码时,我正在回答关于闭包(合法地)延长对象生命周期的可能性的问题(如果重要的话,那就是4.0).

我能找到的最短的repro如下:

  1. 在调用包含类型的静态方法时创建一个捕获局部的lambda .
  2. 将生成的委托引用分配给包含对象的实例字段.

结果:编译器创建一个闭包对象,该对象引用创建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)

c# lambda closures memory-leaks object-lifetime

136
推荐指数
2
解决办法
3811
查看次数

仅从DateTime对象获取日期或时间

我有一个DateTime具有日期和时间的实例.如何仅提取日期或仅提取时间?

.net c# datetime

73
推荐指数
5
解决办法
10万
查看次数

无法将带有[]的索引应用于类型为"System.Collections.Generic.IEnumerable <>的表达式"

IEnumerable中是否允许索引是否有任何特定原因.

我找到了解决问题的方法,但只是想知道它为什么不允许索引.

谢谢,

c# generics ienumerable

61
推荐指数
5
解决办法
9万
查看次数

纯度与参考透明度

这些术语似乎有 不同的定义,但我总是想到一个暗示另一个; 当表达式是引用透明但不纯粹时,我无法想到任何情况,反之亦然.

维基百科为这些概念维护单独的文章并说:

参考透明度:

如果表达式中涉及的所有函数都是纯函数,则表达式是引用透明的.此外,如果丢弃它们的值并且它们的副作用无关紧要,则表达式中可以包含一些不纯的函数.

来自纯粹的表达:

构造纯表达式需要纯函数.[...]纯表达通常被称为引用透明.

我发现这些陈述令人困惑.如果副作用所谓的"非纯函数"是微不足道的,足以让不执行他们(即替换其这种函数的调用没有实质性改变程序),它是一样的,如果它的是纯粹的第一名,不是吗?

有没有更简单的方法来理解纯表达式和引用透明的表达式之间的差异(如果有的话)?如果存在差异,则可以理解清楚地表明它的示例表达.

language-agnostic functional-programming side-effects referential-transparency purely-functional

58
推荐指数
2
解决办法
5664
查看次数

LINQ Group By和select系列

我有这个结构

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,但是可以用一些指针来做.

c# linq group-by

56
推荐指数
3
解决办法
16万
查看次数

如何在C#中检索磁盘信息?

我想使用C#访问计算机上逻辑驱动器的信息.我该怎么做到这一点?谢谢!

c# disk

46
推荐指数
4
解决办法
5万
查看次数

什么时候有资格被CLR内联的方法?

我在应用程序中观察到了很多"堆栈内省"代码,这些代码通常隐含地依赖于它们的包含方法没有内联的正确性.这些方法通常涉及到:

  • MethodBase.GetCurrentMethod
  • Assembly.GetCallingAssembly
  • Assembly.GetExecutingAssembly

现在,我发现围绕这些方法的信息非常混乱.我听说运行时不会内联调用GetCurrentMethod的方法,但我找不到任何相关的文档.我曾多次在StackOverflow上看过帖子,比如这个帖子,表明CLR没有内联交叉汇编调用,但GetCallingAssembly 文档强烈指出不是这样.

还有备受诟病的人[MethodImpl(MethodImplOptions.NoInlining)],但我不确定CLR是否认为这是"请求"或"命令".

请注意,我要求从合同的角度来概述资格,而不是当前JITter的实施由于实施困难而拒绝考虑方法,或者JITter最终在评估交易后最终选择内联合格方法时权衡.我已经阅读了这个这个,但他们似乎更关注最后两点(有传递提到的MethodImpOptions.NoInlining和"异国情调的IL指令",但这些似乎是作为启发而不是义务呈现).

什么时候CLR 允许内联?

.net clr jit inlining

37
推荐指数
2
解决办法
4047
查看次数

序列在linq中不包含任何元素异常,甚至不使用Single

我没有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'.

似乎一种扩展方法期望至少一个元素满足条件,但这不是预期的.

能否请您提出解决此问题的最佳解决方案?

提前致谢.

c# linq string linq-to-objects sequences

35
推荐指数
3
解决办法
1万
查看次数

如何在C#中获得给定月份的所有日期

我想制作一个需要一个月和一年的功能,并在本月返回List<DateTime>所有日期.

任何帮助将不胜感激

提前致谢

c# datetime list

31
推荐指数
2
解决办法
3万
查看次数

获取相对于控件的光标位置 - C#

我想获得鼠标指针所在的控件的鼠标位置.这意味着当我将光标放在控件的起点(左上角)时,它应该给出(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)

但是这给出了与屏幕无关的控制位置.

代码示例将不胜感激.

c# mouse winforms mouse-position

31
推荐指数
4
解决办法
7万
查看次数