编译器是否优化了由 lambda 在其声明中初始化的仿函数字段以使 lambda 静态?
Does the compiler optimize a functor field initialized in its declaration by a lambda to make the lambda static?
如果我像下面这样写 class:
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 的代码 因为我在同一个 class 中有大量的仿函数,我希望让我的代码更短.
我使用 .NetCore 3.1、C# 8.0、Visual Studio Enterprise 2019。(我用 .net-core-3.1 标记了问题,因为我认为编译器是框架的一部分)。
[编辑:以粗体突出显示实际问题]
将是同一个实例。
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);
如果我像下面这样写 class:
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 的代码 因为我在同一个 class 中有大量的仿函数,我希望让我的代码更短.
我使用 .NetCore 3.1、C# 8.0、Visual Studio Enterprise 2019。(我用 .net-core-3.1 标记了问题,因为我认为编译器是框架的一部分)。
[编辑:以粗体突出显示实际问题]
将是同一个实例。
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);