2017-05-18 1 views
0

아래의 VB.NET 코드에서 저는 명단에 3 명을 추가하고 싶습니다. 저는 같은 person-object를 반복해서 사용하고 다음 Add-Call 전에 그 이름을 변경하기 만하면된다고 생각했습니다. 나는 각각의 호출이 객체를 복사하고 그 사본을리스트에 추가하기를 희망했다 ... 그러나 나는 세 개의 "Kim"의리스트로 끝난다. 목록 요소가 동일한 개체를 참조하는 것 같습니다..NET에서 호출 할 때 개체가 "ByVal"(복사본)으로 전달되도록 할 수 있습니까?

Class Person 
    Public Name As String 
End Class 

Sub Foo() 
    Dim Persons as New List(Of Person) 
    Dim aPerson As New Person 

    aPerson.Name = "John" 
    Persons.Add(aPerson) 
    aPerson.Name = "Emma" 
    Persons.Add(aPerson) 
    aPerson.Name = "Kim" 
    Persons.Add(aPerson) 
End Sub 

각 추가 호출에 aPerson이 복사 될 수 있습니까? 아니면 John, Emma 및 Kim을 위해 별도의 객체를 만들어야합니까?

+1

'을 또는 내가'예는 –

+1

에있는 당신이 다른 개체를 제공해야합니다 존, 엠마와 김 별도의 객체를 생성해야합니까 :

그렇지 않으면 당신은 것?. –

+0

모든 참조 유형, 즉 클래스는 그런 식으로 행동합니다. 'Person'이 구조체라면리스트에 추가하면 복사본이 생기기 때문에 코드가 작동했을 것입니다. 클래스를 통해 구조체를 사용하는 것이 좋은 생각이지만 실제로는 그렇지 않을 수도 있습니다. 클래스는 여러 가지 이유로 그러한 방식으로 작동하며 클래스가 적절한 구조를 사용하면 여러 가지 문제가 발생할 수 있습니다. 구조체는 용도가 있지만 일반적으로 작고 불변 인 유형에만 해당합니다. 수업은 대다수의 시간에 사용되어야하며 사용되어야합니다. 이상하게 보일 수도 있지만 익숙해 질 것입니다. – jmcilhinney

답변

1

당신이하고있는 일은 그런 방식으로 수업을 사용하지 않는 것이 좋지 않습니다.

이름이 목록과 같은 출처에서 나온 경우 For Each 루프를 사용할 수 있습니다. 데이터가 예를 들어, 파일, SQL 요청 또는 JSON에서 오는 경우

Dim MyNames As New List(Of String) 
MyNames.Add("John") 
MyNames.Add("Emma") 
MyNames.Add("Kim") 
For Each person_name As String In MyNames 
    Dim aPerson As New Person 
    aPerson.Name = person_name 
    Persons.Add(aPerson) 
Next 

이 방법은 매우 실용적이 될 수 있습니다.

Dim Persons as New List(Of Person) 
Dim aPerson As New Person 
Dim bPerson As New Person 
Dim cPerson As New Person 
aPerson.Name = "John" 
Persons.Add(aPerson) 
bPerson.Name = "Emma" 
Persons.Add(bPerson) 
cPerson.Name = "Kim" 
Persons.Add(cPerson) 
+0

'For'는'For Each '여야합니다. 편집을 제출 하겠지만 글자 수 한도 미만이고 나머지 답변은 훌륭합니다. –

+0

@AFriend 하하 감사합니다. 게시를 추가 할 때 완전히 잊어 버렸습니다. – Mederic

관련 문제