在使用Enum.TryParse时,我遇到了一种我没想到的行为.
如果我有一个枚举:
public enum MyEnum
{
ValueA,
ValueB,
ValueC
}
Run Code Online (Sandbox Code Playgroud)
然后我将一个数值(作为一个字符串)传递给Enum.TryParse,如:
MyEnum outputEnum;
bool result = Enum.TryParse("1234", out outputEnum);
Run Code Online (Sandbox Code Playgroud)
尽管字符串"1234"不是可能的值,但结果将返回true,而我的outputEnum将具有值1234.
有没有办法可以避免这种行为?我正在尝试编写一个函数,它将任意字符串输入作为枚举处理,这在我的错误输入检测中引发了一些麻烦.
以下两种编码风格是否存在任何形式的共识?我更好奇的是,如果在C#中的优秀代码中通常首选一个这样的东西,或者这是在为编码项目选择样式时决定的事情.
风格1:使用!标志表示不符合条件
if (!myBool)
{
//Do Stuff...
}
Run Code Online (Sandbox Code Playgroud)
样式2:使用== false表示在条件中检查虚假
if (myBool == false)
{
//Do Stuff...
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我在DLL中有一个函数:
char __usercall MyUserCallFunction<al>(int arg1<esi>)
Run Code Online (Sandbox Code Playgroud)
因为我讨厌自己,所以我想使用P/Invoke在C#中调用它.
通常这可以通过获取函数委托来完成,la:
[UnmanagedFunctionPointer(CallingConvention.ThisCall, CharSet = CharSet.Auto, SetLastError = true)]
public delegate char DMyUserCallFunction(IntPtr a1);
Run Code Online (Sandbox Code Playgroud)
然后通过执行以下操作来调用它:
var MyFunctionPointer = (DMyUserCallFunction)Marshal.GetDelegateForFunctionPointer(AddressOfFunction, typeof(DMyUserCallFunction));
MyFunctionPointer(IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
但是,对于自定义用户调用约定,这将导致程序崩溃.有没有某种方法我可以使用不安全的代码或某种将代理放在适当位置的包装函数来做到这一点,但是不强迫我编写C++ DLL?
谢谢!
编辑:
正如dtb所建议的,我创建了一个非常小的C++ DLL,我通过P/Invoke来调用该函数.对于任何好奇的人来说,C++中的函数最终看起来像:
extern "C" __declspec(dllexport) int __stdcall callUsercallFunction(int functionPointer, int arg1 )
{
int retVal;
_asm
{
mov esi, arg1
call functionPointer
mov retVal, eax
}
//Fake returning al, the lower byte of eax
return retVal & 0x000000FF;
}
Run Code Online (Sandbox Code Playgroud)