在 C# 中将 Lambda 表达式添加到 DisplaySettingsChanged 事件处理程序

Adding Lambda Expression to DisplaySettingsChanged event handler in c#

我正在创建一个 C# WPF 自定义控件库,我的库使用来自 SystemEvents Class 的 DisplaySettingsChanged 事件,Microsoft 在文档中提到了分离事件处理程序。

Because this is a static event, you must detach your event handlers when your application is disposed, or memory leaks will result.

那么是否可以在程序中使用lambda表达式而不导致内存泄漏(不使用-=).

这意味着:

我可以用这个吗:

SystemEvents.DisplaySettingsChanged += (_, _) =>
{
   // My code Here
};

而不是使用这个:

SystemEvents.DisplaySettingsChanged += OnDisplaySettingsChanged;
SystemEvents.DisplaySettingsChanged -= OnDisplaySettingsChanged; // Calling this in Dispose Method

完整代码

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Interop;

namespace FluentCompositor.Core
{
    public sealed class CompositionMetrics : IDisposable
    {
        private readonly HwndSource hwndSource;

        public CompositionMetrics(HwndSource source)
        {
            hwndSource = source;
            SystemEvents.DisplaySettingsChanged += OnDisplaySettingsChanged; //added event handler over here
        }

        private void OnDisplaySettingsChanged(object? sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

        public void Dispose()
        {
            SystemEvents.DisplaySettingsChanged -= OnDisplaySettingsChanged; // disposing event handler here
        }

        #region Properties

        public int Width
        {
            get;
            private set;
        }

        public int Height
        {
            get;
            private set;
        }

        public double ScaleFactor
        {
            get;
            private set;
        }

        #endregion
    }
}

你不能。 Lambda 是匿名的,因此您将无法分离事件,从而导致内存泄漏。

我认为,您可以将 lambda 存储在 class 级字段中,然后使用该值来分离事件,但这与不使用 lambda 的序号处理程序的方法几乎相同。