C#2.0使我可以访问可空类型.当我希望数据库中的DateTime变量为null时,这似乎非常方便.在使用可空类型时我有什么可担心的吗?或者我可以过度使用我可以为空的每种类型?
我有:
Dim nVar1 As Long?
Dim nVar2 As Long?
Dim nVarSum As Long?
nVar1 = Nothing
nVar2 = 5
nVarSum = nVar1 + nVar2
Run Code Online (Sandbox Code Playgroud)
我希望结果以nVarSum为5结束,而不是Nothing.
我知道如果你添加一些未知值的东西,你最终会得到"somthing + unknown"或者x + 5总是等于"x + 5"而不是"5",因为你仍然带着那个未知的"x".
但是,在这种情况下,如何才能有效地将未知或Nothing视为零?
谢谢!
(基本上发生的是最终用户向我们发送数据文件,此代码解析该文件,然后将大约15个字段汇总在一起.如果用户将这些字段留空而不是为它们分配零,我需要对待它好像它对于这一个加法操作是零,但所有其余代码需要继续将其视为Nothing值,因为用户实际上没有提交零...他们提交空白或没有)
可能重复:
C# - 基本问题:什么是'?' ?
使用int16有什么好处?而不是在.net变量声明中使用int16?
dim i as int16?
dim i as int16
Run Code Online (Sandbox Code Playgroud) 这是我目前的方法,但我不时要处理这个问题,我想知道是否有更优雅的方式.
我有:long? LoadEntityId田地.我有一个方法,我用它作为参数:
private bool IsUsedInProduction(long? loadEntityId)
Run Code Online (Sandbox Code Playgroud)
问题是,当LoadEntityId我实际上是null时,我得到了Nullable object must have a value.
我现在做的是:
if ((byte)cboStatus.SelectedValue == 10
&& LoadEntityId.HasValue
&& IsUsedInProduction(LoadEntityId.Value))
Run Code Online (Sandbox Code Playgroud)
但我认为应该有更好的方法来解决这个问题.
PS
在我的解释中,我似乎不够清楚所以问题在于,如果我:
if ((byte)cboStatus.SelectedValue == 10
&& IsUsedInProduction(LoadEntityId.Value))
Run Code Online (Sandbox Code Playgroud)
(当LoadEntityId实际为null时,删除LoadEntityId.HasValue检查)我得到异常,如果我离开它 - 好吧我只是想找到一种方法让我的代码在没有这个检查的情况下工作.
在我的方法中,我想处理可空的整数值.
public String FormatValue(Int32? item)
{
if (item.HasValue==false) return "";
return item.Value.ToString("### ### ###");
}
Run Code Online (Sandbox Code Playgroud)
我们这样做没有想写Int32?,Int64?和其他版本的这种方法,所以我们要重构它来处理泛型类型参数:
public String FormatValue<T>(T item)
{
if (item.HasValue==false) return ""; // ERROR: no .HasValue property
return item.Value.ToString("### ### ###"); // ERROR: usually has no ToString() with string argument
}
Run Code Online (Sandbox Code Playgroud)
我该如何处理这种情况?我试图使用该"where T"条款,但没有任何成功.
我在一个可以为空的整数的类中创建了一个属性:
private int? submittedAge {get; set;}
Run Code Online (Sandbox Code Playgroud)
我这样做是因为用户可能会或可能不会进入年龄.稍后在应用程序中我在使用此属性之前进行检查,如果它是非null,我将它传递给需要整数的方法.
if (this.submittedAge != null)
{
result = utilityClass.GetPeopleWithMatchingAge(this.submittedAge);
}
Run Code Online (Sandbox Code Playgroud)
Intellisense给出了一个错误,说方法调用有一些无效的参数.
如果我将submittedAge属性更改回非Nullable整数,那么一切都很好.
也许我不理解可空类型的正确使用.
我正在尝试将一个转换object为一个bool类型,并希望转换bool和Nullable<bool>类型.我还想确保在可能的情况下进行适当的演员表演.所以我有以下代码:
if (value is bool)
{
boolValue = (bool) value;
}
else if (value is bool? && ((bool?)value).HasValue)
{
boolValue = ((bool?) value).Value;
}
else
{
throw new ArgumentException("Value must be a boolean type");
}
Run Code Online (Sandbox Code Playgroud)
ReSharper 2016告诉我value is bool?在if语句堆栈中总会评估为false.这是为什么?这意味着Nullable<bool>不会继承object(不可能)或value is bool将会捕获bool?.
ReSharper 2016也有可能出现错误; 我看到实现System.Windows.Controls.BooleanToVisibilityConverter.Convert几乎完全相同.我怀疑WPF核心会有这样的错误,让我相信这是ReSharper的一个问题.
我正在读回一个可空的DateTime?属性,然后以短日期格式将该值分配给字符串属性.
我可以将日期时间值转换为短日期字符串并分配给IT_Date_String属性.但是""如果IT_Date为null,我不确定如何为字符串赋值.
你如何转换日期时间?datetime时为string.empty的值?一片空白?
这是linq中的赋值:
var status_list = query_all.ToList().Select(r => new RelStatus
{
IT_Date_String = r.IT_Date.Value.ToString("yyyy-MM-dd") != null ? r.IT_Date.Value : null
}).ToList();
Run Code Online (Sandbox Code Playgroud)
以及模型中的属性:
public DateTime? IT_Date { get; set; }
public string IT_Date_String { get; set; }
Run Code Online (Sandbox Code Playgroud) 我正在编写此通用方法以从Firebase获取数据?在某些情况下,返回空值是有效的,在其他情况下是无效的,是否可以检查泛型参数是否可为空?
前
reference.obsrveObject(User.class)
Run Code Online (Sandbox Code Playgroud)
如果为null,则应抛出
reference.obsrveObject(User?.class)
Run Code Online (Sandbox Code Playgroud)
应该用空值调用onNext
fun DatabaseReference.observeSingleEvent(): Observable<DataSnapshot?> {
return Observable.create { subscriber ->
val valueEventListener = object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot?) {
subscriber.onNext(snapshot)
subscriber.onCompleted()
}
override fun onCancelled(error: DatabaseError?) {
subscriber.onError(FirebaseDatabaseThrowable(error))
}
}
addListenerForSingleValueEvent(valueEventListener)
}
}
fun <T>DatabaseReference.obsrveObject(clazz: Class<T>): Observable<T> {
return observeSingleEvent().map { snapshot ->
if (snapshot != null) {
snapshot.getValue(clazz)
}
else {
// if clazz is nullable return null
// if clazz is not nullabel throw
throw Exception("")
}
}
}
Run Code Online (Sandbox Code Playgroud) public class MyType
{
public int? MyId { get; set; }
}
MyType myType = new MyType();
myType.MyId.GetType()
Run Code Online (Sandbox Code Playgroud)
由于MyId未设置,最后一行返回一个异常(即,它为null)。在这种情况下,如何获取类型(int?或什至int)?注意,int?用作示例,变量可以具有任何类型,这只是一个简化的示例。
请注意,根据微软的说法,这应该可行:
int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32
Run Code Online (Sandbox Code Playgroud)
它确实在分配值时起作用...
编辑。
查看一些答复和评论,我想在代码中添加这些内容,我将myType.MyId作为对象传递给需要弄清楚其类型的方法。基本上,它类似于:
public void RunQuery(string sql, List<(string parameterName, object parameterValue)> parameters)
Run Code Online (Sandbox Code Playgroud)
所以myType.MyId作为parameterValue传递到RunQuery