c# - 通过引用传递和使用 ref

标签 c# .net parameters reference methods

我查看了类似的问题并阅读了一些文章。 THis文章有一些图片可以清楚地说明。

SomeObject so = new SomeObject();
somefunction(so);
Console.write(so.x); // will print 1

SomeObject so1 = new SomeObject();
somefunctionByRef(so1);
Console.write(so1.x); // will print 1


static void somefunction(SomeObject so)
{
    so.x = 1;
}

public void somefunctionByRef(ref SomeObject so)
{
    so.x = 1;
}

这两种方法对此引用类型具有相同的效果。那么为什么选择 ref 关键字作为引用类型呢?

使用 somefunction(SomeObject so) 并修改方法内的对象并期望不使用 ref 关键字进行更改是一种不好的做法(可能是错误的)吗?

最佳答案

.Net 中的默认参数传递是按值完成的。对于值类型和引用类型都是如此。不同之处在于,使用引用类型时,您将按值传递对实例的引用,而不是实际对象。

效果是原函数中的so引用和someFunction是独立的。更改引用引用的实例不会影响另一个实例。然而,因为它们引用同一个对象,所以它们可以看到另一个对象对该对象所做的突变(这就是示例中 x 发生变化的原因)

SomeObject so = new SomeObject();
so.x = 42;
somefunction(so);
Console.Write(so.x); // will print 42

static void somefunction(SomeObject so) {
  so = new SomeObject();
  so.x = 13;
}

ref 修饰符导致参数通过引用而不是值传递。实际上没有引用的副本,原始函数和调用函数中的 so 是相同的引用。因此,重置一个会重置另一个

SomeObject so = new SomeObject();
so.x = 42;
somefunction(ref so);
Console.Write(so.x); // will print 13

static void somefunction(ref SomeObject so) {
  so = new SomeObject();
  so.x = 13;
}

关于c# - 通过引用传递和使用 ref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3411270/

相关文章:

sql - 数据流任务中的 SSIS 变量使用不正确

c# - 使 .txt 文件不可读/不可编辑

.net - 安装 .NET 4.5 真的会取代 .NET 4.0 程序集吗?

c# - 有没有像 HTML 中的 DIV 一样工作的 Crystal Reports 对象?

.net - 基于联合声明的身份验证和单点登录

JavaScript 可变参数?

database - 在哪里放置我需要的 Symfony2 自定义参数?

C# 迭代类属性并添加到列表某些类型

c# - 将字符串绑定(bind)到 TextBlock WPF - 我做错了什么?

c# - 以编程方式断开远程桌面 session