[编辑] 我在测试中犯了一个愚蠢的错误。我在这里问了一个不知道的问题。
答案是,两者都是一样的。但我把我的帖子留在这里给其他人。
getAvailableBlocksLong() * getBlockSizeLong()和 和有getAvailableBytes()什么区别
?
我自己测试了一下,在 Genymotion 上得到了一个非常奇怪的结果。
来自getAvailableBlocksLong() * getBlockSizeLong()和的值getAvailableBytes()不同!
我真的不明白这里发生了什么。
它只与Genymotion有关吗?我应该getAvailableBytes()在大多数情况下使用吗?
当我在Visual Studio中为Android共享库构建项目时,我收到了一条警告消息.
warning : suggest braces around initialization of subobject
[-Wmissing-braces]
Run Code Online (Sandbox Code Playgroud)
此消息指示仅使用一对大括号的数组初始化语句.
int myArray[ROW][COL] = { 1, 2, 3, 4, 5, 6, ..., 451, 452, 453 };
我不能用两对书写的原因是将来有可能改变ROW和COL的大小.
它运行正常,但我不确定是否可以这样离开项目,因为在为仅Windows应用程序编写代码时,我从未见过这样的警告消息.
我是否必须认真对待这件事?
请注意:这只是出于好奇而提出的问题,与编写更好的多线程代码无关。当然,我不会也不会在实际项目中编写这样的代码。
添加关键字时可能会发生内联替换inline。所以我很好奇。
假设我们有这样的代码:
static bool done = false;
inline void setDone(bool newState) {
done = newState;
}
inline bool getDone() {
return done;
}
void someWorkerThreadJob() {
// Accessing without any lock/atomic/volatile
while (getDone() == false) {
}
}
Run Code Online (Sandbox Code Playgroud)
可以someWorkerThreadJob()像下面这样编译并进入无限循环吗?
void someThreadJob() {
while (done == false) {
}
}
Run Code Online (Sandbox Code Playgroud)
这也将我引向了下一个问题。类中的getter和setter怎么样?在类中定义的成员函数是隐式的inline,所以我认为可能会发生内联替换,因此同样的问题。这样对吗?
我打算第一次使用Android SQLite.
Cursor c = db.rawQuery("some select command here", null);
// some jobs with the cursor..
c = db.rawQuery("another select command here", null);
// some jobs with the cursor..
c.close();
db.close();
c = null;
db = null;
Run Code Online (Sandbox Code Playgroud)
如您所见,我试图多次调用rawQuery()方法.
我必须关闭游标之前,我打电话rawQuery()方法AGAIN?
关闭游标和数据库后,我是否必须为变量赋值?
我fixed用数组和字符串变量测试了关键字并且工作得非常好,但我不能使用单个变量.
static void Main() {
int value = 12345;
unsafe {
fixed (int* pValue = &value) { // problem here
*pValue = 54321;
}
}
}
Run Code Online (Sandbox Code Playgroud)
该行fixed (int* pValue = &value)导致编译器错误.我没有得到它,因为变量value不在unsafe块中而且还没有固定.
为什么我不能fixed用于变量value?
我为我的Unity3d应用程序用C++创建了一些插件文件.到目前为止,应用程序只是一个简单的原型,所以我只在我的桌面上测试编译为Windows的DLL库.今天我将这些文件重新编译为.so(共享对象)for Android(arm和x86)并收到警告消息.
警告:为此目标忽略调用约定'__stdcall'[-Wignored-attributes]
1.这意味着所有函数都编译为__cdecl?
2.我不能在.so库中指定调用约定吗?
我用__cdecl替换了__stdcall,但它也发生了一条警告消息.
让我们运行这段代码:
double number = 12345.678888;
String str1 = String.format(Locale.FRANCE, "%.10f", number);
String str2 = NumberFormat.getInstance(Locale.FRANCE).format(number);
System.out.println(str1);
System.out.println(str2);
Run Code Online (Sandbox Code Playgroud)
输出将是:
12345,6788880000
12 345,679
但这些都不是我想要的。我想指定小数位数,NumberFormat就像String.format()可以做的那样。我也尝试过DecimalFormat,但我认为这不是答案。
如果我正在编写 C# 代码,可以像这样简单地完成:
string str = string.Format(new CultureInfo("fr-FR"), "{0:#,##0.0000000000}", number);
Run Code Online (Sandbox Code Playgroud)
输出将是:
12 345,6788880000
我怎样才能在 Java 中实现同样的事情?
[编辑]我想问的只是放一个类名this,所以它不是引用一个外部类成员.对不起我的不恰当的例子!
[编辑2]有人报告这是重复但不!正如我之前所说,我只是想知道是否有可能像Java一样引用MyClass.this和this互换.这根本不是一个实际问题,只是为了学习C#语言本身.我不介意删除这个,如果人们真的认为它是重复的,所以让我知道.
在Java中,您可以使用this类名这样的类:
class OuterClass {
int outerMember = 1;
class InnerClass {
int innerMember = 2;
public void printOuterMember() {
System.out.println(OuterClass.this.outerMember);
System.out.println(outerMember);
}
public void printInnerMember() {
System.out.println(InnerClass.this.innerMember);
System.out.println(this.innerMember);
System.out.println(innerMember);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有时候不需要课程名称,但有时候会有所帮助.
所以我在C#中尝试了同样的事情,但似乎这是不可能的.我对吗?
说,我有以下代码:
interface IAAA {
void aaa();
}
interface IBBB extends IAAA {
void bbb();
}
class MyClass implements IAAA, IBBB {
public void bbb() { }
public void aaa() { }
}
Run Code Online (Sandbox Code Playgroud)
是否有实现的任何好处IAAA的MyClass?正如你所看到的,IAAA已经被扩展IBBB,并MyClass正在实施两个IAAA和IBBB.似乎IAAA从中移除MyClass不会影响任何事情.
我之所以问这个愚蠢的问题,是因为我在Android开源项目中经常看到这种模式,有时甚至在标准中也是Java API如此ArrayList.
我想谈的一个例子是SpannableStringBuilder.
Spanned接口扩展CharSequence接口.
Spannable接口扩展Spanned接口.
Editable接口扩展CharSequence和Spannable接口.
SpannableStringBuilder类实现CharSequence …
我用'onTouch'方法写下面的内容.
但'getPointerCount()'和'getAction()'一直吐出相同的值.
此代码无法识别多点触控.
当MotionEvent.ACTION_UP发生时,不会调用'onTouch'方法.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
relativelayout = (RelativeLayout) findViewById(R.id.relativeLayout);
relativelayout.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
Log.i("test", "multiTouchCount : " + event.getPointerCount());
Log.i("test", "action : " + event.getAction());
return false;
}
});
}
Run Code Online (Sandbox Code Playgroud)
所以,我尝试使用onTouchEvent方法做同样的事情,这是有效的.
public boolean onTouchEvent(MotionEvent event) {
Log.i("test", "multiTouchCount : " + event.getPointerCount());
Log.i("test", "action : " + event.getAction());
return super.onTouchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)
'onTouch'方法有什么问题?
我创建了一个DLL文件,其中包含两个空函数.
extern "C" __declspec(dllexport) void __stdcall myFunc1() {
// just empty function
}
extern "C" __declspec(dllexport) void __cdecl myFunc2() {
// just empty function
}
Run Code Online (Sandbox Code Playgroud)
在C#中,我可以使用DLLImport如下属性调用函数.
[DllImport("myDLL", CallingConvention=CallingConvention.StdCall)]
private extern static void myFunc1();
[DllImport("myDLL", CallingConvention=CallingConvention.Cdecl)]
private extern static void myFunc2();
Run Code Online (Sandbox Code Playgroud)
所以我再次尝试使用LoadLibrary()kernel32.dll而不是DllImport属性.
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void MyFunc1();
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void MyFunc2();
Run Code Online (Sandbox Code Playgroud)
但是,当我调用MyFunc1()工作时MyFunc1()时会发生运行时错误.
所以我__stdcall用__cdeclC++ 替换,重新编译DLL,然后在C#中再次调用MyFunc1().
并且......它奏效了.
为什么地球上没有__stdcall呼叫约会在C#中用pinvoke工作?
我定期获取以毫秒为单位的新时间值,并且需要“00h 00m 00s”等形式,因此考虑使用TimeSpan,因为它使用起来非常简单。
TimeSpan t = TimeSpan.FromMilliseconds(timeValue);
但我现在担心的是GC。我认为每次都调用FromMilliseconds()不是一个好主意,因为它似乎总是创建一个新实例。我需要每隔 0.1 秒左右更新一次时间值,因此如果有一种方法可以直接修改 TimeSpan 对象的值,那么它对我的情况非常有用。否则,我想我需要自己创建一个方法..
是否可以?
我用我用 C# 编写的一些 DLL 测试了 Dotfuscator。看起来它在 .NET 环境下工作得很好,所以这次我用 Unity3D 尝试了它们。那些简单的 DLL 仅使用简单的标准 C# 类和方法进行编码,没有反射,没有 LINQ,没有其他自定义或第三方 API,包括 Unity 的。但未能让它们在我的 Unity3d 项目中工作,而未经混淆的原始纯 DLL 工作正常。在挣扎了几个小时之后,我决定用新的简单项目进行测试。下面是我在 C# 中得到的所有内容,没有其他代码,根本没有其他引用。
[System.Reflection.Obfuscation(Feature = "renaming", Exclude = true)]
public class Class1
{
[System.Reflection.Obfuscation(Feature = "renaming", Exclude = true)]
public static int Get()
{
return 123;
}
}
Run Code Online (Sandbox Code Playgroud)
把这个编译成DLL后,放到Unity3D编辑器上的一个EMPTY项目中播放,效果很好。但是当我在用 Dotfuscator 混淆 DLL 后再次尝试时,它不再说“ InvalidProgramException: Invalid IL code in Class1:Get (): IL_000c: pop ”。
正如你在上面看到的,我添加了防止代码被重命名的属性,当然,我可以在 Reflector 中看到,类和方法的名称实际上并没有被重命名。
昨天我在PreEmptive网站上新注册并下载了最新的Dotfuscator Professional Edition 4.21.0评估版。我使用 .NET 3.5 在 Visual Studio 2008 和 2015 上编译,还尝试了所有不同的解决方案平台。Unity …