纯属性没用吗?

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

我在.NET源代码(System.Diagnostics.Contracts.PureAttribute)中找到了PureAttribute,总结如下:

表示类型或方法是纯类型或方法,即它不会进行任何可见的状态更改。 我在这里检查了降低了C#

我在调试模式“调试”->“窗口”->“反汇编”下检查过,代码是完全相同的。那么有什么不同呢?我发现“有一份合同”等或“如果我们发送相同的参数总是会得到相同的结果”。好吧,明白了,但如果它没有改变我们,它还存在吗?没有表现?没有可读性?那份合同是什么?

我希望得到这些问题的答案:

  • 如果它没有改变什么,为什么它存在?没有表现?没有可读性?
  • 那份合同是什么?
c# performance attributes
1个回答
1
投票

[Pure]
属性的最初目的似乎是支持旧的“代码契约”分析,遗憾的是该分析已不再开发。

[Pure]
属性用于任何代码分析:

当前分析工具不强制执行此属性

现在唯一的目的是记录一个方法不会导致任何可观察的状态变化这一事实 - 但不幸的是,据我所知,没有任何代码分析工具实际上强制执行这一点。

有一个由

[Pure]
属性引发的 Resharper 警告:如果您忽略纯方法的返回值,Resharper 会警告您。除此之外,如果您在纯方法中修改可观察状态或更改纯参数的状态,似乎没有任何警告您,如以下代码所示:

using System;
using System.Diagnostics.Contracts;

namespace Console1;

public static class Program
{
    static void Main(string[] args)
    {
        CalculateSomething(); // Resharper warning: "Return value of pure method not used".
        ChangeSomething();    // Resharper warning: "Return value of pure method not used".
        DoSomething();        // No warnings.
    }

    [Pure] public static int CalculateSomething()
    {
        return _field;
    }

    [Pure] public static int ChangeSomething()
    {
        _field = 1; // Provokes NO warning.
        return 42;
    }

    public static int DoSomething()
    {
        return _field;
    }

    public static void ChangeParameter([Pure] Random rng)
    {
        _ = rng.Next(); // No warning about calling impure method of pure parameter.
    }

    static int _field;

}
如果您未能观察纯方法的返回值,

Microsoft 的代码分析也会发出 类似的警告 CA1806

© www.soinside.com 2019 - 2024. All rights reserved.