GVKun编程网logo

委托Roslyn中的缓存行为更改

21

对于委托Roslyn中的缓存行为更改感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于.NET基金会及Roslyn编译器、Android棉花糖中的SimpleDateFormat行为更改、c

对于委托Roslyn中的缓存行为更改感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于.NET 基金会及 Roslyn 编译器、Android棉花糖中的SimpleDateFormat行为更改、c# – Roslyn .rsp文件中的引用、c# – Roslyn Analyzer规则不会使构建失败的宝贵知识。

本文目录一览:

委托Roslyn中的缓存行为更改

委托Roslyn中的缓存行为更改

给出以下代码:

public class C{    public void M()    {        var x = 5;        Action<int> action = y => Console.WriteLine(y);    }}

使用VS2013,.NET 4.5。查看反编译的代码时,我们可以看到编译器正在将委托缓存 在调用站点中:

public class C{    [CompilerGenerated]    private static Action<int> CS$<>9__CachedAnonymousMethodDelegate1;    public void M()    {        if (C.CS$<>9__CachedAnonymousMethodDelegate1 == null)        {            C.CS$<>9__CachedAnonymousMethodDelegate1 = new Action<int>(C.<M>b__0);        }        Action<int> arg_1D_0 = C.CS$<>9__CachedAnonymousMethodDelegate1;    }    [CompilerGenerated]    private static void <M>b__0(int y)    {        Console.WriteLine(y);    }}

查看在Roslyn中反编译的同一代码(使用TryRoslyn),将产生以下输出:

public class C{    [CompilerGenerated]    private sealed class <>c__DisplayClass0    {        public static readonly C.<>c__DisplayClass0 CS$<>9__inst;        public static Action<int> CS$<>9__CachedAnonymousMethodDelegate2;        static <>c__DisplayClass0()        {            // Note: this type is marked as ''beforefieldinit''.            C.<>c__DisplayClass0.CS$<>9__inst = new C.<>c__DisplayClass0();        }        internal void <M>b__1(int y)        {            Console.WriteLine(y);        }    }    public void M()    {        Action<int> arg_22_0;        if (arg_22_0 = C.<>c__DisplayClass0.CS$<>9__CachedAnonymousMethodDelegate2 == null)        {            C.<>c__DisplayClass0.CS$<>9__CachedAnonymousMethodDelegate2 =                            new Action<int>(C.<>c__DisplayClass0.CS$<>9__inst.<M>b__1);        }    }}

现在,我们可以看到委托已被提升到内部的私有类中C,这是我们在关闭实例变量/字段(关闭)时经常看到的类似行为。

我知道 这是一个实施细节,随时可能更改。

我仍然想知道,将委托提升到一个新类并在简单地将其缓存在呼叫站点的地方缓存在那里有什么好处?

编辑:

此问题讨论的行为与此处要求的相同。

答案1

小编典典

是。最重要的部分是包含lambda实现的方法现在是实例方法。

您可以看到一个代表作为中间人的委托,它通过Invoke接收实例调用,并根据实现方法的调用约定调度该调用。

请注意,有一些平台ABI要求,这些要求指定如何传递参数,如何返回结果,通过寄存器传递哪些参数以及在哪些参数中传递“
this”,等等。违反这些规则可能会对依赖堆栈遍历的工具(例如调试器)产生严重影响。

现在,如果实现方法是实例方法,则在委托内部唯一需要发生的就是将“
this”(即在调用时的委托实例)修补为封闭的Target对象。此时,由于其他所有内容都已经存在,因此委托可以直接跳转到实现方法主体。在许多情况下,这比在实现方法是静态方法的情况下需要做的工作少得多。

.NET 基金会及 Roslyn 编译器

.NET 基金会及 Roslyn 编译器

Microsoft 2014 11 月的 Connect() 活动中,在多项新消息中包括开源了 .NET Framework 的核心.NET官方博客的文章),于是引发了很多 Microsoft 拥抱开源、.NET 开源的讨论,但其实这并不是 Microsoft .NET 开始开源的第一天,不论是将开源项目融入 Microsoft 的产品之中(使用 jQueryBootstrap 等作为网站项目模板)、抑或是将 Microsoft 的技术开放源码(e.g., IronPython, ASP.NET MVC 等)都已经有很多年,而比较正式的官方宣布,应该要算是20144 月的 //build/ 2014 开发者大会中,宣布成立 .NET 基金会以及 .NET 编译器(代号:Roslyn)平台的开源

.NET 基金会


为什么宣布开源要成立基金会?我们可以先看看其它开源项目、社区的作法,首先,很多人熟悉的泛 UNIX 系统(包含 LinuxBSD 等)中的GNU 计划的开源软件,就是由自由软件基金会Free Software Foundation)来管理;而许多因特网重要的开源软件项目,如:Apache HTTP 服务器Apache Hadoop 分布式计算平台等,都是由Apache 软件基金会来管理维护;还有坚持网络为开放平台的Mozilla 基金会也主持了许多漫游因特网的软件项目,如:Firefox 等。在开源的世界里,由一个基金会来主持、维护或管理开放源码项目是必然的状况,而且有专职的单位才能够持续各种的维护、管理甚至是壮大生态系,才能让这些项目茁壮或是广泛应用到更多地方,不然你可以想想看,你把自己的项目开源公开出来,影响的范围可能很有限(当然,绝对有神人会一放出来就红了),另一方面,如果 Microsoft 决定将产品或技术开源,但又是由自己的商业公司来主持与经营,自然也不容易建立起更大的生态系撑起这些开源项目。

于是.NET 基金会.NET foundation)就这样诞生了,这个独立于 Microsoft 的基金会就负责管理这些开源的项目,管理来自于各个想贡献这些项目的意见或程序代码,也可以确保这些项目的发展方向不受单一公司主导而且更符合开发人员、社区的需求,通过这样的基金会,也可以看出 .NET 相关技术开源之路的决心,而且也是照着开源社区的作法来做,所以从宣布成立的那一刻起,所有 .NET 相关的技术如果决定开源,都会由这个基金会来管理,在这一页可以看到目前 .NET 基金会所管理的项目。



.NET 基金会持续增加管理的开源项目

.NET 编译器平台 "Roslyn"

同样在 //build/ 2014 上宣布的还有 .NET 编译器平台(compiler platform-- Roslyn的开源,这算是整个 .NET 平台开源的开端,Roslyn 编译器平台的开源主要有三个方向:

  • 编译器最重要的工作之一,就是将开发者写的程序代码转换成执行平台的代码(native code, byte code, IL, LLVM 等),所以编译器与程序代码的语法息息相关,编译器开源后,开发人员与社区不只是可以对编译器本身的功能提出意见,还可以对于程序语言的功能提出意见或改进,像是接下来要发展的 C# 6.0 的语法,就有许多部份是来自于 Roslyn 项目的这个讨论页Discussions under C# Language Design),这意味着你与我都有机会对 C#(或 Visual Basic.NET)提出意见,不再只是 Microsoft 公司内产品单位独自打造而已,让新版的程序语言规格可以更符合社区期待。

  • 除了转换程序代码之外,Roslyn 还包含程序代码分析、语法提示、程序代码重构等等功能,功能强大的 Visual Studio 许多功能都是基于这些功能来开发,在 Roslyn 开源之后,任何人都有机会将这些功能移植到其它编辑器、程序代码工具等,开发人员有更多平台或工具的选择。


  • Sublime 中基于 Roslyn 技术做出 C# 的语法提示。来源:https://github.com/ligershark/Kulture

  • Microsoft 开源 .NET 相关技术之前,原本就有一个 Mono 项目,根据 .NETC# 的规格自行实现了开发及执行环境,也可以将 .NET C# 相关技术带到非 Windows 的平台上,像知名的游戏引擎 Unity3DXamarin所开发的跨平台开发技术(将 C#/.NET 的程序代码编译至 Mac/iOS/Android 平台上)等都是使用 Mono 来实现的,在 Roslyn 开源后,Mono 计划也可以与之相辅相成,互相运用彼此优异的部份,同时也可以贡献给这些基于 Mono 所开发的项目。

  • 通过Roslyn 的开源,除了让这个编译器平台能够广纳接受来自世界各地开发者、开发社区的创新之外,也是 Microsoft 将其发展多年的技术贡献给社区的方式。


    本文分享自微信公众号 - dotNET跨平台(opendotnet)。
    如有侵权,请联系 support@oschina.cn 删除。
    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    Android棉花糖中的SimpleDateFormat行为更改

    Android棉花糖中的SimpleDateFormat行为更改

    我在Android
    6.0(棉花糖)上遇到了日期格式问题。引发以下异常的代码是我的应用程序用于API请求(“客户端”)的纯Java库(单独构建)。如果相关的话,该库是用Java
    1.6构建的……无论如何,这是代码。

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa",Locale.UK);
    Date eventDate = dateFormat.parse(StringUtils.substring(record,23).trim());
    

    record具有价值;

    2015-10-23 Fri 10:59 PM BST   3.60 meters
    

    …“修剪”之后是;

    2015-10-23 Fri 10:59 PM
    yyyy-MM-dd E hh:mm aa
    

    该代码自Froyo成立以来一直有效,并且已经过单元测试。除了棉花糖,所有东西都会抛出异常。

    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: SynchroniseTidePosition.doInBackground
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: java.text.ParseException: Unparseable date: "2015-10-23 Fri 10:59 PM" (at offset 21)
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.text.DateFormat.parse(DateFormat.java:579)
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at com.oceanlife.rover.handler.XTideParser.parseResponse(XTideParser.java:69)
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:107)
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:43)
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.lang.Thread.run(Thread.java:818)
    

    偏移量“ 21”是10:59中“ 9”之后的空格。谁能解释这个失败?

    更新资料

    切换到joda-time,它会显示更多信息的错误消息。这里是;

    Invalid format ... is malformed at "PM"
    

    …所以,这是关于要解析的字符串的AM / PM方面-
    回到文档

    c# – Roslyn .rsp文件中的引用

    c# – Roslyn .rsp文件中的引用

    我在CSharpInteractive.rsp中看到你可以使用/ r在GAC中添加对DLL的引用:

    如何添加对自己的DLL的引用?

    我试过System.Reflection.Assembly.LoadFrom,它没有失败,但没有工作.

    我正在尝试添加对具有扩展方法的DLL的引用.

    如果我尝试直接在交互式窗口中添加扩展方法的代码,我会收到此错误:

    错误CS1109:扩展方法必须在顶级静态类中定义; XYZ是一个嵌套类

    解决方法

    您应该能够以与gac程序集相同的方式指定程序集的完整路径.

    通常,您不需要更改rsp.您可以使用以下方法在常规提交中添加引用:

    #r "path"

    免责声明:我在Roslyn团队的Microsoft工作.

    c# – Roslyn Analyzer规则不会使构建失败

    c# – Roslyn Analyzer规则不会使构建失败

    继MS的 this教程之后,我为Roslyn创建了一个分析器.

    根据该页面,您可以将规则标记为DiagnosticSeverity.Error,这将导致构建中断:

    In the line declaring the Rule field,you can also update the severity of the diagnostics you’ll be producing to be errors rather than warnings. If the regex string doesn’t parse,the Match method will definitely throw an exception at run time,and you should block the build as you would for a C# compiler error. Change the rule’s severity to DiagnosticSeverity.Error:

    internal static DiagnosticDescriptor Rule =
    new DiagnosticDescriptor(DiagnosticId,Title,messageformat,
    Category,DiagnosticSeverity.Error,isEnabledByDefault: true,description: Description);

    在我的代码中,我已经或多或少地创建了规则,如下所示:

    private static readonly DiagnosticDescriptor Rule = 
      new DiagnosticDescriptor(DiagnosticId,Category,true,helpLinkUri: HelpUrl);

    这条规则很好.它会抛出红线,它会在错误列表中显示消息.但是,构建成功,我能够成功运行该应用程序.

    注意:我已创建此规则以捕获此示例的Thread.Sleep.

    是否需要额外的设置来确保规则中断构建?

    解决方法

    这是从VSIX文件运行的分析器的一项功能.

    If the IDE-installed rules ran as part of the in-IDE build,it would result in IDE builds and command line builds having potentially very different outputs. For example,a user with code-cracker installed as a VSIX Could end up filing a bug report that an open source project does not build due to an analyzer error (or perhaps a warning when the project uses /warnaserror). They would be forced to either uninstall the analyzer extension or modify the rule set used by the project to disable some rule that only exists on one developer’s machine.

    In contrast,rules that are installed via NuGet become part of the project and part of the build. They run the same way across developer machines,and they run the same way in-IDE,on the command line,and in automated build environments.

    Source: IDE rules don’t fail builds

    为了使规则的构建失败,您需要将分析器作为nuget包添加到项目中.这将确保失败将导致构建按预期失败.

    今天关于委托Roslyn中的缓存行为更改的讲解已经结束,谢谢您的阅读,如果想了解更多关于.NET 基金会及 Roslyn 编译器、Android棉花糖中的SimpleDateFormat行为更改、c# – Roslyn .rsp文件中的引用、c# – Roslyn Analyzer规则不会使构建失败的相关知识,请在本站搜索。

    本文标签:

    上一篇Visual Studio Code 中的 Pylint“未解决的导入”错误(pycharm dll 未解析 引用)

    下一篇如何从Visual Studio 2012项目降级到Visual Studio 2008(visual studio2010怎么样)