-
C# 세트를 사용하고 가져오는 방법
C# 언어에는 할당 함수(get)와 값 함수(set)라는 두 가지 함수가 있으며, 이는 생성되는 중간 언어 코드에서 명확하게 볼 수 있습니다. C#은 도메인의 보호 수준을 공개로 설정하고 사용자가 클래스 외부에서 임의로 작업하도록 허용하는 것을 옹호하지 않습니다. 이는 너무 비OO이거나 더 구체적으로 말하면 너무 안전하지 않습니다! 클래스 외부에 표시되어야 하는 모든 필드의 경우 C#에서는 특성을 사용하여 이를 표현할 것을 권장합니다. 속성은 속성과 도메인 간의 근본적인 차이점인 저장 위치를 나타내지 않습니다. 다음은 일반적인 속성 디자인입니다.
시스템 사용;
수업MyClass
{
정수 정수;
공개 정수 정수
{
{반환 정수;}를 얻습니다.
{정수=값;} 설정
}
}
수업 테스트
{
공개 정적 무효 Main()
{
MyClass MyObject=new MyClass();
Console.Write(MyObject.Integer);
MyObject.Integer++;
Console.Write(MyObject.Integer);
}
}
예상대로 프로그램은 0 1을 출력합니다. 속성이 메소드를 래핑하여 도메인 구성원에 대한 친숙한 액세스 인터페이스를 프로그래머에게 제공한다는 것을 알 수 있습니다. 여기서 값은 C#의 키워드로, 속성 연산을 수행할 때 set의 암시적 매개변수, 즉 속성 쓰기 연산을 수행할 때의 rvalue입니다.
속성은 읽기 전용(가져오기), 쓰기 전용(설정), 읽기-쓰기(가져오기 및 설정)라는 세 가지 인터페이스 작업을 제공합니다. 도메인에서 이러한 세 가지 작업은 동일한 속성 이름으로 선언되어야 하며 분리될 수 없습니다. 다음 구현을 참조하세요.
수업MyClass
{
개인 문자열 이름;
공개 문자열 이름
{
{반환 이름}을 얻습니다.
}
공개 문자열 이름
{
{ 이름 = 값 } 설정
}
}
Name 속성의 구현을 분리하는 위의 방법은 잘못되었습니다! 이전 예와 같이 이들을 하나로 묶어야 합니다. 세 가지 속성(읽기 전용, 쓰기 전용, 읽기-쓰기)은 C#에서 동일한 속성 이름으로 간주됩니다. 다음 예를 참조하세요.
수업MyClass
{
보호된 정수 번호=0;
공개 정수 숫자
{
세트
{
숫자=값;
}
}
}
클래스 MyClassDerived: MyClass
{
새로운 공개 int Num
{
얻다
{
반환 번호;
}
}
}
수업 테스트
{
공개 정적 무효 Main()
{
MyClassDerived MyObject = 새로운 MyClassDerived();
//MyObject.Num= 1; //오류!
((MyClass)MyObject).Num = 1;
}
}
MyClassDerived의 Num-get{} 속성이 MyClass의 Num-set{} 속성 정의를 차단하는 것을 볼 수 있습니다.
물론 속성은 단순한 도메인 인터페이스 작업 그 이상입니다. 속성의 본질은 여전히 메서드입니다. 속성을 추출하거나 할당할 때 프로그램 논리를 기반으로 특정 검사, 경고 및 기타 추가 작업을 수행할 수 있습니다.
수업MyClass
{
개인 문자열 이름;
공개 문자열 이름
{
{반환 이름}을 얻습니다.
세트
{
if (값==null)
이름="마이크로소프트";
또 다른
이름=값;
}
}
}
속성의 메소드 특성상 속성에도 다양한 메소드 변형이 존재함은 물론이다. 속성에는 5개의 액세스 수정자가 있지만 속성의 액세스 수정자는 공개인 경우가 많습니다. 그렇지 않으면 클래스의 공개 인터페이스로서의 속성의 의미를 잃게 됩니다. 메소드의 여러 매개변수에 의해 발생하는 메소드 오버로딩과 같은 기능 속성이 부족한 것 외에도 virtual, sealing, override 및 abstract와 같은 수식자는 속성과 메소드에 대해 동일한 동작을 갖습니다. 그러나 속성은 본질적으로 두 가지 메소드로 구현되기 때문입니다. , 그것은 특정 행동에는 주의가 필요합니다. 다음 예를 살펴보십시오.
추상 클래스 A
{
int y;
공개 가상 정수 X
{
{0을 반환}을 얻으십시오;
}
공개 가상 정수 Y
{
{ 반환 }을 얻습니다;
설정 {y = 값 }
}
공개 추상 int Z { 설정 }
}
클래스 B: A
{
int z;
공개 재정의 int X
{
get { return base.X + 1 };
}
공개 재정의 int Y
{
설정 { 베이스.Y = 값 < 0: 값 }
}
공개 재정의 int Z
{
{z를 반환}을 얻으십시오;
설정 { z = 값 }
}
}
이 예에서는 상속 컨텍스트에서 속성의 몇 가지 일반적인 동작을 강조합니다. 여기서 클래스 A는 추상 속성 Z가 존재하므로 abstract로 선언되어야 합니다. 서브클래스 B는 base 키워드를 통해 상위 클래스 A의 속성을 참조합니다. 클래스 B는 Y-세트를 통해서만 클래스 A의 가상 속성을 덮어쓸 수 있습니다.
정적 메서드와 같은 정적 속성은 클래스의 정적 도메인 변수에만 액세스할 수 있습니다. 외부 메서드와 마찬가지로 외부 속성을 선언할 수도 있습니다.