为什么我们需要在C#中装箱和拆箱?
我知道拳击和拆箱是什么,但我无法理解它的实际用途.我应该在哪里以及在哪里使用它?
short s = 25;
object objshort = s; //Boxing
short anothershort = (short)objshort; //Unboxing
Run Code Online (Sandbox Code Playgroud) 我正在开展一个项目,我发现我正在许多地方检查以下内容:
if(item.Rate == 0 || item.Rate == null) { }
Run Code Online (Sandbox Code Playgroud)
更像是一种奇怪而不是什么,检查这两种情况的最佳方法是什么?
我添加了一个辅助方法,它是:
public static bool nz(object obj)
{
var parsedInt = 0;
var parsed = int.TryParse(obj.ToString(), out parsedInt);
return IsNull(obj) || (parsed && parsedInt == 0);
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
我的问题可能听起来有点愚蠢,但每当我面对它时它都会让我感到烦恼.有什么区别:
where value.HasValue
Run Code Online (Sandbox Code Playgroud)
和
where value != null
Run Code Online (Sandbox Code Playgroud)
HasValue检查是否value为null?
例如,当我有一个可以为空的长度时,它们之间是否有任何区别
myNullableLong.HasValue
Run Code Online (Sandbox Code Playgroud)
和
myNullableLong != null
Run Code Online (Sandbox Code Playgroud)
......还是只是'语法糖'?
我想知道为什么它Nullable<T>是一个值类型,如果它被设计为模仿引用类型的行为?我理解GC压力之类的东西,但我不相信 - 如果我们想要int表现得像参考,我们可能会对所有具有真实参考类型的后果感到满意.我没有理由Nullable<T>不仅仅是盒装版本的Tstruct.
作为价值类型:
null)Equals,没有真正的问题)Nullable<Nullable<T>>不制作Nullable<T>参考类型可以解决这个问题吗?
改写和更新:
我已经修改了我的理由列表,但我的一般问题仍然是开放的:
引用类型如何Nullable<T>比当前值类型实现更糟糕?这只是GC压力和"小的,不可改变的"规则吗?它对我来说仍然很奇怪......
引自这个问题的答案.
Guid是一个值类型,因此Guid类型的变量不能为null.
如果我看到这个怎么办?
public Nullable<System.Guid> SomeProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)
我应该如何检查这是否为空?像这样?
(SomeProperty == null)
Run Code Online (Sandbox Code Playgroud)
或者像这样?
(SomeProperty == Guid.Empty)
Run Code Online (Sandbox Code Playgroud) 我在resharper中有一个规则来查找对Nullable.HasValue的调用
T? foo;
//...
if(foo.HasValue)
{}
//And it offers to replace with a comparison directly with null:
if(foo != null)
{}
Run Code Online (Sandbox Code Playgroud)
这很有效,但当遇到否定时.HasValue,结果有点奇怪.
if(!foo.HasValue) {}
//is replaced with
if(!(foo != null)) {}
Run Code Online (Sandbox Code Playgroud)
然后resharper希望我简化声明 if(foo == null)
//ideally it would automatically get to this without the extra step:
if(foo == null) {}
Run Code Online (Sandbox Code Playgroud)
该规则定义为:
type: System.ValueType or derived
nullable: expression of type System.Nullable<$type$>
search pattern:
$nullable$.HasValue
replace pattern:
$nullable$ != null
Run Code Online (Sandbox Code Playgroud)
('替换后格式'和'缩短参考'都被选中)
有没有办法可以编写这个规则,以便ReSharper智能地处理它?我尝试制定第二条规则!$nullable$.HasValue,但这会导致两条规则匹配,这使得工具提示建议看起来令人困惑:replace with == null和replace …
我知道有很多次问这样的问题.但我从来没有找到如何检查可空的bool是否为空的答案.以下是我对此的回答:
bool? nullableBool;
if (nullableBool == true){
}else if (nullableBool == false){
}else{
}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好,更直接的方式来减少无用的代码?谢谢.
我想问一个关于控制日期时间的空值的问题。
if (mydatetime != null)
Run Code Online (Sandbox Code Playgroud)
或者
if(mydatetime.hasvalue)
Run Code Online (Sandbox Code Playgroud)
哪个更好,哪个更合适,为什么?
谢谢你。
当我使用可空的DateTime序列化ac#对象时,有没有办法将空值保留在xml文件之外而不是
<EndDate d2p1:nil="true" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance" />
Run Code Online (Sandbox Code Playgroud)