초기화하지 바이트입니다 어레이로의 어떤 가치 외에 기본값입니다 nulll?

39 m busy i&, C++, C # 로 다시 실시된 늙은 프로젝트.

내 과제는 재작성할 프로그램이 본래의 역할을 있도록 닫으십시오 수 있다.

이 프로그램을 작성하는 과정에서 a bunch of 파일 처리 이전 개발자 누가 작성했습니까 구조 파일 형식으로 해당하는 많은 필드를 포함하는 설정할 수 있다, 그래서 내가 쓴 모든 작업은 이미 끝났다.

이 필드는 모두 바이트입니다 배열입니다. C++ 코드를 사용하여 그 어떤 '은' 모든 공백 문자 ('0x20') 이 전체 구조를 멤세트 설정할 수 있습니다. 한 줄로 코드입니다. 간편해집니다.

이 유틸리티를 매우 중요하다는 결국 이 형식으로 파일을 해당 파일을 마이그레이션된 노리고 있다. # 39 로 변경, 해야 할 것은 어떤 I& 숨기지 않았다, 하지만 난 이 구조체입니다 클래스 C # 의 모든 방법을 쉽게 찾을 수 없는 이러한 각 바이트입니다 어레이에는 초기화하지 공백 문자.

39, ve I& 어떻게 해야 할 것은 이 클래스에서 구성자를 있으면 됐지.

//Initialize all of the variables to spaces.
int index = 0;
foreach (byte b in UserCode)
{
    UserCode[index] = 0x20;
    index++;
}

이 작품은 I& # 39 m, 좋아요, 하지만 이렇게 간단한 방법을 있어야 합니다. [6] 때 '로 설정되었습니다 어레이입니다 우저고데 = new 바이트입니다 구성자를 자동으로 초기화되었습니다 기본 값이 null 바이트 어레이입니다' 가 된다. 없는 방식으로 내말들어봐 내가 되면 모든 공백을 빛위에 선언 도왔으매 when I call my class& # 39. 구성자를 초기화되었습니다 것이 바로 이렇게? 일부 '또는' 과 유사한 기능을 멤세트?

질문에 대한 의견 (2)
해결책

소규모 어레이에는 어레이입니다 초기화 구문 사용합니다.

var sevenItems = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };

대용량 스토리지 시스템을 위한 표준 '을 사용하여' 루프지 이것이 가장 효과적인 방법으로 읽을 수 있다.

var sevenThousandItems = new byte[7000];
for (int i = 0; i < sevenThousandItems.Length; i++)
{
    sevenThousandItems[i] = 0x20;
}

물론 이렇게 할 경우 다음 도우미 코드를 간결하게 유지할 수 있는 방법을 많이 만들 수 있습니다.

byte[] sevenItems = CreateSpecialByteArray(7);
byte[] sevenThousandItems = CreateSpecialByteArray(7000);

// ...

public static byte[] CreateSpecialByteArray(int length)
{
    var arr = new byte[length];
    for (int i = 0; i < arr.Length; i++)
    {
        arr[i] = 0x20;
    }
    return arr;
}
해설 (9)

이 방법을 사용하여 어레이입니다 만듭다 1 위를 차지했다.

byte[] array = Enumerable.Repeat((byte)0x20, ).ToArray();

&Lt 굈 ',' 을 (를), 수의 elements&gt 원하는 스토리지 시스템을 크기.

해설 (7)

너메라블레그리피스 () 사용할 수 있습니다.

100 을 어레이입니다 항목에서와 초기화되었습니다 0x20:

byte[] arr1 = Enumerable.Repeat(0x20,100).ToArray();
해설 (4)
var array = Encoding.ASCII.GetBytes(new string(' ', 100));
해설 (7)

초기화 하는 경우 작은 어레이입니다 사용할 수 있습니다.

byte[] smallArray = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };

더 큰 어레이입니다 관심용 경우 사용할 수 있습니다.

byte[] bitBiggerArray Enumerable.Repeat(0x20, 7000).ToArray();

이는 향후 담당이잖아요 / 거미요 쉽고 간편하게 읽을 수 있습니다. 충분히 빨리 예정이며 99.9% 의 시간. (일반적으로 BestOption™ 될 것으로 보인다.)

하지만 정말 정말 필요한 경우, 이 방법을 사용하여, P / invoke, 초고속 호출하십시오 아웃하려면 멤세트 최적화되었는지 사용할 수 있습니다. (여기서 랩된 up in a nice 사용할 수 있는 클래스)

public static class Superfast
{
    [DllImport("msvcrt.dll",
              EntryPoint = "memset",
              CallingConvention = CallingConvention.Cdecl,
              SetLastError = false)]
    private static extern IntPtr MemSet(IntPtr dest, int c, int count);

    //If you need super speed, calling out to M$ memset optimized method using P/invoke
    public static byte[] InitByteArray(byte fillWith, int size)
    {
        byte[] arrayBytes = new byte[size];
        GCHandle gch = GCHandle.Alloc(arrayBytes, GCHandleType.Pinned);
        MemSet(gch.AddrOfPinnedObject(), fillWith, arrayBytes.Length);
        return arrayBytes;
    }
}

사용법:

byte[] oneofManyBigArrays =  Superfast.InitByteArray(0x20,700000);
해설 (2)

내 이전에 보세요들 제공했음 대답을 있습니다. 난 그냥 너회의 남용을 포리치 루프지 지적합니다. 이후, loop&quot 위한 표준 &quot 증분우선순위수준우선 인덱스화할 지켜보리니 합니다. 뿐만 아니라 약간만이라도 더 작고, 더 효율적인 (&quot foreach"; 많은 것들이 높여줍니까 후드 아래에):

for (int index = 0; index < UserCode.Length; ++index)
{
    UserCode[index] = 0x20;
}
해설 (2)

이 api 를 사용하는 것이 가장 빠른 방법으로.

bR = 0xFF.

틀필기념리 (왕부퍼, n필엘런, bR);

포인터입니다 사용하여, 길이 버퍼입니다 쓸 수 있으며, 인코딩되지 바이트입니다. 내가 생각하는 가장 빠른 길일 관리됨 작은 블록을 만들 수 있는 코드 (훨씬 속도가 느린 (,) 은 이를 바이트입니다 어레이입니다 초기화되었습니다 바이트입니다 부페리브록코프 사용할 수 있는 루프지 쓰기 내가 던진 haven& # 39 이 함께 하지만, t 테스트됨 아니지만, 요점:

long size = GetFileSize(FileName);
// zero byte
const int blocksize = 1024;
// 1's array
byte[] ntemp = new byte[blocksize];
byte[] nbyte = new byte[size];
// init 1's array
for (int i = 0; i < blocksize; i++)
    ntemp[i] = 0xff;

// get dimensions
int blocks = (int)(size / blocksize);
int remainder = (int)(size - (blocks * blocksize));
int count = 0;

// copy to the buffer
do
{
    Buffer.BlockCopy(ntemp, 0, nbyte, blocksize * count, blocksize);
    count++;
} while (count < blocks);

// copy remaining bytes
Buffer.BlockCopy(ntemp, 0, nbyte, blocksize * count, remainder);
해설 (3)

이는 빠른 버전의 코드 (post 로 표시된 해답이야

보유하고 있는 모든 벤치마크 보여주는 수행됨 간단한 for 루프 (해당 map_layer 칠 경우 이 같은 일이 어레이에서는 데크레멘팅 대對 경우 일반적으로 두 배 빠른 증가.

또한 어레이입니다 길이 속성은 이미 통과된 만큼, t need to # 39 에서 검색할 수 있도록 매개변수입니다 doesn& 어레이입니다 이다. 미리 계산 및 배정됩니다 로컬 변수 있어야 합니다.

    • 가 재 계산 할 수 있는 속성 값을 루프 니며 계산이므로 액세서의 니며 전에 항상 이터레이션입니다 루프지
public static byte[] CreateSpecialByteArray(int length)
{
    byte[] array = new byte[length];

    int len = length - 1;

    for (int i = len; i >= 0; i--)
    {
        array[i] = 0x20;
    }

    return array;
}
해설 (0)

아마도 이 일은 여러 번 길을 위해 단지 내 확장하십시오 답변 깔끔한 다음과 같이 쓸 수 있다.

PopulateByteArray(UserCode, 0x20);

호출하는:

public static void PopulateByteArray(byte[] byteArray, byte value)
{
    for (int i = 0; i < byteArray.Length; i++)
    {
        byteArray[i] = value;
    }
}

이를 위한 효율적인 니스 (nice) 의 루프 (언급을 gwiazdorrr& # 39 의 오토메이티드) 뿐만 아니라 좋은 경우 깔끔한 보았으매 호출하십시오 많이유 사용되고 있다. 및 많이유 마로 at-a-glance 판독값 열거도 개인적으로 비해 한 것 같다. )

해설 (0)

이 기능은 보다 for 루프는 어레이에서는 채우기 위한 방법입니다.

이 명령은 매우 빠른 메모리 복제본에 라이스코프 시작된다. 이 함수를 호출하는 명령 및 크기를 두 배로 활용할 수 있습니다) 에 의해 그 때까지 반복적으로 라이스코프 우리가 복제본에 어레이입니다 꽉 찼습니다.

내 블로그에 dell. &lt &gt, 내가 이 문제를 논의할, http://coding.grax.com/2013/06/fast-array-fill-function-revisited.html

참고로 이 약간만이라도 손쉬운 방법 등을 통해 추가 확장명으로 그냥 단어 &quot this"; 즉, 공용 정적 무효화 선언 '이 방법을 ArrayFill&lt T&gt. ([]' 이 T 라이트필.

public static void ArrayFill(T[] arrayToFill, T fillValue)
{
    // if called with a single value, wrap the value in an array and call the main function
    ArrayFill(arrayToFill, new T[] { fillValue });
}

public static void ArrayFill(T[] arrayToFill, T[] fillValue)
{
    if (fillValue.Length >= arrayToFill.Length)
    {
        throw new ArgumentException("fillValue array length must be smaller than length of arrayToFill");
    }

    // set the initial array value
    Array.Copy(fillValue, arrayToFill, fillValue.Length);

    int arrayToFillHalfLength = arrayToFill.Length / 2;

    for (int i = fillValue.Length; i < arrayToFill.Length; i *= 2)
    {
        int copyLength = i;
        if (i > arrayToFillHalfLength)
        {
            copyLength = arrayToFill.Length - i;
        }

        Array.Copy(arrayToFill, 0, arrayToFill, i, copyLength);
    }
}
해설 (0)

취합은 초기화 사용할 수 있습니다.

UserCode = new byte[]{0x20,0x20,0x20,0x20,0x20,0x20};

'반복' 이 보다 더 잘 사용할 수 없는 경우 이 값은 동일해집니다.

해설 (2)

속도를 높일 수 있는 코드를 사용하여 초기화 및 간편해집니다 병렬 클래스 (4) 과 .NET 새):

public static void PopulateByteArray(byte[] byteArray, byte value)
{
    Parallel.For(0, byteArray.Length, i => byteArray[i] = value);
}

물론 어레이입니다 동시에 만들 수 있습니다.

public static byte[] CreateSpecialByteArray(int length, byte value)
{
    var byteArray = new byte[length];
    Parallel.For(0, length, i => byteArray[i] = value);
    return byteArray;
}
해설 (5)