.net CLR是否将对象转换为集合声明中提到的对象?如果我宣布一个
List<string> lststrs= new List<string>();
lststrs.add("ssdfsf");
Run Code Online (Sandbox Code Playgroud)
.net在添加和重新启动时强制转换此对象?????
我认为每个人都不清楚这个问题本身.让我详细说明.在java中有泛型,但如果您反编译代码,您会注意到,编译器在使用Collection对象的任何地方都进行了类型转换.对于Ex:List listOfStrings; listOfStrings.add( ""); String value = listOfStrings.get(1); 反编译类文件后,我们看到这个List listOfStrings; listOfStrings.add( ""); String value =(String)listOfStrings.get(1); 这里编译器已经完成了字符串的类型转换.
现在我的问题是它在.Net中是否相同?
可能我可能会与拳击和拆箱混淆.
请考虑MSDN中的以下声明:
"取消装箱是从类型对象到值类型或从接口类型到实现接口的值类型的显式转换."
因此,这意味着取消装箱只能应用于值类型参数.
所以,这没关系.
var concernedInteger = (int)myObject; //unboxing is ok.
Run Code Online (Sandbox Code Playgroud)
由于class是引用类型,因此不起作用(因为取消装箱仅适用于值类型)
var concernedClassObject = (TestClass)testClassObject // unboxing is still ok.
Run Code Online (Sandbox Code Playgroud)
我的ReSharper没有显示任何错误.
所以,我的问题是"当MSDN说只有值类型可以解包"时,如何拆箱引用类型变量?
我在C#中搜索拳击和拆箱时发现了以下代码片段.
class TestBoxing
{
static void Main()
{
int i = 123;
// Boxing copies the value of i into object o.
object o = i;
// Change the value of i.
i = 456;
// The change in i does not effect the value stored in o.
System.Console.WriteLine("The value-type value = {0}", i);
System.Console.WriteLine("The object-type value = {0}", o);
}
}
/* Output:
The value-type value = 456
The object-type value = 123
*/
Run Code Online (Sandbox Code Playgroud)
在这里它说,即使他的值的值改变了o的值仍然是相同的.如果是,那么o引用值"123"而不是i.是吗?如果o存储了i的值那么当我的价值被改变了,o的价值也会发生变化.如果我错了,请纠正我.
目前我正在阅读一本书"Java Generics and Collections",我发现了一个有趣的代码:
List<Integer> ints = Arrays.asList(1,2,3);
int s = 0;
for (int n : ints) { s += n; }
assert s == 6;
Run Code Online (Sandbox Code Playgroud)
这里foreach循环迭代原语:
for (int n : ints) { ... }
Run Code Online (Sandbox Code Playgroud)
但是,Eclipse IDE建议我迭代盒装类型:
for (Integer n : ints) { ... }
Run Code Online (Sandbox Code Playgroud)
使用一种或另一种迭代方式有什么好处吗?
我问这个问题,因为我有一种情况,我有以下两种方法:
public T get(Serializable id) and
public T get(int id)
Run Code Online (Sandbox Code Playgroud)
我必须在大多数情况下使用第一种方法,而第二种方法已在我们的系统中弃用.
我的输入是String所以每次我需要调用时
get(Serializable id),我必须传递Integer而不是int,否则它将使用不推荐使用的第二种方法.即我打电话Integer.parseInt(str),然后我不得不专栏它整数(即(Integer)Integer.parseInt(str)),这似乎是多余的.
有没有更好的方法来实现这一点,为什么Integer.parseInt(str)return int而不是Integer的实现?
甲Wrapper类用于将原始进入对象和对象转换为原始。类似地,通过使用Autoboxing,Unboxing我们可以做相同的事情,那么这两者有什么区别:1-概念明智2-代码明智???
假设我有一个Map<Integer, Boolean>,我想过滤掉所有布尔值为的整数true.这是一些代码:
for (Map.Entry<Integer, Boolean> e : map.entrySet()){
if (e.getValue() == true){ // Unboxing here
// Do something useful...
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,Boolean每次执行if时都会将对象取消装箱(如果地图非常大,则可能会出现问题).
现在,Boolean-class提供常量(Boolean.TRUE和Boolean.FALSE),它们表示普通的布尔值,true并且false是一个已经装箱的版本(对吧?).因此,使用此代码可以完全避免拆箱:
for (Map.Entry<Integer, Boolean> e : map.entrySet()){
if (e.getValue() == Boolean.TRUE){ // No Unboxing done (?)
// Do something useful...
}
}
Run Code Online (Sandbox Code Playgroud)
我对这个假设是对的吗?或者更糟糕的是两个值都是未装箱的比较?
在C#Int类型中派生自ValueType.ValueType是从Object类型派生的.因此Int是一个Object.
如果每个值类型变量已经是一个Object,那么在装箱/拆箱期间实际发生了什么?