我是一个.NET人,所以让我首先断言我对一些Java概念的理解 - 如果我错了,请纠正我.
Java Generics支持有界通配符的概念:
class GenericClass< ? extends IInterface> { ... }
Run Code Online (Sandbox Code Playgroud)
...类似于.NET where
限制:
class GenericClass<T> where T: IInterface { ... }
Run Code Online (Sandbox Code Playgroud)
Java的Class
类描述了一个类型,并且大致相当于.NET Type
类
到现在为止还挺好.但是我找不到足够接近Java的通用类型Class<T>
,其中T是有界通配符.这基本上对所Class
代表的类型施加了限制.
让我举一个Java的例子.
String custSortclassName = GetClassName(); //only known at runtime,
// e.g. it can come from a config file
Class<? extends IExternalSort> customClass
= Class.forName("MyExternalSort")
.asSubclass(IExternalSort.class); //this checks for correctness
IExternalSort impl = customClass.newInstance(); //look ma', no casting!
Run Code Online (Sandbox Code Playgroud)
我在.NET中最接近的是这样的:
String custSortclassName = GetClassName(); …
Run Code Online (Sandbox Code Playgroud) Ruby有丰富的条件结构,包括if
/ unless
,while
/ until
等.
while
来自C 的街区:
while (condition) {
...
}
Run Code Online (Sandbox Code Playgroud)
可以直接翻译成Ruby:
while condition
...
end
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法在Ruby中找到一个类似C的块的内置等价物do ... while
,其中块内容至少执行一次:
do {
...
} while (condition);
Run Code Online (Sandbox Code Playgroud)
有什么建议?
精简版:
在P4中分支后,如何找到分支的"源"更改列表?
长版:
假设我的项目主要分支在
//project/main/...
Run Code Online (Sandbox Code Playgroud)
这里提交的最新更改列表是@ 123,当我决定为1.0版本创建一个分支时
//project/1.0/...
Run Code Online (Sandbox Code Playgroud)
从P4V开始,创建一个新的更改列表(比如@ 130),解决并提交.
在CLI中,它看起来像这样:
p4 integrate -c 123 -o //project/main/... //project/1.0/...
p4 submit
Run Code Online (Sandbox Code Playgroud)
稍后,我查看下面的更改列表//project/1.0
,并查看包含大量分支文件的@ 130更改列表.我怎样才能找到变更清单号.这最初来自(即@ 123)?
该RandomAccessFile
构造函数接受一个mode
字符串,指定文件应该如何打开.
我对模式"rws"
和"rwd"
模式之间的区别感到困惑.
这是文档所说的内容:
"rws"用于读写,与"rw"一样,并且还要求将文件内容或元数据的每次更新同步写入底层存储设备.
"rwd"用于读写,与"rw"一样,并且还要求将文件内容的每次更新同步写入底层存储设备.
[...]
"rwd"模式可用于减少执行的I/O操作的数量.使用"rwd"只需要将文件内容的更新写入存储; 使用"rws"需要更新文件的内容及其要写入的元数据,这通常需要至少一个低级别的I/O操作.
...并没有解释什么metadata
意思.这是否意味着"rws"
更新文件系统上的最后修改时间戳,而"rwd"
不是?
我需要创建一个新的文件句柄,以便对该句柄的任何写操作立即写入磁盘.
额外信息:句柄将是子进程的继承STDOUT,因此我需要该进程的任何输出立即写入磁盘.
研究CreateFile
文档时,FILE_FLAG_WRITE_THROUGH
标志看起来就像我需要的那样:
写操作不会通过任何中间缓存,它们将直接进入磁盘.
我写了一个非常基本的测试程序,好吧,它没有用.我在CreateFile上使用了标志,然后WriteFile(myHandle,...)
在长循环中使用,在大约15秒内写入大约100MB的数据.(我添加了一些Sleep()
).
然后,我建立了一个专业的监控环境,包括在资源管理器中持续点击"F5".结果:文件保持在0kB,然后在测试程序结束时跳转到100MB.
我尝试的下一件事是在每次写入后手动刷新文件FlushFileBuffers(myHandle)
.这使得观察到的文件大小变得美观和稳定,正如预期的那样.
我的问题是,那么,不应该FILE_FLAG_WRITE_THROUGH
这样做没有手动刷新文件?我错过了什么吗?在"真实世界"程序中,我无法刷新文件,因为我无法控制正在使用它的子进程.
还有一个FILE_FLAG_NO_BUFFERING
标志,我不能出于同样的原因使用 - 不能控制使用句柄的进程,因此我不能手动对齐此标志所需的写入.
编辑:我已经专门制作了一个单独的项目,用于观察文件大小的变化.它使用.NET FileSystemWatcher
类.我也写了更少的数据 - 总共大约100kB.
这是输出.查看时间戳中的秒数.
'内置无缓冲区'版本:
25.11.2008 7:03:22 PM: 10230 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10240 bytes added.
25.11.2008 7:03:31 PM: 10200 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 bytes added.
25.11.2008 7:03:42 PM: 10240 …
Run Code Online (Sandbox Code Playgroud) 有时我发现自己在调试模式下单步执行应用程序,直到我在某个特定行上点击'step'并且需要花费太多时间做某事,占用100%的CPU.在这一点上,我按下了"Break"按钮,试着找出运行时间这么长的东西.
问题是,这个应用程序运行了大量的线程,当我点击"Break"时,执行点转到GUI线程,可能只是在做"等待".然后,我必须通过现有的线程(我计算它们 - 这次是37岁!)试图找到我正在执行的线程.我必须看看每一个的堆栈,直到找到我要找的那个.
我正在运行的线程是异步调用,因此它在线程池线程上运行.我想给这个线程一个描述性名称,并在操作结束时重置它的名字.
问题是,属性Thread.Name
只能设置一次,之后它会给出一个InvalidOperationException
.
有什么建议?
哦,是的,我正在运行VS2005/.NET 2.0,但我也很好奇,如果新版本有更好的方法来处理这个问题.
var nums = new[]{ 1, 2, 3, 4, 5, 6, 7};
var pairs = /* some linq magic here*/ ;
Run Code Online (Sandbox Code Playgroud)
=> pairs = {{1,2},{3,4},{5,6},{7,0}}
元素pairs
应该是两元素列表,或者是一些具有两个字段的匿名类的实例,例如new {First = 1, Second = 2}
.
我想得到一个System.Type
给定的string
指定(原始)类型的C#友好名称,基本上是C#编译器在读取C#源代码时的方式.
我觉得描述我所追求的是以单元测试形式出现的最佳方式.
我希望存在一种通用技术可以使所有下面的断言通过,而不是试图对特殊C#名称的特殊情况进行硬编码.
Type GetFriendlyType(string typeName){ ...??... }
void Test(){
// using fluent assertions
GetFriendlyType( "bool" ).Should().Be( typeof(bool) );
GetFriendlyType( "int" ).Should().Be( typeof(int) );
// ok, technically not a primitive type... (rolls eyes)
GetFriendlyType( "string" ).Should().Be( typeof(string) );
// fine, I give up!
// I want all C# type-aliases to work, not just for primitives
GetFriendlyType( "void" ).Should().Be( typeof(void) );
GetFriendlyType( "decimal" ).Should().Be( typeof(decimal) );
//Bonus points: get type of fully-specified CLR types
GetFriendlyName( …
Run Code Online (Sandbox Code Playgroud) 这段代码:
class C
{
int i = 5;
byte[] s = new byte[i];
}
Run Code Online (Sandbox Code Playgroud)
无法编译时出现以下错误:
字段初始值设定项不能引用非静态字段,方法或属性"Ci"
Resharper说类似的东西:无法访问i
静态上下文中的非静态字段.
这与C#规范所说的一致 - 字段初始化程序无法访问当前正在创建的实例(this
),或者通过扩展,访问任何实例字段:
实例字段的变量初始值设定项无法引用正在创建的实例.因此,在变量初始化程序中引用它是一个编译时错误,因为变量初始化程序通过简单名称引用任何实例成员是编译时错误.
但是,这在Java中运行得很好:
class C {
int i = 5;
byte s[] = new byte[i]; //no errors here
}
Run Code Online (Sandbox Code Playgroud)
在一个假设的世界中,这在C#中是有效的,我想知道:它甚至可能吗?如果是这样,它会增加到表中的利弊是什么?此外,由于它的真正Java语言支持,做同样的优点/缺点持有 的Java?或者类型初始化程序在两种语言中的工作方式有根本区别吗?