gpt4 book ai didi

c# - 通过引用传递只是一种遗产吗?

转载 作者:太空狗 更新时间:2023-10-29 20:02:41 28 4
gpt4 key购买 nike

也许这对我来说有点天真,但我似乎真的找不到/想不出“通过引用传递”的合适用例。更改不可变字符串(正如其他一些 Q/A 所提到的)通常是可以避免的,返回多个变量通常通过返回元组、列表、数组等更好地处理。

example on MSDN在我看来很糟糕;我会简单地在 Square 方法中返回一个值,而不是将其声明为 void

在我看来,它有点像 C# 的遗留部分,而不是它的组成部分。比我聪明的人可以尝试解释为什么它仍然存在和/或一些实际可行的真实用例(即几乎在每种情况下都可以避免更改不可变字符串)。

最佳答案

P.S.: I followed up on some of the comments by @KallDrexx and @newacct. I see now that they were right and I was wrong: my answer was somewhat misleading. The excellent article "Java is pass-by-value, dammit!" by Scott Stanchfield (Java-specific, but still mostly relevant to C#) finally convinced me so.

I'll leave the misleading bits of my answer striked through for now, but might later remove them.


通过引用传递不仅与 refout 参数一起使用。更重要的是,所有引用类型都通过引用传递(因此它们的名称),尽管这是透明发生的。

以下是传递引用的三个 频繁 用例:

  • 在传递大型结构时防止复制它们。假设您有一个 byte[] 数组,表示一个二进制大对象 (BLOB),大小可能为几兆字节 某些 的值struct 类型,包含很多字段。该类型的值可能会占用大量内存。现在您想将此值传递给某个方法。您真的要按值传递它,即创建一个临时副本吗?

    您可以通过 reference 传递它们来避免不必要的大型结构复制。

    (幸运的是, byte[] 这样的数组是引用类型,所以数组的内容已经通过引用传递了。)

    通常建议(例如在 Microsoft's Framework Design Guidelines 中)如果具有值类型语义的类型超过特定大小(32 字节),则应将其实现为引用类型,因此这种用例不应非常频繁。

  • 可变性。如果你希望一个方法能够改变传递给它的 struct 值,并且你希望调用者观察他版本的那个对象的变化,那么你需要通过引用传递(引用)。如果值按值传递给方法,它会收到一个副本;改变副本将使原始对象保持不变。

    上面链接的Framework Design Guideline文章中也提到了这一点。

    请注意针对可变值类型的广泛推荐(参见例如 "Why are mutable structs evil?" )。您应该很少需要将 refout 参数与值类型一起使用。

  • COM 互操作this answer 中所述通常需要您声明 refout 参数。

关于c# - 通过引用传递只是一种遗产吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32432909/

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