小编Cri*_*scu的帖子

Java类型Class <>的.Net等价物?

我是一个.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)

.net java generics casting

15
推荐指数
1
解决办法
726
查看次数

Ruby有内置功能吗?

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)

有什么建议?

ruby conditional keyword

14
推荐指数
3
解决办法
1万
查看次数

Perforce:查找分支的源更改列表

精简版:

在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)?

version-control perforce branching-and-merging

13
推荐指数
1
解决办法
7817
查看次数

Java:RandomAccessFile模式"rws"vs"rwd"?

RandomAccessFile构造函数接受一个mode字符串,指定文件应该如何打开.

我对模式"rws""rwd"模式之间的区别感到困惑.

这是文档所说的内容:

"rws"用于读写,与"rw"一样,并且还要求将文件内容或元数据的每次更新同步写入底层存储设备.

"rwd"用于读写,与"rw"一样,并且还要求将文件内容的每次更新同步写入底层存储设备.

[...]

"rwd"模式可用于减少执行的I/O操作的数量.使用"rwd"只需要将文件内容的更新写入存储; 使用"rws"需要更新文件的内容及其要写入的元数据,这通常需要至少一个低级别的I/O操作.

...并没有解释什么metadata意思.这是否意味着"rws"更新文件系统上的最后修改时间戳,而"rwd"不是?

java file-io metadata java-io

13
推荐指数
1
解决办法
1万
查看次数

Win32:写入文件而不缓冲?

我需要创建一个新的文件句柄,以便对该句柄的任何写操作立即写入磁盘.

额外信息:句柄将是子进程的继承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)

file-io winapi buffering

12
推荐指数
2
解决办法
8882
查看次数

伙计,我的线程在哪里?(或:重命名.NET线程池线程 - 是否可能?)

有时我发现自己在调试模式下单步执行应用程序,直到我在某个特定行上点击'step'并且需要花费太多时间做某事,占用100%的CPU.在这一点上,我按下了"Break"按钮,试着找出运行时间这么长的东西.

问题是,这个应用程序运行了大量的线程,当我点击"Break"时,执行点转到GUI线程,可能只是在做"等待".然后,我必须通过现有的线程(我计算它们 - 这次是37岁!)试图找到我正在执行的线程.我必须看看每一个的堆栈,直到找到我要找的那个.

我正在运行的线程是异步调用,因此它在线程池线程上运行.我想给这个线程一个描述性名称,并在操作结束时重置它的名字.

问题是,属性Thread.Name只能设置一次,之后它会给出一个InvalidOperationException.

有什么建议?

哦,是的,我正在运行VS2005/.NET 2.0,但我也很好奇,如果新版本有更好的方法来处理这个问题.

.net c# debugging multithreading

12
推荐指数
1
解决办法
1465
查看次数

12
推荐指数
4
解决办法
3612
查看次数

Linq to Objects - 从数字列表中返回数字对

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}.

c# linq linq-to-objects aggregate slice

12
推荐指数
2
解决办法
4595
查看次数

将"C#friendly type"转换为实际类型:"int"=> typeof(int)

我想得到一个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)

.net c# reflection types

12
推荐指数
3
解决办法
1万
查看次数

访问`this`的字段初始化程序:在C#中无效,在Java中有效吗?

一,介绍:

这段代码:

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?或者类型初始化程序在两种语言中的工作方式有根本区别吗?

c# java compiler-construction initialization

12
推荐指数
2
解决办法
797
查看次数