小编wmz*_*wmz的帖子

string.StartsWith在不同平台上不一致

给出文档string.StartsWith和此代码段(针对.net核心2.x):

此方法将value参数与此字符串开头的子字符串进行比较,该字符串与value的长度相同,并返回一个值,指示它们是否相等.要相等,value必须是空字符串(String.Empty),必须是对此同一实例的引用,或者必须与此实例的开头匹配.此方法使用指定的大小写和文化执行比较.
https://docs.microsoft.com/en-us/dotnet/api/system.string.startswith?view=netcore-2.1

static void Main(string[] args)
    {
        var unicodeCtrl = "\u0000";
        var str = "x";
        Console.WriteLine($"Is it empty     => {unicodeCtrl == string.Empty}");
        Console.WriteLine($"Lenghts         => {str.Length} {unicodeCtrl.Length}");
        Console.WriteLine($"Are they equal  => {str == unicodeCtrl}");
        Console.WriteLine($"Are they ref eq => {Object.ReferenceEquals(str, unicodeCtrl)}");
        Console.WriteLine($"Contains        => {str.Contains(unicodeCtrl)}");
        Console.WriteLine($"Starts with     => {str.StartsWith(unicodeCtrl)}");
    }
Run Code Online (Sandbox Code Playgroud)

它在Windows上产生预期结果:

Is it empty     => False  
Lenghts         => 1 1
Are they equal  => False  
Are they ref eq => False  
Contains        => False  
Starts with     => False

但是当在Linux上运行时(通过docker),结果是: …

c# .net-core

7
推荐指数
1
解决办法
160
查看次数

什么(在规范中)保证'非短路逻辑运算符实际上不会短路?

这直接受到这个问题的启发.
有许多引用/声明,当应用于布尔运算符时,按位运算符不会短路.换句话说boolean a = f() & g(),where f()g()both都返回boolean,两者都将被评估.
但是,JLS只说:

15.22.2布尔逻辑运算符&,^和|
当两个操作数都是&,^或|时 operator的类型为boolean或Boolean,则按位运算符表达式的类型为boolean.在所有情况下,操作数都根据需要进行拆箱转换(第5.1.8节).

对于&,如果两个操作数值都为真,则结果值为true; 否则,结果是错误的.

对于^,如果操作数值不同,则结果值为true; 否则,结果是错误的.

对于|,如果两个操作数值都为false,则结果值为false; 否则,结果是真的.

这如何保证两个操作数都被实际评估?除此之外xor,如果其中一个参数(可能是第二个/右边首先被评估)违反条件,您仍然可以中断并返回结果.
例如.a & b只需要评估b为false就可以将表达式计算为false.

请注意:我不是问它是否以这种方式实现(不会短路) - 当然是.

我在问:

短路实施会违反语言标准吗?

java short-circuiting jls

6
推荐指数
1
解决办法
161
查看次数

Linux上的哪个版本的VM

哪个版本的VM应该在Linux上用于Pharo/Seaside?
如果我没有弄错的话,apt-get(并在海边书中引用)加载的是Squeak VM.
这应该优于Cog-VM吗?如果是,为什么?

smalltalk seaside virtual-machine pharo

5
推荐指数
1
解决办法
170
查看次数