自从这个概念在.net 2.0中引入以来,我一直在寻找一些很好的指导.
为什么我要在c#中使用不可为空的数据类型?(一个更好的问题是为什么我不能默认选择可空类型,只有在明确有意义时才使用非可空类型.)
在其非可空对等体上选择可空数据类型是否会产生"重大"性能影响?
我更喜欢检查我的值而不是Guid.empty,string.empty,DateTime.MinValue,<= 0等,并且通常使用可空类型.而且我不经常选择可空类型的唯一原因是我脑后的痒感使我觉得它不仅仅是向后兼容性而是强迫额外的'?' 要明确允许空值的字符.
是否有人总是(最常见的)选择可空类型而不是非可空类型?
谢谢你的时间,
我在很多采访中一再被问到以下问题......但仍然无法用一个简单的例子来解释它们......
有什么建议?
我试图序列化一个类的几个数据成员是Nullable对象,这里是一个例子
[XmlAttribute("AccountExpirationDate")]
public Nullable<DateTime> AccountExpirationDate
{
get { return userPrincipal.AccountExpirationDate; }
set { userPrincipal.AccountExpirationDate = value; }
}
Run Code Online (Sandbox Code Playgroud)
但是在运行时我得到了错误
无法序列化System.Nullable`1 [System.DateTime]类型的成员'AccountExpirationDate'.XmlAttribute/XmlText不能用于编码复杂类型.
但是我检查过Nullable是一个SerializableAttribute.我究竟做错了什么?
我需要添加许多类型为nullable int的变量.我使用了空合并运算符将它降低到每行一个变量,但我感觉有更简洁的方法来做到这一点,例如我不能以某种方式将这些语句链接在一起,我已经在其他之前看到过码.
using System;
namespace TestNullInts
{
class Program
{
static void Main(string[] args)
{
int? sum1 = 1;
int? sum2 = null;
int? sum3 = 3;
//int total = sum1 + sum2 + sum3;
//int total = sum1.Value + sum2.Value + sum3.Value;
int total = 0;
total = total + sum1 ?? total;
total = total + sum2 ?? total;
total = total + sum3 ?? total;
Console.WriteLine(total);
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想要的是:
@Embedded(nullable = false)
private Direito direito;
Run Code Online (Sandbox Code Playgroud)
但是,正如您所知,@ Embeddable没有这样的属性.
有没有正确的方法来做到这一点?我不想要解决方法.
所以我有一些代码在方法之间传递这个匿名对象:
var promo = new
{
Text = promo.Value,
StartDate = (startDate == null) ?
new Nullable<DateTime>() :
new Nullable<DateTime>(DateTime.Parse(startDate.Value)),
EndDate = (endDate == null) ?
new Nullable<DateTime>() :
new Nullable<DateTime>(DateTime.Parse(endDate.Value))
};
Run Code Online (Sandbox Code Playgroud)
接收此匿名对象类型的方法将其类型声明为dynamic:
private static bool IsPromoActive(dynamic promo)
{
return /* check StartDate, EndDate */
}
Run Code Online (Sandbox Code Playgroud)
在运行时,然而,如果StartDate或者EndDate被设定为new Nullable<DateTime>(DateTime.Parse(...)),接收到该方法dynamic的对象(命名promo)执行这样的:
if (promo.StartDate.HasValue && promo.StartDate > DateTime.Today ||
promo.EndDate.HasValue && promo.EndDate < DateTime.Today)
{
return;
}
Run Code Online (Sandbox Code Playgroud)
它引发了一个异常:
Server Error in '/' …Run Code Online (Sandbox Code Playgroud) 在线:bool travel = fill.travel.Value;我收到以下错误:
可以为空的对象必须具有值
而且我不确定为什么.我想要做的就是获取当前错误的旅行数据库中的值.任何帮助,将不胜感激.
using (var db = new DataClasses1DataContext())
{
var fill = (from f in db.expenseHdrs
where f.rptNo == getPkRowReport()
select f).FirstOrDefault();
txtReportDesc.Text = fill.description;
txtPeriod.Text = fill.period;
txtPurpose.Text = fill.purpose;
bool travel = fill.travel.Value;
chkTravel.Checked = travel
}
Run Code Online (Sandbox Code Playgroud) 我是C#的新手,在探索语言功能时,我遇到了一些奇怪的事情:
struct Foo
{
public Foo Identity() { return this; }
public static void Bar(Foo? foo)
{
Foo foo1 = foo?.Identity().Value; // Does not compile
Foo foo2 = (foo?.Identity()).Value; // Compiles
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么需要括号?
我看过这个问题,但还有几个关于assert关键字用法的问题。我正在与其他一些编码人员讨论如何使用assert. 对于此用例,有一种方法可以在满足某些先决条件时返回 null。我编写的代码调用该方法,然后断言它不返回 null,并继续使用返回的对象。
例子:
class CustomObject {
private Object object;
@Nullable
public Object getObject() {
return (object == null) ? generateObject() : object;
}
}
Run Code Online (Sandbox Code Playgroud)
现在想象我像这样使用它:
public void useObject(CustomObject customObject) {
object = customObject.getObject();
assert object != null;
// Do stuff using object, which would throw a NPE if object is null.
}
Run Code Online (Sandbox Code Playgroud)
有人告诉我应该删除assert,它们不应该用于生产代码,只能用于测试。真的吗?
我正在序列化这样的类
public MyClass
{
public int? a { get; set; }
public int? b { get; set; }
public int? c { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所有类型都可以为空,因为我希望在序列化此类对象时存储最少的数据.但是,当它仅使用"a"进行序列化时,我得到以下xml
<MyClass ...>
<a>3</a>
<b xsi:nil="true" />
<c xsi:nil="true" />
</MyClass>
Run Code Online (Sandbox Code Playgroud)
如何将此设置为仅获取非null属性的xml?期望的输出将是
<MyClass ...>
<a>3</a>
</MyClass>
Run Code Online (Sandbox Code Playgroud)
我想排除这些空值,因为会有几个属性,这是存储在数据库中(是的,这不是我的调用)所以我想保持未使用的数据最小.