gpt4 book ai didi

C# 隐式更新传递给没有返回类型且没有 out 或 ref 用法的方法的参数

转载 作者:太空狗 更新时间:2023-10-29 22:22:36 26 4
gpt4 key购买 nike

这对我来说太古怪了,显然开发人员应该使用关键字 out 但我不敢相信这竟然有效:

public BusinessResponse<MyResultType> MyMethod(){

BusinessResponse<MyResultType> res = new BusinessResponse<MyResultType>();
ProcessResult(res);

return res; //this has the values set by ProcessResult!!! How?
}

private void ProcessResult(BusinessResponse<MyResultType> result)
{
result.State = BusinessResponseState.Success;
//set some other stuff in the result argument
}

我的同事说这叫做“深度引用”,我不敢相信这在 C# 中有效。我会重构使用 out又名 private void ProcessResult(out BusinessResponse<MyResultType> result)但我仍然想知道为什么这段代码有效。

更新

所以看起来我是不正确的,这段代码很好。似乎情绪是,作为 C# 开发人员,我应该立即知道,因为传递给 processResult 的参数是堆上的引用类型,按值传递,引用本身的副本被创建并且复制的引用仍然指向同一个对象。

最佳答案

当然是你的情况BusinessResponse<T>class ,也称为 "reference type" .引用类型(对象)总是在 C# 中“通过引用”传递(类似于良好的 C 语言中的指针)1

这意味着无论您如何传递引用,它仍然引用内存中的一个实例。这意味着无论您如何引用它,您总是在修改同一个副本。

1 - 这不完全正确。实际发生的是引用(变量)按值传递。当函数接收到这个引用时(再一次,想想指向托管堆上某个对象的指针),它指的是同一个对象。但是,引用本身在传入时被复制了。

我们使用的另一种变量是“值类型”。这些是 struct s,以及所有原语,如 char , bool , int , 等等。毫无疑问,它们总是按值传递,这意味着每次将值类型分配给新变量(包括将其传递给函数)时都会创建一个副本。要通过函数调用修改这些,您必须使用 ref out 关键字。

那你什么时候用ref与引用类型?

当您想要更改变量引用的实例时:

public class Foo {
public string Name { get; private set; }
public Foo(string name) {
Name = name;
}
}

public class Program {

public static void Example(ref Foo f) {
// This will print "original"
Console.WriteLine("Example() was given {0}", f.Name);

// We assign a new instance to the reference which was
// passed by reference
f = new Foo("replacement");
}

public static void Main() {
Foo f; // This variable is a "reference" to a Foo

f = new Foo("original"); // We assign a new instance to that variable

Example(ref f);

// This will print "replacement"
Console.WriteLine("After calling Example(), f is {0}", f.Name);
}

}

关于C# 隐式更新传递给没有返回类型且没有 out 或 ref 用法的方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21297071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com