2017-05-12 16 views
0
改变从不同的类/表格值

假设下面下面的例子:怎么能不为ByRef

当我打电话窗体2从Form1并通过_name Form1的价值。当我显示Form1的_name = Alex?我没有更改Form2中的pname,而构造函数不包含ByRef。

示例代码:

Public Form1 
    Public _name as String 

    Sub New 
     _name = "John" 
     Dim bla as New Form2(_name) 
     'now _name=Alex !! 
    End Sub 
End Class 

Public Form2 
    Property _name2 as String 

    Sub New(pname as String) 'no ByVal !! 
      _name2 = pname  'even if would be ByVal no pname changed ! 
      _name2 = "Alex" 
    End Sub 
End Class 

这是为什么发生?

+0

你的代码实质上忽略了传递的参数 – Plutonix

+0

你是什么意思? – Dino

+0

如果您希望Form2能够更改Form1的'_name'属性值,则需要对表单对象的引用,而不仅仅是属性的*值*。顺便说一句,真的很糟糕的名字。很多许多.NET的东西都有一个Name属性 - 但它们都是'Name'而不是'Name1358'或'_name127' – Plutonix

回答

0
  1. 使用共享变量_name:

    Class Form1 
    
    
        Public Shared _name As String 
    
        Public Sub New() 
         _name = "John" 
        End Sub 
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    
         ' Message "John" 
         MessageBox.Show(_name) 
    
         Dim bla As New Form2() 
         bla.Show() 
    
         ' Message "Alex" 
         MessageBox.Show(_name) 
    
        End Sub 
    
    End Class 
    
    
    Public Class Form2 
    
        Property _name2 As String 
    
        Sub New() 
    
         _name2 = "Alex" 
         Form1._name = _name2 
    
        End Sub 
    
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    
         ' message Alex 
         MessageBox.Show(_name2) 
    
         ' message Alex 
         MessageBox.Show(Form1._name) 
    
        End Sub 
    End Class 
    

或者

  • 当在构造方法的签名没有输入改性剂(方法),默认是byVal。如果你想改变窗口2变量的值必须在窗口2构造函数签名的通知按地址: 子新(按地址_name为字符串)
  • 0

    要改变一个参数的基础值,你必须使用所述ByRefmodifer

    指定的参数以这样的方式,被调用的过程可以改变调用代码参数下方的变量的值通过。

    这从ByVal略有不同:

    指定的参数以这样的方式被调用过程或属性不能改变一个变量的在调用代码参数的基础的值传递。

    通过默认情况下不指定modifierVB.NET编译器将使用ByVal

    这将是很好,这里要注意的是,虽然VB.NET默认使用ByVal如果没有指定,VBA并默认不和而使用ByRef。当心你应该将代码从一个端口移到另一个端口。

    而且要更改name2时相反,你应该改变pname如果你想改变的潜在价值。

    看一看下面的代码基于您的例子:

    Public Class Form1 
    
        Private _name As String 
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 
    
         _name = "John" 
    
         Dim bla As New Form2(_name) 
         bla.Show() 
    
         Debug.WriteLine(_name) 
    
        End Sub 
    
    End Class 
    
    Public Class Form2 
    
        Private Property _name2 As String 
    
        Public Sub New(ByRef pname As String) 
    
         InitializeComponent() 
    
         _name2 = pname 
         pname = "Alex" 
    
        End Sub 
    
    End Class 
    

    之前的值传递给Form2名为“约翰”:

    enter image description here

    在这一点上我将pname的值更改为“Alex”:

    enter image description here

    注意,虽然我已经改变了pname值设定为“亚历克斯”,_name2仍设置为“约翰”。

    通知,因为变化的_name更改为“亚历克斯”的价值如何pname提出:

    enter image description here

    我不知道它是什么你想在这里实现,但希望这个例子能让你更好地理解。另一种方法是按照其他答案中的解释使用共享变量。

    相关问题