【问题标题】:Reason for use reference parameters instead of using global variable in C#在 C# 中使用引用参数而不是使用全局变量的原因
【发布时间】:2013-05-28 14:50:58
【问题描述】:

在 C#.NET 中谁能告诉我使用引用参数(例如 ref、out)而不是使用全局变量的原因?正如我所看到的,一切都可以通过只使用一个全局变量来轻松处理 我们必须在不同的函数中使用相同的变量值。所以我想不出我们只能选择使用引用参数而不是全局变量的情况。如果你能给我一个发生这种情况的场景,我会很高兴。提前致谢。

【问题讨论】:

  • 我不太确定这里的类比。这就像把苹果比作法拉利。您认为 ref/out 以何种方式与全局变量具有可比性?
  • 全局变量非常难以推理。也不是说 ref/out 适合所有情况,但与全局状态相比?
  • 使用 ref 变量(我很少这样做)比使用全局变量更受欢迎,因为尝试使用使用全局变量的程序来追踪错误非常困难。您不知道哪些过程可能会影响变量,而通过 ref 传递的变量更容易追踪,因为您知道可能影响其状态的过程。
  • 当您将局部变量或字段作为ref 参数传递给方法时,您仅授予该特定方法“权限”以读取和写入您的变量或字段.使用局部变量,您不能只是将变量公开。使用实例字段,您可以也将字段设为public(不是很好的做法),但仍需要您调用的方法引用该字段所在的实例。并且该方法需要知道并“硬编码”要修改哪个字段。使用static 字段创建public,不需要引用。
  • 全局变量的一大优势是速度。您可以简单地运行一些带有和不带有全局的基准来查看差异。不好的做法,但性能不错

标签: c# .net pass-by-reference out ref


【解决方案1】:

这只是糟糕的编程!

假设您完成了程序的工作,然后一个月后您想回来添加其他功能。但是您不小心在新类中使用了该全局变量。

现在它会更改您不想更改的其他类中的内容。 而且你有更多的错误,你不知道从哪里开始,因为你一个月没有接触代码。

关于ref 字的另一件事 - 它的目标之一是强制您在返回变量之前对其进行初始化。这样,编译器确保您不使用包含垃圾的变量,这会破坏代码。 当你使用全局变量时,你可以在那个未初始化的全局变量中使用,你会得到一个异常。

因此,如果您知道何时以及如何使用 refout - 请使用它们。

永远不要使用全局变量。糟糕的编程。

祝你好运!

【讨论】:

  • 非常感谢。这对我帮助很大。 :)
【解决方案2】:

全局变量和参数修饰符几乎没有共同之处。首先,在 C# 中最接近全局变量的是使用 public static 字段。

参数修饰符改变方法参数的处理方式。 out 参数就像一个额外的返回变量,它在方法中接收它的值并且编译器保证这一点。 ref 参数用于输入和输出。它可以在方法内部进行修改,但不是必须的。

全局变量与任何其他变量一样,只是它可以从任何地方访问并且只有一个实例。

当然,全局变量可用于实现类似的行为作为参数修饰符,但只是乍一看。与 out 参数不同,编译器不会保证您为其赋值。它更难使用、维护和记录,也许最重要的是它会在多线程环境中完全失败,除非您花费大量额外的工作来使访问变量线程安全。

【讨论】:

  • 非常感谢。这对我帮助很大:)
猜你喜欢
  • 2016-04-03
  • 2018-01-20
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多