修改作为方法参数传递的集合(数组,等等)是否正常(ok)?

时间:2014-02-12 16:15:39

标签: c# .net parameters parameter-passing

没关系,正常,遵循标准指南......(你得到它)有一个类似下面的方法:

public void Method(IList<int> test)
{
    test.Add(1);
}

不知怎的,我希望方法签名中的某些信息可以修改参数(比如ref或out),或者像返回值一样返回相同的列表,例如:

public IList<int> Method(IList<int> test)
{
    test.Add(1);
    return test;
}
你怎么看? 提前谢谢。

5 个答案:

答案 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)

我认为如果你的代码中的某个功能与索引操作相关联(特别是对于数组)你可能会超出范围异常