2010-05-25 1 views
2

값 유형과 같이 작동하는 '날짜'클래스를 작성하고 싶습니다. 예를 들어, 대신 안전하게 속성을 설정하는 복제 방법을 작성하는, Date 클래스는 값으로 전달합니다System.String이 값 형식과 같은 이유는 무엇입니까? (문자열과 같은 값 유형 클래스를 작성하는 방법)

public Date Birthday 
     { 
      get { return this.birthday; } 
      set 
      { 
       this.birthday = value.Clone(); 
      } //I want to write this.birthday = value; 
       //without changing external value when this.Birthday changes 
     } 

나는 선택 System.String 클래스이며, 값처럼 동작하기 때문에 이것이 가능 알고있다. 예를 들면 :

String s1 = "Hello"; 
String s2 = "Hi"; 
s1 = s2; 
s2="Hello"; 
Console.WriteLine(s1); //Prints 'Hi' 

는 우선이 클래스의 재정의 '='연산자의 작가를 생각했지만, 지금은 '='연산자를 재정의 할 수 없습니다 것을 알고있다. 그래서 그들은 String 클래스를 어떻게 작성합니까?

편집 : String과 같이 값으로 인스턴스를 전달하도록 Date 클래스를 만들고 싶습니다.

+1

String을 사용한 예제가 아무 것도 증명하지 못합니다 ... 결과는 모든 유형, 참조 또는 값에 대해 동일합니다. –

+0

@ 토마스 Levesque - 나는 이것이 틀렸다고 생각합니다. S1과 S2가 클래스이면, 출력은 "Hello"가됩니다. –

+0

@ 토마스 Levesque : 안돼! 나는 그것을 시험한다. 그것은 'Hi'를 인쇄합니다. 및 System.String 클래스 (나는 개체 브라우저에서 찾습니다) ... –

답변

4

public class Date{ ...code...}은 참조 유형 일 것입니다. 원하는 것은 아닙니다.

public struct Date { ...code...}은 가치 유형입니다 ... 아마도 당신이 원하는 것입니다.

문자열 클래스는 참조 형식이므로 ... 불변입니다. 문자열 개체의 동작이 시작시 혼동을 줄 수 있습니다.

주어진 경우s1은 "Fish"를 가리키는 참조입니다 ... "Fish"비트는 절대로 변경 될 수 없습니다 ... s1이 가리킬 수있는 점은 변경 될 수 있습니다. s1 = "Tuna";에 "물고기"라고 지정하면 더 이상 참조되지 않으며 GC됩니다.

예 : s1=s2 s1 이후 s2는 이제 동일한 문자열 "Hi"를 참조합니다 ... 단 하나의 "Hi"가 있습니다.

레벨 아래로 가지 않았 으면합니다.

+0

+1, 아마 가장 이해할 수있는 대답 –

+0

+1, 감사합니다. s1 = s2라고 말할 때 일어나는 일. 하지만 왜 다른 클래스가 같은 행동을하지 않았습니까? 예를 들어 d1과 d2가 '날짜'라면 d1 = d2는 s1 = s2와 같지 않습니다. –

+0

@Sorush, 다른 * 클래스 * (참조 형식) ** 할 ** ** 같은 동작이 있습니다. 그러나 * structs (value types)는 값의 의미를 가지므로 Date가 struct 인 경우 d1 = d2는 d2의 값을 d1에 복사하므로 Date 인스턴스가 2 개가됩니다. –

7

먼저 string 기반 예제에 질문이 나와 있지 않습니다.

DateTimeString의 경우는 immutable입니다. 인스턴스가 생성되면 어떤 방식 으로든 변경할 수 없습니다. 예를 들어 DateTime 인스턴스에 2 분을 추가 할 수는 없습니다. date.Minutes += 2 : date.AddMinutes(2)을 호출해야 완전히 새로운 인스턴스가 생성됩니다.

개체를 읽기 전용으로 만들려면 동일한 패턴을 따르십시오.

+0

define : 변경 불가 : '주체가 아니거나 형식이나 품질 또는 자연이 변경되거나 변형 될 수 없습니다. "그 당시의 시각은 모든 종족이 불변이라는 것이 었습니다 ... ' –

+0

System.DateTime 클래스를 의미하지는 않았고, Date라는 클래스를 작성했습니다. 인스턴스의 동작은 참조로 전달됩니다. 값으로 전달하려고합니다. –

+0

클래스 대신 구조체를 사용하면 – thecoop

4

그것은 당신이하지 뭔가 다른 현재 문자열을 변경, 새로운 문자열을 만드는

stringThing = "thing"; 

을 말할 때 사실 '='연산자의 아니에요.

관련 문제