c# - 方法内修改方法参数或返回结果

标签 c# .net

有什么区别

private void DoSomething(int value) {
    value++;
}

private int DoSomething(int value) {
   return value++;
}

当用作其中之一时

DoSomething(value);

对比

value = DoSomething(value);

最佳答案

你在谈论按引用传递按值传递之间的区别,这在概念上类似于值类型与引用类型的概念强>.

如果将值类型传递给方法,则必须使用第二个示例;否则你只是增加一个存在于 DoSomething() 范围内的整数。试一试:如果您执行第一个示例,在 DoSomething() 运行后,您的 int 值将保持不变。

但是,如果您传递的不是值类型(比如对象 foo),您实际上是在传递引用到原始对象。你在 DoSomething() 中对它做的任何事情也会在方法外生效,因为你仍然指的是同一个对象。

您可以通过编写以下内容来完成您在第一个示例中尝试的内容:

void DoSomething(ref int value)

这指示 .NET 传递对项目的引用,而不管它是否是值类型。

请参阅关于 Value Types vs Reference Types 的这篇文章 在 MSDN 上查看更详细的信息。

此外,作为 zodoz points out (适本地投票),通过返回 value++ 你正在返回然后递增。要返回增加后的值,请使用 ++value

关于c# - 方法内修改方法参数或返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/555471/

相关文章:

c# - 图像的一部分内的 WPF ScrollableViewer

c# - 并发互锁和读取是否需要内存屏障或锁定?

C# 从 .NET 3.5 转换为 3.0

c# - 如何检索 XmlDocument 对象中的所有 XmlEntityReference 对象?

c# - Linq - 将 lambda 隔离为委托(delegate)

c# - 绑定(bind)到 WPF 中的 TreeView

c# - 当我对引用类型和值类型执行转换时到底发生了什么

.net - 如何使用响应式框架将两个异步操作链接在一起?

c# - 当我在我的 WPF 窗口中放置一个文本框或按钮时,它是使用 DirectX 还是 User32 呈现的?

c# - Nhibernate:连接表并从其他表获取单列