没关系,正常,遵循标准指南......(你得到它)有一个类似下面的方法:
public void Method(IList<int> test)
{
test.Add(1);
}
不知怎的,我希望方法签名中的某些信息可以修改参数(比如ref或out),或者像返回值一样返回相同的列表,例如:
public IList<int> Method(IList<int> test)
{
test.Add(1);
return test;
}
你怎么看?
提前谢谢。
答案 0 :(得分:2)
我个人试图避免使用这种方法,并尝试坚持更“功能”的方式,其中方法需要一些输入返回输出。当然,有时候实际更改方法中的列表是最有意义的,但是我试图用方法名称非常明确。
另一方面,你的第二个例子是两个世界中最糟糕的:它不仅修改了参数,还通过返回值隐藏了这个事实。这个绝对是代码味道。
答案 1 :(得分:1)
是的,它在C#和Java世界中完全没问题。
这一件事总让我有点不安,来自C ++背景。在C ++中,作为库作者,我可以将方法参数标记为const
,以指示您 - 客户端代码 - 可以安全地向我提供您的数据,而我 - 库 - 承诺在不打扰的情况下使用它它
你不会在C#和Java中得到它。我们的理念是,您可以遍布各地的参考文件,而无需复制效率,但这样做,您就可以让库更改您的数据。通常情况下,这很好,因为除非在类文档中写入,否则库不会触及您的数据;但是,没有编译器强制保证这一点。
如果您(客户端代码作者)对于您在交付到库时修改的数据真的很偏执,那么在将数据交给我的库之前,您需要复制或克隆数据。这样做会导致制作副本的运行时间损失。
答案 2 :(得分:0)
public IList<int> Method(IList<int> test)
{
test.Add(1);
return test;
}
类型IList<int>
实际上已经表明您需要IList<T>
中不存在的Add
方法(例如IEnumerable<T>
)。
当然,您需要通过为方法提供有用的名称以及XML文档来记录方法实际执行的操作,如果它可供其他开发人员公开使用。
答案 3 :(得分:0)
是的,如果知道开发人员提供了很好的文档评论,或者该过程通过一个很好的描述性方法名称来了解它。使用名称Method(List)
不是。
public void FindMoreIds(IList<int> ids)
{
...
ids.Add(...);
...
}
现在这是有效的,因为有意义的是,会在签名时修改集合。你做的不想做的事情是这样设置的:
public IList<int> FindMoreIds(IList<int> ids)
{
...
ids.Add(...);
...
return ids;
}
开发人员会认为他们传递的原始集合是未经修改的。
如果您不打算修改集合,当然还有其他解决方案可供使用。您可以使用IEnumerable<T>
或数组。
答案 4 :(得分:0)
我认为如果你的代码中的某个功能与索引操作相关联(特别是对于数组)你可能会超出范围异常