例如,我将一个像 List 这样的对象传递给一个函数。
如何向调用者表明此函数实际上会更改该列表/数组/等的内容?
目前,我把它放在函数注释中。有没有“正式”的方式来表明这一点?
例如,我将一个像 List 这样的对象传递给一个函数。
如何向调用者表明此函数实际上会更改该列表/数组/等的内容?
目前,我把它放在函数注释中。有没有“正式”的方式来表明这一点?
不幸的是,没有正式的方式。
您可以做的最好的事情是改为使用参数类型IEnumerable<T>
(如果可以的话),或者您可以使用ReadOnlyCollection<T>
orIReadOnlyList<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();
}
}
}
考虑一下,我可能会说 usingIReadOnlyList<T>
是表达这一点的正式方式。
但是,这与您所要求的相反。它告诉您该方法不会更改传递给它的列表。不幸的是,绝对没有正式的方式来表达一个方法会改变列表(除了记录方法)。
在没有文档另有说明的情况下,您必须假设任何方法都可以更改传递给它的列表。
不确定这是否正式,但您可以使用代码合同,例如
Contract.Ensures(((IArray)arr).Count != Contract.OldValue(((IArray)arr).Count));
或者
Contract.Ensures(Contract.Result<IArray>() != ....
取决于你的需要。
我实际上认为单元测试是最正式的方式:)