NET中的ByVal和ByRef之间没有区别?

全能的

我熟悉ByVal和ByRef之间的区别。

但是,我很困惑为什么我可以使用ByVal将WinForms控件传递给子项以更改其某些属性。在很多文章中都使用“ ByVal”,对此我感到困惑。当子实际上确实更改了控件的属性时,我特别困惑。我想知道当使用“ ByVal”时怎么可能。以我的理解,如果子控件传递了ByVal,则该子控件应该无法对其进行操作。

为了进一步测试,我运行了以下测试代码:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim n As New List(Of String)

        n.Add("test0")

        pAlterList(n)

        Debug.Assert(n(0) = "test0")

    End Sub

    Private Sub pAlterList(ByVal u As List(Of String))

        u(0) = u(0) & "somechange"

    End Sub

End Class

奇怪的是pAlterList(即使它使用ByVal)也会更改List(Of String)。

调用该子项后,第一项是“ test0somechange”。以我的理解,只有将List(Of String)作为“ ByRef”传递时,才应该发生这种情况。

我在这里想念什么?

金西尼

您缺少的是,对于引用类型,ByRef仅影响向参数分配新对象是否影响原始变量,而不影响对参数引用的对象进行更改是否影响原始变量。

这样想吧。假设您有一个团队,而Joe是该团队的队长。您需要派人进入一个房间来执行任务。您说“让队长送他们进来”,所以您让Joe送他进入房间。在房间里,有人要求乔脱下他穿着的蓝色衬衫并穿上红色的衬衫,然后他们决定让乔可以坐下,然后实际上是让已经在房间里的安德鲁来执行任务。 。这是否意味着安德鲁现在是您球队的队长?当然不是。他们使用不同的人在房间内执行任务这一事实不会影响房间外的任何事物,因此Joe仍然是团队的队长。但是,当您看到乔走出房间时,他将穿着他们要求他穿的红色衬衫。在房间内对Joe自己所做的更改仍然会影响房间外的Joe。就是那样ByVal 适用于.NET中的引用类型参数。

为了使这种现实场景像ByRef在.NET中一样工作,必须接受这一点,如果其他人而不是Joe在房间内执行任务,他们将成为您团队的负责人。那是在现实世界中几乎从未发生过的事情,这就是为什么ByRefOO语言VB.NET中的奇怪之处,ByVal也是默认行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ByVal和ByRef VBA

VB.NET数组参数机制,byval和byref

有和没有'/'的路径之间的区别?

noverify和Xverify之间的区别:没有?

“ def”和没有“ def”之间的区别

.Net中的XmlDocumentFragment和XmlNode之间的区别

onLoad,onDomready,<head>中没有换行和<body>中没有换行之间有什么区别?

为什么>>&和&>>之间有区别,而>&和&>之间没有区别?

有爪子和没有爪子的输出之间的区别?

有和没有()的构造函数调用之间的区别

Swift 中 struct 和 class 之间的区别,SwiftUI 也没有更新

Ubuntu 15.04中运行级别3和5之间没有区别

SQL Server在阿拉伯语_CI_AS归类中的“ی”和“ي”之间没有区别

swift 3中UIView.init和没有init之间的区别

Django REST Framework中的PUT和PATCH之间没有区别

为什么我的浏览器在线程中的类和id之间没有区别?

!=和XPath之间没有什么区别

在C#中,公共,私有,受保护和没有访问修饰符之间有什么区别?

Microsoft .NET版本中的LTS和GA之间有什么区别?

.NET正则表达式中的“组”和“捕获”之间有什么区别?

.NET中的WebClient和HTTPWebRequest类之间有什么区别?

.NET中CultureInfo的CurrentCulture和CurrentUICulture属性之间有什么区别?

ASP.NET Core中的ConfigureServices()和Configure()之间有什么区别?

VB.NET中And和AndAlso之间有什么区别?

/ proc / sys / net / ipv [46] / conf /中的“ all”,“ default”和“ eth *”之间有什么区别?

Golang中net / http和net / http / fcgi之间的区别

ASP.NET Core同步和异步控制器操作之间没有太大区别

与 ; 之间的区别 并且没有;在 awk 命令的表达中

.NET Framework和CLR版本之间有什么区别