Идиома более полезна, когда Вы пишете while
цикл вместо if
оператор. Для if
оператор, можно разбить его, как Вы описываете. Но без этой конструкции, необходимо было бы или повторить себя:
c = getchar();
while (c != EOF) {
// ...
c = getchar();
}
или использование loop-and-a-half структура:
while (true) {
c = getchar();
if (c == EOF) break;
// ...
}
я обычно предпочитал бы форму loop-and-a-half.
Если указатель указывает на один примитивный тип, а не на массив, используйте ref / out для описания параметра
[DllImport("USB4.dll")]
public static extern int USB4_Initialize(ref short deviceCount);
[DllImport("USB4.dll")]
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref uint32 value)
В этих примерах out, вероятно, более уместен, но любой из них будет работать.
Среда выполнения .NET может выполнять большую часть этого преобразования (называемого «маршалингом») за вас. Хотя явный IntPtr всегда будет делать ТОЧНО то, что вы ему скажете, вы, вероятно, можете заменить ключевое слово ref
на такой указатель.
[DllImport("USB4.dll")]
public static extern int USB4_Initialize(ref short deviceCount); //short*
[DllImport("USB4.dll")]
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref short value); //ulong*
Затем вы можете вызвать их так:
short count = 0;
USB4_Initialize(ref count);
// use the count variable now.