小编Ran*_*832的帖子

Java中使用盒装类型的三元条件的奇怪行为

我在我的应用程序中使用了这段代码(简化版):

Object result;
if (check)
    result = new Integer(1);
else
    result = new Double(1.0);
System.out.println(result);
return result;
Run Code Online (Sandbox Code Playgroud)

然后我决定将if-else语句重构为三元条件表达式,因此我的代码更简洁:

Object result = check ? new Integer(1) : new Double(1.0);
System.out.println(result);
return result;
Run Code Online (Sandbox Code Playgroud)

原来,如果检查是true两个版本打印不同的结果:

1
Run Code Online (Sandbox Code Playgroud)

要么:

1.0
Run Code Online (Sandbox Code Playgroud)

三元条件不等于相应的if-else吗?

java ternary-operator

23
推荐指数
2
解决办法
626
查看次数

为什么在值类型上调用显式接口实现会导致它被装箱?

我的问题与此问题有些相关:泛型约束如何阻止使用隐式实现的接口对值类型进行装箱?,但不同,因为它不需要约束来执行此操作,因为它根本不是通用的.

我有代码

interface I { void F(); }
struct C : I { void I.F() {} }
static class P {
    static void Main()
    {    
        C x;
        ((I)x).F();
    }
}
Run Code Online (Sandbox Code Playgroud)

主要方法编译如下:

IL_0000:  ldloc.0
IL_0001:  box        C
IL_0006:  callvirt   instance void I::F()
IL_000b:  ret
Run Code Online (Sandbox Code Playgroud)

为什么不编译到这个?

IL_0000:  ldloca.s   V_0
IL_0002:  call       instance void C::I.F()
IL_0007:  ret
Run Code Online (Sandbox Code Playgroud)

我明白为什么你需要一个方法表来进行虚拟调用,但在这种情况下你不需要进行虚拟调用.如果接口正常实现,则不进行虚拟呼叫.

还相关:为什么显式接口实现是私有的? - 关于这个问题的现有答案没有充分解释为什么这些方法在元数据中被标记为私有(而不是仅仅具有不可用的名称).但即使这样也没有完全解释为什么它是盒装的,因为从C里面调用时它仍然是盒子.

.net c# boxing interface explicit-interface

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

对字符串应用"掩码"

我有一个标志枚举(int)掩码,我需要将其转换为表示一周中的日期的字符串.

说这是FULL字符串和任意掩码

strFullWeek = "MTWtFSs"
strWeekMask = "0100110"
-----------------------
strResult   = "-T--FS-"
Run Code Online (Sandbox Code Playgroud)

你建议从整周和掩盖字符串中获取strResult的方式是什么?

UPDATE

这是我的"整个上下文"(VB.NET)

<Flags()> Public Enum Week
  Monday = 1
  Tuesday = 2
  Wednesday = 4
  Thursday = 8
  Friday = 16
  Saturday = 32
  Sunday = 64
End Enum

Dim mondayOrSunday = Week.Monday Or Week.Sunday
Dim strDays = "MTWtFSs"

Dim strMondayOrSundayBinary = Convert.ToString(
  mondayOrSunday, 2).PadRight(7, CChar("0"))

Dim charMondayOrSunday = strDays.Zip(
  strMondayOrSundayBinary,
  Function(day, mask) If(mask = CChar("1"), day, CChar("-"))).ToArray()

Dim strMondayOrSunday = New String(charMondayOrSunday)

Console.WriteLine("{0} I see as …
Run Code Online (Sandbox Code Playgroud)

.net c# vb.net string

14
推荐指数
2
解决办法
3150
查看次数

C/C++逗号运算符让我很困惑.语言律师?

我在Boost文档的一个例子中遇到了这段代码:

std::vector<int> input;
input += 1,2,3,4,5,6,7,8,9;
Run Code Online (Sandbox Code Playgroud)

真可爱.Boost有一个operator + =的模板,它利用了逗号在大多数情况下是一个操作符的事实.(明智的是,C++不允许黑客超载" 运算符 ".)

我也喜欢编写可爱的代码,所以我用逗号操作符来玩一些.我找到了一些看起来很奇怪的东西.您认为以下代码将如何打印?

#include <iostream>
int main() {
    int i;
    i = 1,2;
    std::cout << i << ' ';
    i = (1,2);
    std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

你猜到了.VC++ 2012打印"1,2".那是怎么回事?

[编辑:我应该更精确.本来应该说C++不允许运算符","在一个int的列表中被重载.或者更好,没什么.可以为类和枚举重载','运算符.]

c++ visual-c++

8
推荐指数
2
解决办法
514
查看次数

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

简单的javascript'new'关键字

我创建了简单的对象

var myobject={

  sum:function(){
    console.log('sum')
  },
  sub:function(){
    console.log('sub')
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我从上面的对象创建了新对象,如: -

var newmyobject=new Object(myobject);
Run Code Online (Sandbox Code Playgroud)

最后我向新对象添加了一个属性,如: -

newmyobject.mult=function(){
  console.log('multi');
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当我这样做

console.log(myobject);
console.log(newmyobject);
Run Code Online (Sandbox Code Playgroud)

两者都显示相同的结果.我期待"mult()"应该只在newmyobject中.

javascript object new-operator

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