给出文档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),结果是: …
这直接受到这个问题的启发.
有许多引用/声明,当应用于布尔运算符时,按位运算符不会短路.换句话说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.
请注意:我不是问它是否以这种方式实现(不会短路) - 当然是.
我在问:
短路实施会违反语言标准吗?
哪个版本的VM应该在Linux上用于Pharo/Seaside?
如果我没有弄错的话,apt-get(并在海边书中引用)加载的是Squeak VM.
这应该优于Cog-VM吗?如果是,为什么?