2013-02-03 4 views
-2

저는 C++에 익숙하지만 C#에서는 약간 익숙합니다.C# 컨테이너가 참조 또는 값으로 초기화 되었습니까?

개체를 컨테이너에 추가 할 때 개체가 참조 또는 값으로 전달 되었습니까?

나는이 작업을 수행하는 경우 즉, :

0 
1 

를하거나

1 
1 

될 것입니다 :

myClass m = new myClass(0);  //Assume the class just holds an int 
List<myClass> myList = new List<myClass>(1); 
myList.Add(m); 
myList[0] += 1; 
Console.WriteLine(m); 
Console.WriteLine(myList[0]); 

는 결과가 될 것인가?

전직 인 경우 어떻게하면 후자를 할 수 있습니까? 내 첫 번째 본능처럼 뭔가를하는 것이었다

myClass ref mref = m; 
Console.WriteLine(mref); 

그러나 이것은 유효한 구문으로 보이지 않습니다.

+3

"결과가 좋을까요?" 그것은 참조 btw에 의해 ... –

+1

당신이 말한 것 외에, 'myClass'는 참조 또는 값 유형입니다. – horgh

+0

여기에 참조 유형이 있다고 가정합니다. –

답변

6

값은 Add 메서드로 전달됩니다. 그러나 참조 유형을 전달하면 (클래스는 항상 참조 유형 임) 값 자체는 참조입니다. 따라서 값은 값 또는 참조에 의해 전달되는지 여부가 아니라 값 유형 또는 참조 유형 인 경우 질문이 그다지 중요하지 않습니다. 이 선언으로

class MyClass 
{ 
    public int Number { get; set; } 
} 

, 우리가 얻을 : myList[0]에 의해 반환되는 값이 목록에 저장된 값의 사본이 될 것이기 때문에이하는 struct와 함께 작동하지 않을 것이라고

MyClass m = new MyClass(); 
List<MyClass> myList = new List<MyClass>(); 
myList.Add(m); 

myList[0].Number += 1; 
Console.WriteLine(myList[0].Number); // Displays 1 
Console.WriteLine(m.Number); // Displays 1 

myList[0].Number += 1; 
Console.WriteLine(myList[0].Number); // Displays 2 
Console.WriteLine(m.Number); // Displays 2 

참고. += 1은이 임시 복사본의 Number 속성 만 증분하므로 몇 가지 프로세서 사이클을 소모하는 것 외에 다른 영향은 없습니다. 따라서 불변 구조체 만 생성하는 것이 좋습니다.


당신이 직접 객체를 표시 이제 ToString

class MyClass 
{ 
    public int Number { get; set; } 

    public override string ToString() 
    { 
     return Number.ToString(); 
    } 
} 

을 무시하려는 경우, 당신은

myList[0].Number += 1; 
Console.WriteLine(myList[0]); 
Console.WriteLine(m); 

당신은 심지어 운영자 과부하 myList[0] += 1 작품을 만들 수 쓸 수 있습니다 . MyClass에서

public static MyClass operator +(MyClass m, int i) 
{ 
    m.Number += i; 
    return m; 
} 

를 선언하지만 당신의 클래스는 수를 나타냅니다 만, 숫자는 일반적으로 불변 값 유형으로 인식되고 그 경우에 불변 struct이 선호하지 않는 한이 조금 이상한 것입니다.

public static MyStruct operator +(MyStruct m, int i) 
{ 
    return new MyStruct(m.Number + i); 
} 
+0

고마워,이게 내가 이해하려고했던거야. 나는 예를 들어 일한 것이 아니었던 것이 든, 내가했던 것만은 아니었던 당신의 대답이 내가 원하는 것을 더 분명히 표현해야한다. –

관련 문제