将引用类型参数标记为“内容将更改”

本文关键字:内容将更改 引用 类型参数 记为 | 更新日期: 2023-09-27 18:32:01

例如,我正在将一个像List这样的对象传递给一个函数。

如何向调用方显示此函数实际上会更改该列表/数组/等的内容?

目前,我将其放在函数注释中。有没有一种"正式"的方式来表明这一点?

将引用类型参数标记为“内容将更改”

不幸的是,

没有正式的方法。

你能做的最好的事情就是改用参数类型IEnumerable<T>(如果可以的话),或者你可以使用 ReadOnlyCollection<T>IReadOnlyList<T> 来表达该方法不会更改列表(与你所要求的相反)。

请注意,如果您使用 IReadOnlyList<T> ,如果您传递数组或列表,调用者将不必转换参数,这非常方便:

using System;
using System.Collections.Generic;
namespace Demo
{
    class Program
    {
        void run()
        {
            List<int> list = new List<int> {1};
            test(list); // Caller can just pass list, although method accepts IReadOnlyList<int>
            int[] array = new int[10];
            test(array); // Works with arrays too.
        }
        void test(IReadOnlyList<int> data)
        {
            Console.WriteLine(data.Count);
        }
        static void Main(string[] args)
        {
            new Program().run();
        }
    }
}

仔细想想,我甚至可以说,使用IReadOnlyList<T>是一种正式的表达方式。

但是,这与您所问的相反。它告诉您该方法不会更改传递给它的列表。不幸的是,绝对没有正式的方法来表达方法更改列表(除了记录方法)。

在没有其他说明的文档的情况下,您必须假设任何方法都可以更改传递给它的列表。

不确定

这是否正式,但您可以使用代码契约,例如

Contract.Ensures(((IArray)arr).Count != Contract.OldValue(((IArray)arr).Count));

Contract.Ensures(Contract.Result<IArray>() != ....

取决于您的需求。

我实际上认为单元测试是最正式的方式:)