Оптимизирует ли компилятор поле функтора, инициализированное в своем объявлении лямбда-выражением, чтобы сделать лямбда-стати c? - PullRequest
0 голосов
/ 09 апреля 2020

Если я напишу класс, как у меня ниже:

using System;

namespace MyNamespace
{
    public class MyClass1
    {
        //example Functor
        public Func<int, bool> IsLeapYear { get; set; } = (year) => (year % 4u == 0u && year % 100 != 0) || (year % 400 == 0);
    }
}

Есть ли у меня разные экземпляры функтора для каждого экземпляра MyClass или ссылки на один и тот же?

Что если я сделаю это?

using System;

namespace MyNamespace
{
    public class MyClass2
    {
        private static readonly Func<int, bool> _isLeapYear = (year) => (year % 4u == 0u && year % 100 != 0) || (year % 400 == 0);
        public Func<int, bool> IsLeapYear { get; set; } = _isLeapYear;
    }
}

Я бы ожидал, что в этом случае каждый экземпляр MyClass2 будет точно содержать один и тот же экземпляр функтора. Я хочу знать, эквивалентен ли код MyClass1 коду MyClass2 , потому что у меня в одном классе тонна функторов, и я надеялся сократить свой код.

I используйте .NetCore 3.1, C# 8.0, Visual Studio Enterprise 2019. (Я пометил вопрос с помощью , поскольку считал, что компилятор является частью фреймворка).

[Редактировать: выделен жирным шрифтом фактический вопрос]

1 Ответ

2 голосов
/ 09 апреля 2020

Это будет тот же экземпляр.

public class MyClass1
{
    //example Functor
    public Func<int, bool> IsLeapYear { get; set; } = 
        (year) => (year % 4u == 0u && year % 100 != 0) || (year % 400 == 0);
}

var a = new MyClass1();
var b = new MyClass1();

// result = true
var result = object.ReferenceEquals(a.IsLeapYear, b.IsLeapYear);
...