Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按引用传递引用类型以指示将对其进行修改_C#_Ref - Fatal编程技术网

C# 按引用传递引用类型以指示将对其进行修改

C# 按引用传递引用类型以指示将对其进行修改,c#,ref,C#,Ref,我在我们的应用程序中发现一些代码通过引用传递列表,表明它已被修改: void DoSomething(ref List<MyType> theList) { theList.Add(new MyType()); } void DoSomething(参考列表) { 添加(新的MyType()); } 我认为很明显,在这种情况下ref关键字是过时的,因为我们也可以在没有关键字的情况下向列表中添加新元素。但是,它表明我们修改了列表或至少修改了它的元素。我发现,如果您有许多参数

我在我们的应用程序中发现一些代码通过引用传递
列表
,表明它已被修改:

void DoSomething(ref List<MyType> theList)
{
    theList.Add(new MyType());
}
void DoSomething(参考列表)
{
添加(新的MyType());
}
我认为很明显,在这种情况下ref关键字是过时的,因为我们也可以在没有关键字的情况下向列表中添加新元素。但是,它表明我们修改了列表或至少修改了它的元素。我发现,如果您有许多参数,并且希望查看其中哪些参数被修改,哪些只是作为值传递来完成工作,那么这一点特别有用

这个问题是否可以肯定是基于意见的,因此是无效的,我宁愿问是否有其他方法来实现这一点,或者我是否应该关心它


编辑:澄清一下我的问题。这个问题是而不是如果列表被修改,这只是一个例子。或者,我也会使用任何其他引用类型,而不仅仅是
列表

>P>阅读<强>接口比查看REF更容易和更广泛,并考虑它可改变的集合。

例如,如果希望其为常数:

public DoSomething<T>(IReadOnlyCollection<T> collection)
{
     //....
}
非常数:

public DoSomething<T>(IReadOnlyCollection<T> collection)
{
     //....
}
public DoSomething<T>(List<T> collection)
{
     //....
}
public DoSomething(ref int value)
{
     //....
}
或者,如果您具有无法访问代码的类型,例如,流:

public class StreamWrapper
{
    private Stream _instance;

    //now you can specify read or edit methods here and use this class in invokation.
}

<> >阅读<强>接口比查看REF更容易和更广泛,并考虑它可以改变的集合。

例如,如果希望其为常数:

public DoSomething<T>(IReadOnlyCollection<T> collection)
{
     //....
}
非常数:

public DoSomething<T>(IReadOnlyCollection<T> collection)
{
     //....
}
public DoSomething<T>(List<T> collection)
{
     //....
}
public DoSomething(ref int value)
{
     //....
}
或者,如果您具有无法访问代码的类型,例如,流:

public class StreamWrapper
{
    private Stream _instance;

    //now you can specify read or edit methods here and use this class in invokation.
}
但是,这表明我们正在更改列表

不,没有。它表示可以更改引用。在我看来,使用
ref
关键字作为“标识符”是不好的,因为它打开了你可能不想要的门

如果您可以为方法参数分配属性,我建议您研究面向方面的编程。通过新的Roslyn编译器及其代码分析服务,您甚至可以检查代码是否违反了给定的原则

但是,这表明我们正在更改列表

不,没有。它表示可以更改引用。在我看来,使用
ref
关键字作为“标识符”是不好的,因为它打开了你可能不想要的门


如果您可以为方法参数分配属性,我建议您研究面向方面的编程。通过新的Roslyn编译器及其代码分析服务,您甚至可以检查代码是否违反了给定的原则。

Patrick向我介绍了一种不依赖属性的替代方法,以便我们可以在使用旧编译器的机器上的遗留代码中使用它。当然,我们可以适当地编写API文档,以指示该方法修改传递的参数:

/// <summary/>
/// <param name="theList">list to be modified</param>
void DoSomething(List<MyType> theList)
//
///要修改的列表
无效剂量(列表中列出)

我想这是更好的,因为它不依赖于关键字的过度使用。不过,它假设API的客户端仔细阅读文档。

Patrick引导我找到一种不依赖属性的替代方法,这样我们就可以在使用旧编译器的机器上的遗留代码中使用它。当然,我们可以适当地编写API文档,以指示该方法修改传递的参数:

/// <summary/>
/// <param name="theList">list to be modified</param>
void DoSomething(List<MyType> theList)
//
///要修改的列表
无效剂量(列表中列出)


我想这是更好的,因为它不依赖于关键字的过度使用。然而,它假设API的客户仔细阅读文档。

当然,列表只是一个示例。有多种类型不支持该接口。对于
List
来说,这是一个不错的选择。@patrickhoffman感谢clearify,这只是一个例子。当然,可以有任意类型传递给该方法。为什么每个人都不争论地向下投票?问题不在于ref关键字通常做什么,而是是否有另一种(更好的)方法来指示参数被修改(未重新分配)。在我的示例中,我实际在哪里重新设计引用类型?我只在讨论值类型时才提到重新设计,因为这是它们的工作方式。列表只是一个例子。有多种类型不支持该接口。对于
List
来说,这是一个不错的选择。@patrickhoffman感谢clearify,这只是一个例子。当然,可以有任意类型传递给该方法。为什么每个人都不争论地向下投票?问题不在于ref关键字通常做什么,而是是否有另一种(更好的)方法来指示参数被修改(未重新分配)。在我的示例中,我实际在哪里重新设计引用类型?我只在讨论值类型时提到重新设计,因为这是它们的工作方式。依赖属性可能是一种选择,但是我认为,由于我们的团队不使用此编译器,另一种方法是只依赖方法的API文档。这确实是可能的。Roslyn被VS 2015使用,所以很可能你已经在使用它了。我们实际上在使用VS2010:)我不明白为什么给ref一词可能不好?此外,VisualStudio不会显式显示哪些给定对象是引用对象或不是引用对象。ref word使其更为明确,依赖属性可能是一种选择,但我认为,由于我们的团队不使用此编译器,另一种方法是仅依赖该方法的API文档。这确实是可能的。Roslyn被VS 2015使用,所以很可能你已经在使用它了。我们实际上在使用VS2010:)我不明白为什么给ref一词可能不好?此外,VisualStudio不会显式显示哪些给定对象是引用对象或不是引用对象。ReWord让你明确的是,你寻找一个等价于C++的C++ > CONST <代码>参数吗?@伯恩哈希勒,我怀疑,我想指出一个参数在我的方法中被修改,而不是相反。这种效果是通过包装器中的接口实现和限制实现的