我在我们的应用中发现了一些代码,它通过引用传递List<T>
以表明它已被修改:
void DoSomething(ref List<MyType> theList)
{
theList.Add(new MyType());
}
我认为很明显ref-keyword在这种情况下已经过时了,因为我们也可以在没有关键字的情况下向列表添加新元素。但是它表明我们修改了列表或至少修改了它的元素。我发现如果你有很多参数并希望看到哪些参数被修改以及哪些只是作为值来传递,那么这个特别有用。
这是否合适的问题肯定是基于意见的,对SO来说是无效的,我宁愿问是否有另一种方法来实现这一点,或者我是否应该关心它。
编辑:稍微澄清一下我的问题。如果列表被修改,这个问题不,这只是一个例子。或者我也使用任何其他参考类型,而不仅仅是List<T>
。
答案 0 :(得分:5)
然而,它表明我们正在更改列表。
不,它没有。它表示可以更改参考。使用ref
关键字作为&#39;标识符&#39;可以改变的东西在我看来是不好的,因为它打开了你可能不想要的大门。
我建议研究面向方面的编程,你可以为方法参数赋值。从新的Roslyn编译器及其代码分析服务,您甚至可以检查代码是否违反了给定的主体。
答案 1 :(得分:0)
/// <summary/>
/// <param name="theList">list to be modified</param>
void DoSomething(List<MyType> theList)
我想这更好,因为它不依赖于关键字的错误使用。但是,它假设我们的API的客户仔细阅读文档。
答案 2 :(得分:-2)
阅读界面比阅读参考更加容易和广泛,并认为它是可变的集合。
例如,如果您希望它保持不变:
public DoSomething<T>(IReadOnlyCollection<T> collection)
{
//....
}
非恒定:
public DoSomething<T>(List<T> collection)
{
//....
}
在价值类型的情况下,确实正如您在问题中澄清的那样:
常数:
public DoSomething(int value)
{
//....
}
非恒定:
public DoSomething(ref int value)
{
//....
}
或者,如果您的类型无法访问代码,例如,Stream:
public class StreamWrapper
{
private Stream _instance;
//now you can specify read or edit methods here and use this class in invokation.
}