C\#방법의 총 결 상세 설명

9455 단어 C#방법.
C\#방법 1:인 스 턴 스 구조 와 클래스 2:인 스 턴 스 구조 와 구조 3:유형 구조 기 4:조작 자 재 업로드 방법 5:조작 자 변환 방법 6:확장 방법 7:일부 방법 1:인 스 턴 스 구조 기와 클래스 구조 기 는 유형의 인 스 턴 스 를 좋 은 상태 로 초기 화 할 수 있 는 특수 한 방법 입 니 다.참조 형식의 인 스 턴 스 를 만 들 때 인 스 턴 스 의 데이터 필드 에 메모 리 를 할당 합 니 다.그 다음 에 대상 의 추가 필드(유형 대상 포인터 와 동기 색인)를 초기 화하 고 마지막 으로 구조 함 수 를 호출 하여 대상 의 초기 상 태 를 설정 합 니 다.구조 함 수 는 계승 할 수 없 기 때문에 virtual,new,override,sealed 와 abstract 에 의 해 수식 되 어 서 는 안 됩 니 다.정의 되 지 않 은 구조 함 수 를 표시 하지 않 으 면 컴 파일 러 는 참여 하지 않 은 Public 구조 함 수 를 정의 합 니 다.그러나 추상 적 인 클래스 라면 컴 파일 러 는 참여 하지 않 은 proctected 구조 함 수 를 정의 하여 하나의 인 스 턴 스 를 만 들 때 반드시 구조 함 수 를 호출 해 야 하 는 것 은 아 닙 니 다.1:Object 의 MemberwiseClone()방법 을 사용 합 니 다.현재 System.Object 의 얕 은 테이블 복사 본 을 만 드 는 것 이 그의 역할 입 니 다.내부 작업 메커니즘 은 메모 리 를 분배 하고 대상 의 추가 필드(유형 대상 포인터 와 동기 인덱스)를 초기 화한 다음 원본 대상 의 바이트 데 이 터 를 새 대상 으로 복사 합 니 다.아래 코드 에서 알 수 있 듯 이 MemberwiseClone()은 단순 한 대상 인용 이 아니 라 대상 복 제 를 실현 했다.

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 가 되 어야 합 니 다.이 클래스 는 반드시 자신의 역할 영역 이 있어 야 합 니 다.즉,내부 클래스 가 될 수 없습니다.

좋은 웹페이지 즐겨찾기