c# 매크로 기능은 있지만, 없는거나 마찬가지이다.
C# / 2020. 6. 6. 22:58
C#에 매크로 기능이 없어, 디버깅코드를 모두 사용후 주석처리하고 있어, 불편하다. C#에 inline 기능이 있나? =>없다 C#에 매크로 기능이 있나? =>있긴한데, 별로다. static void Example() { Funcadd = (x,y) => x + y; var result = add(4,6); // 10 } C#에 포인터가 있나? =>없다. 인덱스를 활용해라. ref 키워드가 있다.함수로 큰 데이터를 넘길떄 사용해라. C#에 함수에 큰 데이터를 전달할떄 사용할 수 있는 포인터가 있나? =>ref 키워드 있음. Call by reference ref는 호출하는 함수에도 붙여주어야 한다. 큰 데이터를 그냥 전달하면, 복사가 되어, 느려진다. ref키워드를 붙여서, 빠르게 사용하자. 예) void xx(ref byte[] buf,int len) { ... } void main_func() { byte[] buf=new byte[32]; xx(ref buf,32); ... } 포인터 기능이 있지만, 컴파일 옵션을 설정해주어야해서, 불편. 포인터 기능을 사용하지 않으려면, 처음부터 클래스나 데이터를 배열을 만들고, 배열의 인덱스를 포인터처럼 사용하면 된다. warning CS0169: 'xx' 필드가 사용되지 않았습니다. =>주석처리했더니, 다른데서 사용하고 있네... 오류 CS1656 '메서드 그룹'인 'xx'에는 할당할 수 없습니다. =>이름이 xx인 것이 이미 존재하는 경우. 예) 버튼 이름이 xx인경우, xx함수 작성시 발생 byte 배열에 대한 strchr private int strchr(byte[] a,byte find) { int i,n=a.Length; for(i=0;i > (32 - nbit); ret = v >> Low_bit; return ret & mask; } void SetBits32HL(ref UInt32 v, int High_bit, int Low_bit, UInt32 new_value) { int nbit = High_bit - Low_bit + 1; UInt32 ret, mask; mask = 0xFFFFFFFF >> (32 - nbit); new_value = new_value & mask; v= v & ~(mask<< Low_bit); v = v | (new_value<< Low_bit); #if DEBUG int err = 0; if(GetBits32HL(v, High_bit, Low_bit)== new_value) { err = 0; } else { err = 1; MessageBox_Show("ERR: SetBits32HL"); } #endif } UInt32 GetByteBuf_WORD_LSB_HL(ref byte[] buf,int n, int nth_WORD,int High_bit, int Low_bit) { UInt32 a; int i; i = nth_WORD * 2; a = (((UInt32)(buf[i+1]))<<8)|buf[i];//LSB return GetBits32HL(a, High_bit, Low_bit); } UInt32 GetByteBuf_DWORD_LSB_HL(ref byte[] buf, int n, int nth_WORD, int High_bit, int Low_bit) { UInt32 a; int i; i = nth_WORD * 2; //확인필요-=-=- a = (((UInt32)(buf[i + 24])) << 8) | (((UInt32)(buf[i + 2])) << 16) | (((UInt32)(buf[i + 1])) << 8) | buf[i];//LSB return GetBits32HL(a, High_bit, Low_bit); } void SetByteBuf_WORD_LSB_HL(ref byte[] buf, int n, int nth_WORD, int High_bit, int Low_bit, UInt32 new_value) { UInt32 a; int i; i = nth_WORD * 2; a = (((UInt32)(buf[i + 1])) << 8) | buf[i];//LSB SetBits32HL(ref a, High_bit, Low_bit, new_value); buf[i + 1] = (byte)(a >> 8); buf[i] = (byte)a; #if DEBUG int err = 0; if (GetByteBuf_WORD_LSB_HL(ref buf, n, nth_WORD,High_bit, Low_bit) == new_value) { err = 0; } else { err = 1; MessageBox_Show("ERR: SetBits32HL"); } #endif } void SetByteBuf_DWORD_LSB_HL(ref byte[] buf, int n, int nth_WORD, int High_bit, int Low_bit, UInt32 new_value) { UInt32 a; int i; i = nth_WORD * 2; //확인필요-=-=- a = (((UInt32)(buf[i + 3])) << 24) | (((UInt32)(buf[i + 2])) << 16) | (((UInt32)(buf[i + 1])) << 8) | buf[i];//LSB SetBits32HL(ref a, High_bit, Low_bit, new_value); buf[i + 3] = (byte)(a >> 24); buf[i + 2] = (byte)(a >> 16); buf[i + 1] = (byte)(a >> 8); buf[i] = (byte)a; #if DEBUG int err = 0; if (GetByteBuf_WORD_LSB_HL(ref buf, n, nth_WORD, High_bit, Low_bit) == new_value) { err = 0; } else { err = 1; MessageBox_Show("ERR: SetBits32HL"); } #endif } error CS0120: 비정적 필드, 메서드 또는 속성 'xx()'에 개체 참조가 필요합니다. => static 추가 C#을 사용해보니, 느리다. 자바와 거의 유사하기떄문에, 뭘하든간에, 하나하나 동작이 다 느리다. 비트필드를 지원하지 않아서, struct같은 구조체를 많이 사용하는 경우에는 C#으로 작업하는것이 힘들 수 있다. class PortDataReceived { ... public static void Main() { ... } }; 구조체 public struct Coords { public Coords(double x, double y) { X = x; Y = y; } public double X { get; } public double Y { get; } public override string ToString() => $"({X}, {Y})"; } 비트필드 : 지원하지 않음,
'C#' 카테고리의 다른 글
C# - 다른 폼(Form)의 버튼 동작 (0) | 2020.06.20 |
---|---|
c# - 이벤트 추가방법 (0) | 2020.06.13 |
c# - 키입력 처리 (0) | 2020.06.06 |
C# - enum 사용법 (0) | 2020.06.06 |
error CS1955: 호출할 수 없는 멤버인 'xx'은(는) 메서드처럼 사용할 수 없습니다. (0) | 2020.05.30 |