我正在为支持多个国家/地区的应用实施应用内购买.
应用内结算版本3 API 声称:
不需要货币转换或格式化:价格以用户的货币报告,并根据其区域设置进行格式化.
这实际上是正确的,因为skuGetDetails()它会处理所有必要的格式.响应包括一个名为的字段price,其中包含
物料的格式化价格,包括其货币符号.价格不含税.
但是,我需要ISO 4217货币代码(如果我知道商店区域设置可检索)和实际的非格式化价格(最好是浮点数或十进制变量),所以我可以自己做进一步的处理和分析.
解析回归skuGetDetails()不是一个可靠的想法,因为许多国家共享相同的货币符号.

如何使用应用内结算版本3 API获取应用内购买的ISO 4217货币代码和非格式化价格?
一些从 Visual Studio Code (VSC) 迁移到 Visual Studio (VS) 的人希望让 VS 使用与 VSC 相同的键绑定,并且似乎有一种方法可以做到这一点。
我想做相反的事情。我的主要编辑器是 VS,并且我想在 VSC 上编辑一些文件,因此我希望 VSC 上的键绑定表现得像 VS。
我特别对矩形或多行编辑功能感兴趣。在 VS 中,我可以使用 Alt-Shift-Arrow 来创建矩形选区,我发现这非常有用:
我想在 VSC 中做同样的事情。我发现的最接近的是“多光标”功能,它的工作方式类似:
然而,VS 的工作方式有两个关键的区别,这使得它使用起来有点令人沮丧:
有没有办法让VSC像VS一样进行矩形选择?
注意:问题不在于我使用指针和不安全的代码; 代码工作得很好.该问题与确认的编译器错误有关,该错误在某些情况下拒绝编译法律代码.如果您对该问题感兴趣,请访问我的其他问题
因为我的问题是指针变量的声明,所以我决定解决这个问题,然后使用IntPtr,并在需要时转换为实际的指针.
但是,我注意到我做不到这样的事情:
IntPtr a = something;
IntPtr b = somethingElse;
if (a > b) // ERROR. Can't do this
{
}
Run Code Online (Sandbox Code Playgroud)
在>和<似乎运营商没有为被定义IntPtr.请注意,我确实可以比较两个实际指针.
IntPtr有一个.ToInt64()方法.但是,这会返回一个有符号值,在与之比较时可能会返回不正确的值,>并且<当涉及正值和负值时.
说实话,我真的不明白.ToInt64()对于返回有符号值的方法有什么用处,考虑到指针比较是无符号执行的,但这不是我的问题.
有人可能会争辩说,IntPtrs为不透明的手柄,这是毫无意义的,因此与比较>和<.但是,我会指出IntPtr有加法和减法的方法,这意味着实际上存在秩序概念IntPtr,因此>并且<确实有意义.
我想我可以将结果转换ToInt64()为a ulong然后进行比较,或者将其IntPtr转换为指针,然后进行比较,但它让我想到为什么不是>和<定义的 …
我在我制作的SharpDX程序上遇到了一个奇怪的错误.
该程序包含一个表单MainForm,它继承自SharpDX.Windows.RenderForm(我正在做Direct3D 9).我有一些通过调用来杀死程序的逻辑,MainForm.Close()它完美地工作.
但是,当我使用X按钮关闭表单或双击屏幕左上角时,程序以代码-1073610751(0xc0020001)结束.
这是一个相对较小的烦恼,因为它只在程序完成时才会发生,因此如果它以错误退出并不重要,因为它实际上正在完成.
但是,当我在我的最后一行设置断点时,不会发生此错误Main().如果我这样做,然后按照我的解释关闭窗口,断点就会被触发,并且恢复将以代码0结束程序.
除了SharpDX和一个纯C DLL,我打算一次性处理一些数据,我没有做混合代码,或任何其他奇怪的东西.
我环顾四周,但这段代码似乎与字符串绑定有关?其他人在做奇怪的混合C++/CLI时似乎有这个问题,但我没有做那样的事情.
有任何想法吗?至少如何获得有关此错误代码的更简洁信息?
我正在重写ToString()矩阵类的方法,以便我可以将监视窗口中的内容复制到文本编辑器中以执行进一步的分析。
这个想法ToString()应该返回这样的东西:
[M11:-1.00 M12: 0.00 M13: 0.00 M14: 0.00]
[M21: 0.00 M22: 0.00 M23:-1.00 M24: 0.00]
[M31: 0.00 M32:-1.00 M33: 0.00 M34: 0.00]
[M41: 0.00 M42: 0.00 M43: 0.00 M44: 1.00]
Run Code Online (Sandbox Code Playgroud)
请注意正数如何具有额外的填充空间来补偿负号在负数上占用的空间。
目前,我正在这样做:
public override string ToString()
{
return string.Format("[M11:{0:0.00} M12:{1:0.00} M13:{2:0.00} M14:{3:0.00}]\n[M21:{4:0.00} M22:{5:0.00} M23:{6:0.00} M24:{7:0.00}]\n[M31:{8:0.00} M32:{9:0.00} M33:{10:0.00} M34:{11:0.00}]\n[M41:{12:0.00} M42:{13:0.00} M43:{14:0.00} M44:{15:0.00}]",
M11, M12, M13, M14, M21, M22, M23, M24, M31, M32, M33, M34, M41, M42, M43, M44);
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
[M11:-1.00 M12:0.00 M13:0.00 M14:0.00]
[M21:0.00 M22:0.00 …Run Code Online (Sandbox Code Playgroud) 考虑以下lua代码:
f = {}
for i = 1, 10 do
f[i] = function()
print(i .. " ")
end
end
for k = 1, 10 do
f[k]()
end
Run Code Online (Sandbox Code Playgroud)
这将打印从1到10的数字.在这种情况下,i将关闭外部循环的每次迭代的值.这就是我一直都懂得闭合的方式,我很开心......
...直到我将一些lua代码移植到c#中,我试图做同样的事情:
var f = new Action[10];
for (int i = 0; i < 10; i++)
{
f[i] = (new Action(delegate()
{
Console.Write(i + " ");
}));
}
for (int k = 0; k < 10; k++)
{
f[k]();
}
Run Code Online (Sandbox Code Playgroud)
现在我将10号打印10次(让我们忘记了lua数组是基于1的).实际上,在这种情况下,闭包对变量起作用,而不是它的值,这很有意义,因为我只是在第一个循环结束后调用函数.
JavaScript似乎具有相同的语义(接近变量):
var f = []
for (var i = 0; …Run Code Online (Sandbox Code Playgroud) 在处理大型现有源代码库时,我发现了这个构造的几个实例:
do
{
if (!a)
break;
something();
} while(false);
Run Code Online (Sandbox Code Playgroud)
在什么情况下比(在我看来)更简单
if (a)
{
something();
}
Run Code Online (Sandbox Code Playgroud)
?
这个构造有很多实例,所以我认为它是故意的.不幸的是,编写该代码的人不可用.
有没有理由为什么第一种编写代码块的方法更适合第二种方式呢?
我正在 Visual Studio 2022 上愉快地编写 C# 代码,突然我的代码旁边开始出现这些青色框:
如果我单击它们,它们会告诉我我的类正在实现某些方法或其他内容。这是非常无用的信息,并且让人很难集中注意力。
这些盒子是什么以及如何摆脱它们?