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

时间:2013-09-19 09:39:27

标签: c# pass-by-reference

我将一个像List这样的对象传递给一个函数。

如何向调用者显示此函数实际上是否会更改该List / Array / etc的内容?

目前,我把它放在功能评论中。是否有“正式”方式表明这一点?

2 个答案:

答案 0 :(得分:1)

遗憾的是,这不是一种正式的方式。

您可以做的最好是改为参数类型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> 是一种正式的正式方式来表达这一点。

然而,这就是你所要求的相反。它告诉您方法不会更改传递给它的列表。不幸的是,绝对没有正式的方法来表示方法更改列表(除了记录方法)。

如果没有另外说明的文档,你必须假设任何方法可以更改传递给它的列表。

答案 1 :(得分:0)

不确定这是正式,但您可以使用code contract之类的

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

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

取决于您的需求。

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