C#

c# 매크로 기능은 있지만, 없는거나 마찬가지이다.

안녕1999 2020. 6. 6. 22:58
C#에 매크로 기능이 없어, 디버깅코드를 모두 사용후 주석처리하고 있어, 불편하다.

C#에 inline 기능이 있나?
=>없다

C#에 매크로 기능이 있나?
=>있긴한데, 별로다.
static void Example() {
  Func add = (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})";
}

비트필드 : 지원하지 않음,