【发布时间】:2015-11-28 15:54:36
【问题描述】:
我正在开发一个用 c#(使用 this base)编写的 Teamspeak3 插件,并且正在获取频道列表,这是在 c 中的操作方法:
/* Print list of all channels on this server */
char* s;
char msg[1024];
anyID myID;
uint64* ids;
size_t i;
unsigned int error;
if(ts3Functions.getChannelList(serverConnectionHandlerID, &ids) != ERROR_ok) {
ts3Functions.logMessage("Error getting channel list", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
return;
}
printf("PLUGIN: Available channels:\n");
for(i=0; ids[i]; i++) {
/* Query channel name */
if(ts3Functions.getChannelVariableAsString(serverConnectionHandlerID, ids[i], CHANNEL_NAME, &s) != ERROR_ok) {
ts3Functions.logMessage("Error querying channel name", LogLevel_ERROR, "Plugin", serverConnectionHandlerID);
return;
}
printf("PLUGIN: Channel ID = %llu, name = %s\n", (long long unsigned int)ids[i], s);
ts3Functions.freeMemory(s);
}
ts3Functions.freeMemory(ids); /* Release array */
在for(i=0; ids[i]; i++),它声明uint64* 正在与size_t 进行迭代。
我想知道如何迭代它,以及 c# 中最接近的等价物是什么?
【问题讨论】:
-
您是否考虑过检查现有问题(如果有帮助)(在 C# 中等效于 size_t),例如 Correct way to marshal SIZE_T*? 简短回答:“使用 IntPtr 和/或 UIntPtr 做得很好——这些类型是专门为此目的而存在的!..."
-
我看过那条评论,但我也在问如何使用 size_t 进行迭代,以及是否有办法在 c# 中做同样的事情。因为在示例中,我不知道这样做会产生什么影响。
-
根据我自己的测试,迭代
size_t类似于迭代int,除了变量定义为size_t而不是int和循环中的比较也应该使用size_t类型的变量来完成。仅作为说明,可以将类型转换为 int ;即(int)my_size_t但是,这是不可取的——当不需要强制转换时,将每种类型都视为正确的类型。 For Q 关于如何在 C# 中进行操作。 C#: Retrieving and using an IntPtr* through reflection 有帮助吗?
标签: c# c++ pointers size-t teamspeak