C\#방법의 총 결 상세 설명
class Program
{
public int X;
static void Main(string[] args)
{
Program p = new Program();
p.X = 1;
Program q = (Program)p.MemberwiseClone();
Program z = p;
p.X = 2;
Console.WriteLine("p.X=" + p.X);// :p.X=2
Console.WriteLine("q.X=" + q.X);// :q.X=1
Console.WriteLine("z.X=" + z.X);// :z.X=2
Console.Read();
}
}
2:반 서열 화.네트워크 프로 그래 밍 을 할 때 한 대상 의 서열 을 바 이 너 리 로 바 꾼 다음 에 전송 합 니 다.수신 단 은 원래 의 대상 으로 반 직렬 화 되 고 반 직렬 화 는 System.Runtime.Serialization.Formatter Services 방법 Public static object GetUninitialized Object(Type type)또는 Public static object GetSafeUninitialized Object(Type type)를 사용 하여 메모 리 를 분배 합 니 다.이 두 가지 방법 내부 에 서 는 반 직렬 화 대상 의 구조 함수 가 호출 되 지 않 았 다.필드 의 초기 화 코드 는 컴 파일 러 에 의 해 해당 하 는 구조 함수 에 자동 으로 추 가 됩 니 다.비 정적 필드 의 초기 화 코드 는 인 스 턴 스 구조 함수 에 자동 으로 추 가 됩 니 다.정적 필드 의 초기 화 코드 는 정적 구조 함수 에 추 가 됩 니 다.코드 에 여러 필드 가 초기 화 되 고 여러 구조 함수 가 있다 면...초기 화 코드 는 모든 구조 함수 에 한 부 씩 있 습 니 다.이것 은 생 성 파일(예 를 들 어 DLL,EXE 파일)을 크게 만 들 수 있 습 니 다.이 점 을 증명 하 는 코드 는 다음 과 같다.
public class SomeType
{
public int x=1,y=2,z=3;
public SomeType() { }
public SomeType(int x, int y)
{
this.x = x;
this.y = y;
}
public SomeType(int x)
{
this.x = x;
}
}
// IL , SomeType(int x, int y)
.method public hidebysig specialname rtspecialname
instance void .ctor(int32 x,
int32 y) cil managed
{
// 45 (0x2d)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.1
IL_0002: stfld int32 MyTest.SomeType::x
IL_0007: ldarg.0
IL_0008: ldc.i4.2
IL_0009: stfld int32 MyTest.SomeType::y
IL_000e: ldarg.0
IL_000f: ldc.i4.3
IL_0010: stfld int32 MyTest.SomeType::z
IL_0015: ldarg.0
IL_0016: call instance void [mscorlib]System.Object::.ctor()
IL_001b: nop
IL_001c: nop
IL_001d: ldarg.0
IL_001e: ldarg.1
IL_001f: stfld int32 MyTest.SomeType::x
IL_0024: ldarg.0
IL_0025: ldarg.2
IL_0026: stfld int32 MyTest.SomeType::y
IL_002b: nop
IL_002c: ret
} // end of method SomeType::.ctor
먼저 초기 화 코드 를 실 행 했 고 다른 구조 함수 들 은 모두 초기 화 코드 를 포함 한 다음 에 구조 함수 에서 의 할당 코드 를 실 행 했 습 니 다.이 코드 의 팽창 문 제 를 해결 하려 면 방법 이 간단 합 니 다.초기 화 코드 를 무 참 구조 함수 에 쓰 고 다른 구조 함수 가 호출 되도록 합 니 다.2:실례 구조 기와 구조 값 유형의 작업 방식 은 인용 유형 과 현저히 다르다.값 유형 은 사실 구조 함 수 를 정의 할 필요 가 없다.지구 인 들 은 값 유형의 실례 화 를 막 을 수 없다.컴 파 일 러 는 기본 적 인 무 참 구조 함 수 를 생산 하지 않 는 다.만약 에 성명 무 참 구조 함 수 를 표시 하면 컴 파일 은 통과 할 수 없다."구 조 는 명시 적 인 무 매개 변수 구조 함 수 를 포함 할 수 없습니다."값 형식 이 스 택 에 존재 하기 때문에 쌓 인 데 이 터 를 참조 할 필요 가 없 기 때문에 우 리 는 정의 할 때 직접 값 을 부여 할 수 있 습 니 다.(int i=0;string s=”a”;Point p;p.X=2;)그 는 new 가 필요 하지 않 습 니 다.new 는 당연히 가능 합 니 다.구조 함 수 를 호출 하면 모든 필드 를 해당 유형의 기본 값 으로 초기 화 합 니 다.인 스 턴 스 는 다음 과 같 습 니 다.
public struct Point
{
public int x, y;
//public Point() { }// :
//public int z = 4;// :
//public Point(int x) // , “Point.y” , y ,
// this=new Point(); 0 null
//{
// this.x = x;
//}
public void Test()
{
Point p;
p.x = 1;
p.y = 2;
Console.WriteLine(p.x+","+p.y);// 1,2
}
}
구조의 특징: 1:정의 무 참 구조 함 수 를 표시 할 수 없습니다. 2:필드 를 정의 할 때 초기 화 할 수 없습니다. 3:구조 함수 가 있다 고 밝 혔 을 때 모든 필드 를 초기 화 해 야 합 니 다.3:유형 구조 기 인 스 턴 스 구조 기 는 정적 구조 함수 입 니 다.그의 역할 은 유형의 초기 화 상 태 를 설정 하 는 것 입 니 다.정적 구조 함 수 는 하나만 있 을 수 있 고 인삼 이 없 으 며 방문 수정자 수식 이 없 으 며 기본 값 은 private 이 고 컴 파일 러 에서 호출 되 어 실 행 됩 니 다.인 스 턴 스 는 다음 과 같다.
public class SomeType
{
public static int x = 520;
static SomeType()
{
x = 112;
}
}
// .NET reflector ,
public class SomeType
{
public static int x ;
static SomeType()
{
x = 520;
x = 0x70;
}
public SomeType() { }
}
정적 필드 를 정의 하고 초기 화 하면 컴 파일 러 는 하나의 유형 구조 기(정적 구조 함수)를 자동 으로 생 성하 고 정적 필드 의 초기 화 코드 를 유형 구조 기 앞 에 꽂 는 다.위의 코드 를 통 해 알 수 있 듯 이 정의 할 때 초기 화 와 유형 구조 기 에서 초기 화 하 는 데 하나만 있 으 면 된다.그리고 112 의 16 진법 은 0x 70 이다.그래서 코드 에서 16 진 을 보면 크게 놀 라 지 않 아 도 됩 니 다.성능 문제 와 전혀 관련 이 없습니다.정적 필드 를 정의 하지만 초기 화 되 지 않 으 면 컴 파일 러 는 유형 구조 기 를 만 들 지 않 습 니 다.그러나 정적 필드 는 초기 화 됩 니 다.정적 필드 든 비 정적 필드 든 컴 파일 러 에 의 해 자동 으로 초기 화 됩 니 다.int 형식의 초기 화 는 0 입 니 다.bool:False;string:null,이것 이 바로 실 체 를 예화 할 때 일부 필드 는 초기 화 되 지 않 았 지만 잘못 보고 하지 않 는 이유 입 니 다.그리고 초기 화 되 지 않 은 문자열 의 값 이 null 이라는 것 을 알 고 있 습 니 다.즉,컴 파일 러 는 초기 화 되 지 않 은 필드 를 초기 화 하 는 데 도움 을 줄 것 입 니 다.그러나 방법 에서 정의 하 는 부분 변 수 는 스스로 초기 화 되 어야 합 니 다.초기 화 되 지 않 았 다 면,"할당 되 지 않 은 부분 변수 X 를 사 용 했 습 니 다"라 는 오 류 를 보고 합 니 다.4:연산 자 리 셋 방법 이 연산 자 리 셋 을 실현 하려 면 다음 과 같은 두 가지 만 확보 해 야 합 니 다.다른 것 은 모두 뜬구름 입 니 다.1:연산 자 리 셋 방법 은 Public 와 static 방법 이 어야 합 니 다.2:연산 자 리 셋 방법 은 적어도 하나의 매개 변수 유형 이 현재 정 의 된 이 방법의 유형 과 같 아야 합 니 다.이 조건 이 필요 한 이 유 는 컴 파일 러 가 합 리 적 인 시간 안에 연결 할 조작 방법 을 찾 도록 하기 위해 서 입 니 다.인 스 턴 스 는 다음 과 같 습 니 다
public class Complex
{
public int data;
public Complex(int data)
{
this.data = data;
}
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.data+c2.data);
}
public void Test()
{
Complex c1 = new Complex(1);
Complex c2 = new Complex(2);
Complex c3 = c1 + c2;
Console.WriteLine(c3.data);// 3
}
}
5.연산 자 를 바 꾸 는 방법 은 연산 자 를 바 꾸 는 방법 을 실현 해 야 합 니 다.조건 과 연산 자 를 다시 불 러 오 는 방법 은 조건 이 같 습 니 다.인 스 턴 스 는 다음 과 같 습 니 다.
public class Rational
{
public Rational(int data)
{
this.data = data;
}
public Rational(char data)
{
this.data = (int)data;
}
// :int->Rational
public static implicit operator Rational(int data)
{
return new Rational(data);
}
// :char->Rational
public static implicit operator Rational(char data)
{
return new Rational(data);
}
// Rational->int
public static explicit operator int(Rational val)
{
return val.data;
}
// Rational->char
public static explicit operator char(Rational val)
{
return Convert.ToChar(val.data);
}
public void Test()
{
Rational r1 = 1;// int Rational
Rational r2 = '2';// char Rational
int i = (int)r1;// Rational int
char c = (char)r2;// Rational char
Console.WriteLine("i=" + i);// :i=1
Console.WriteLine("c=" + c);// :c=2
}
int data;
}
암시 적 이 고 디 스 플레이 유형 전환 의 실현 원 리 는 이렇게 간단 합 니 다.C++에서 암시 적 형식 전환 은 코드 를 쓸 필요 가 없습니다.해당 하 는 Public 구조 함수 만 있 으 면 됩 니 다.예 를 들 어 int 가 Rational 로 전환 되면 구조 함수 Public Rational(int data)만 있 으 면 됩 니 다.예 를 들 어 Rational r=1;컴 파일 러 는 int 유형 을 Rational 로 바 꾸 는 방법 을 찾 으 려 고 최선 을 다 할 것 입 니 다.이 구조 함 수 를 발견 하면 그 는 말 하지 않 고 전환 해 주 었 습 니 다.그 렇 기 때문에 가끔 은 아버 지 를 괴 롭 히 기도 합 니 다.당신 의 int 유형 은 이유 없 이 Rational 이 되 었 습 니 다.그런데 당신 은 어떻게 된 일 인지 전혀 모 릅 니 다.가끔 은 이 문 제 를 해결 하기 위해 서 입 니 다.int 를 봉인 하기 위해 서 는 클래스(Uint)를 스스로 정의 해 야 합 니 다.그리고 구조 함 수 를 Rational(Uint data)로 바 꿔 야 합 니 다.C\#는 이 문제 가 없습니다.물론 암시 적 형식 전환 을 실현 하려 면 코드 를 직접 쓰 세 요.6:확장 방법 이 확장 방법 을 실현 하 는 조건:1:확장 방법 을 정의 하 는 클래스 는 반드시 비 범 형 정적 클래스 2 가 되 어야 합 니 다.이 클래스 는 반드시 자신의 역할 영역 이 있어 야 합 니 다.즉,내부 클래스 가 될 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.