在哪些情况下编译器会在 C# 中生成额外的代码?

问题描述 投票:0回答:0

所以我一直在使用 ILSpy 和 dnSpy 检查一些程序集,并注意到各种编译器生成的类和方法。一些例子:

Getter语法如

public Value { get; set; }
改为:

    [CompilerGenerated]
    public int GetValue()
    {
        return this.value;
    }

    [CompilerGenerated]
    public void SetValue(int value)
    {
        this.value = value;
    }

事件语法

public event EventHandler SomeEvent;
改为:

    [CompilerGenerated]
    public void Add(EventHandler someHandler)
    {
        EventHandler eventHandler = this.eventHandler;
        EventHandler eventHandler2;
        do
        {
            eventHandler2 = eventHandler;
            EventHandler value = (EventHandler)Delegate.Combine(eventHandler2, someHandler);
            eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.eventHandler, value, eventHandler2);
        }
        while (eventHandler != eventHandler2);
    }

    [CompilerGenerated]
    public void Remove(EventHandler someHandler)
    {
        EventHandler eventHandler = this.eventHandler;
        EventHandler eventHandler2;
        do
        {
            eventHandler2 = eventHandler;
            EventHandler value = (EventHandler)Delegate.Remove(eventHandler2, someHandler);
            eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.eventHandler, value, eventHandler2);
        }
        while (eventHandler != eventHandler2);
    }

此外,

yield return
导致整个生成的类实现
IEnumerator
接口,复杂的
async
/
await
流变成状态机结构等。

所以问题是: 我怎样才能在上述程序集中实现编译器代码生成行为?

我试图重现这些编译器代码生成,但无论我在哪个 .NET 框架版本和 C# 语言版本下构建了我的测试应用程序(在发布模式下设置了优化复选标记),它都产生了漂亮干净的程序集,所以我所有的源代码代码原封不动。

c# compiler-optimization generated-code
© www.soinside.com 2019 - 2024. All rights reserved.