- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
也许这对我来说有点天真,但我似乎真的找不到/想不出“通过引用传递”的合适用例。更改不可变字符串(正如其他一些 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.
通过引用传递不仅与
ref
或
out
参数一起使用。更重要的是,所有引用类型都通过引用传递(因此它们的名称),尽管这是透明发生的。
以下是传递引用的三个
频繁
用例:
在传递大型结构
时防止复制它们。假设您有一个
某些 byte[]
数组,表示一个二进制大对象 (BLOB),大小可能为几兆字节
的值struct
类型,包含很多字段。该类型的值可能会占用大量内存。现在您想将此值传递给某个方法。您真的要按值传递它,即创建一个临时副本吗?
您可以通过 ref
erence 传递它们来避免不必要的大型结构复制。
(幸运的是,
byte[]
这样的数组是引用类型,所以数组的内容已经通过引用传递了。)
通常建议(例如在 Microsoft's Framework Design Guidelines 中)如果具有值类型语义的类型超过特定大小(32 字节),则应将其实现为引用类型,因此这种用例不应非常频繁。
可变性。如果你希望一个方法能够改变传递给它的 struct
值,并且你希望调用者观察他版本的那个对象的变化,那么你需要通过引用传递(引用
)。如果值按值传递给方法,它会收到一个副本;改变副本将使原始对象保持不变。
上面链接的Framework Design Guideline文章中也提到了这一点。
请注意针对可变值类型的广泛推荐(参见例如 "Why are mutable structs evil?" )。您应该很少需要将 ref
或 out
参数与值类型一起使用。
COM 互操作 如 this answer 中所述通常需要您声明 ref
和 out
参数。
关于c# - 通过引用传递只是一种遗产吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32432909/
我的应用程序上有一个登录系统,其中有一组预定义的用户,如下所示: User user = new User("tommy", "tommy", false); User user2 = new Use
我厌倦了以下问题。请帮忙?我有一个下面的界面 /** * Type of Timestamp. For ex: Date, long, Calendar etc * */ public interf
这里没有问题,只需要解释它是如何工作的。 我正在为我的 C# 类(class)做家庭作业,我设法按照教授提供的代码示例自行完成。问题是我不明白它是如何工作的。以下是让我感到困惑的事情: 首先,为什么我
class C1 { void A(); void B(); } void C1::A(){ return B(); } class C2 : public C1 { void
我有一组代码,它模拟了一个基本的图书馆编目系统。有一个名为 items 的基类,其中定义了通用 id、title 和 year 变量以及其他 3 个派生类(DVD、Book 和 CD)。 基础[元素]
似乎无法弄清楚这一点。我一直收到各种错误,所以我只用我从 Jackson 那里收到的当前错误来写这篇文章。 public class ResponseDetail { private Resp
我希望继承一些 D 类遗产并实现接口(interface) A、B 和 C 的所有属性和方法。请帮我举一个 Delphi 中的示例。 我用德尔福 Xe7 一个类如何实现多个接口(interface)?
看看我的问题: 我有一个如下所示的类: var els=[]; var base = function(){ this.config = {} } var X1 = function(){ }
我正在学习如何编写好的 Makefile。我必须编写几个 gcc 编译命令,这些命令会生成使用不同选项编译的不同文件。我读过有关 .SECONDEXPANSION 的内容,但它不太令我满意,因为它看起
我有很多不同的课程。但是,它们都可以保证具有某些方法,例如render()和Activate()。 我的目标是能够将它们全部存储在一个大列表中。目前,我有一个名为Container的大类,并且我做了类
让我们有一个 C++ 对象 A。A 中有两个变量(VAR1 和 VAR2)可供其子对象访问。对象 B 扩展了 A 并有一个私有(private)变量 VAR3,它还可以访问 VAR1 和 VAR2。
例如,我创建了一个鸟类类,我正在尝试创建一个 boolean 变量,它开始时不快乐,当它飞行时变为快乐,当它尝试游泳时又变回不快乐。 这是我的鸟类 public class Bird extends
我也有一个关于如何在两个类之间创建复制构造函数的问题。 > person(const person& a) : name(a.getName()), address(a.getAddress()),
好吧,这个例子对于我试图理解的概念来说非常简单明了。我将向您展示代码: class Base { protected: string name; public: virtual str
首先,我不太确定如何为我的问题命名。 我有一个关于继承的问题。 假设我创建了一个名为 Class_A 的类: class Class_A { public: int a;
我一直在谷歌上搜索和阅读相关内容,但还没有找到答案,也许有人可以帮我解决这个问题。 我希望我的 UserPile 类能够从我的 CardPile 类访问数据成员和类成员函数。我不断收到标题中提到的错误
假设我在一个类中有一些数据结构如下 class DataStructure { DataStructure(); ~DataStructure(); void reset();
我是一名优秀的程序员,十分优秀!