现在 C# 中是否有任何速记可以减少以下代码:
var testVar1 = checkObject();
if (testVar1 != null)
{
testVar2 = testVar1;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果从 CheckObject() 结果中 testVar1 不为空,则只想分配 testVar2(testVar2 有一个将触发代码的设置器)。试图思考如何使用空合并的东西,但没有真正解决。
添加到此 testVar2 的 setter 上有要触发的代码,因此如果值为 null,则不要将 testVar2 设置为任何内容。
public MyObj testVar2
{
get { return _testVar2; }
set
{
_testVar2 = value;
RunSomeCode();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一堆字符串我需要使用.Trim(),但它们可以为null.如果我可以做的事情会更简洁:
string endString = startString !?? startString.Trim();
Run Code Online (Sandbox Code Playgroud)
如果左侧的部分为非null,则基本上返回右侧的部分,否则只返回空值.我最后使用了三元运算符,但是为了这个目的,无论如何都要使用null-coalescing运算符?
我希望接下来的三行代码是相同的:
public static void TestVarCoalescing(DateTime? nullableDateTime)
{
var dateTimeNullable1 = nullableDateTime.HasValue ? nullableDateTime : DateTime.Now;
var dateTimeNullable2 = nullableDateTime != null ? nullableDateTime : DateTime.Now;
var dateTimeWhatType = nullableDateTime ?? DateTime.Now;
}
Run Code Online (Sandbox Code Playgroud)
在所有情况下,我都分配nullableDateTime给新变量.我希望所有变量的类型都成为,DateTime?因为那是类型nullableDateTime.但令我惊讶的是,这种类型dateTimeWhatType只是变成了DateTime,所以不可空.
更糟糕的是,ReSharper建议用空合并表达式替换第二个语句,将其转换为表达式3.因此,如果我让ReSharper执行它的操作,变量的类型将从更改DateTime?为DateTime.
事实上,让我们说在方法的其余部分,我会使用
if (someCondition) dateTimeNullable2 = null;
Run Code Online (Sandbox Code Playgroud)
那会编译得很好,直到我让ReSharper用空合并版本替换第二个表达式.
AFAIK,取代
somevar != null ? somevar : somedefault;
Run Code Online (Sandbox Code Playgroud)
同
somevar ?? somedefault;
Run Code Online (Sandbox Code Playgroud)
应该确实产生相同的结果.但是对于可空类型的隐式类型,编译器似乎威胁??就像它意味着一样.
somevar != null ? somevar.Value : somedefault;
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是为什么隐藏类型在我使用时会被更改??,而且在文档中我可以找到关于此的信息. …
或者我该如何使这个东西工作?
我有一个Interval对象:
class Interval(Base):
__tablename__ = 'intervals'
id = Column(Integer, primary_key=True)
start = Column(DateTime)
end = Column(DateTime, nullable=True)
task_id = Column(Integer, ForeignKey('tasks.id'))
@hybrid_property #used to just be @property
def hours_spent(self):
end = self.end or datetime.datetime.now()
return (end-start).total_seconds()/60/60
Run Code Online (Sandbox Code Playgroud)
一个任务:
class Task(Base):
__tablename__ = 'tasks'
id = Column(Integer, primary_key=True)
title = Column(String)
intervals = relationship("Interval", backref="task")
@hybrid_property # Also used to be just @property
def hours_spent(self):
return sum(i.hours_spent for i in self.intervals)
Run Code Online (Sandbox Code Playgroud)
当然,添加所有典型的设置代码.
现在,当我尝试做 session.query(Task).filter(Task.hours_spent > 3).all()
我NotImplementedError: <built-in function getitem> …
问候我今天正在做一些懒惰的初始化代码,并且想到为什么不使用null-coalescing运算符来执行此操作,它更短,但后来我认为这样做有任何开销或额外成本.
下面是简化的示例代码,显示了一个用于延迟初始化的更常见的表单,然后是一个使用null-coalescing运算符的表单.它们具有完全相同的结果,并且看起来相同.我的第一个想法是,在创建对象之后,现在可以使用它自己进行额外的赋值??.这是一个非问题,编译器/ JIT优化了一些如何,是否有一些更邪恶的事情,你应该永远不要做懒惰的初始化??,或者它是完全安全的,没有坏mojo可以来自它.
private MyLazyObject _lazyObject;
public MyLazyObject GetMyLazyObjectUsingMoreCommonMethod()
{
if (_lazyObject != null)
return _lazyObject;
_lazyObject = new MyLazyObject();
return _lazyObject;
}
public MyLazyObject GetMyLazyObjectUsingNullCoalescingOpMethod()
{
_lazyObject = _lazyObject ?? new MyLazyObject();
return _lazyObject;
}
Run Code Online (Sandbox Code Playgroud) 以下代码中是否存在可能导致a的竞争条件NullReferenceException?
- 要么 -
Callback在空合并运算符检查空值之后但在调用函数之前,是否可以将变量设置为null?
class MyClass {
public Action Callback { get; set; }
public void DoCallback() {
(Callback ?? new Action(() => { }))();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
这是一个出于好奇而产生的问题.我通常不会这样编码.
我并不担心Callback变量变得陈旧.我担心会Exception被抛出DoCallback.
编辑#2
这是我的班级:
class MyClass {
Action Callback { get; set; }
public void DoCallbackCoalesce() {
(Callback ?? new Action(() => { }))();
}
public void DoCallbackIfElse() {
if (null != Callback) Callback();
else new Action(() => { })();
}
} …Run Code Online (Sandbox Code Playgroud) .net c# multithreading thread-safety null-coalescing-operator
我最近在使用Json.NET将JSON解析为动态对象时发现了null-coalescing运算符的问题.假设这是我的动态对象:
string json = "{ \"phones\": { \"personal\": null }, \"birthday\": null }";
dynamic d = JsonConvert.DeserializeObject(json);
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用?? 运算符在d的一个字段上,它返回null:
string s = "";
s += (d.phones.personal ?? "default");
Console.WriteLine(s + " " + s.Length); //outputs 0
Run Code Online (Sandbox Code Playgroud)
但是,如果我将动态属性分配给字符串,那么它工作正常:
string ss = d.phones.personal;
string s = "";
s += (ss ?? "default");
Console.WriteLine(s + " " + s.Length); //outputs default 7
Run Code Online (Sandbox Code Playgroud)
最后,当我输出Console.WriteLine(d.phones.personal == null)它时True.
我已经在Pastebin上对这些问题进行了广泛的测试.
有几种语言可以提供默认或逻辑或分配机制:
a = b || c;
a = b or c
a="${b:-$c}"
a = b ? b : c;
Run Code Online (Sandbox Code Playgroud)
到目前为止,我在Powershell Core中找到的唯一等价物是非常冗长:
$a = if ($b) { $b } else { $c }
Run Code Online (Sandbox Code Playgroud)
在某些情况下必须成为
$a = if ($b -ne $null) { $b } else { $c }
Run Code Online (Sandbox Code Playgroud)
有没有更好的选择[编辑:],这不会牺牲可读性?
powershell ternary-operator null-coalescing-operator powershell-core
有没有办法只在分配的值不是 None 时才进行分配,否则什么都不做?
我们当然可以这样做:
x = get_value() if get_value() is not None
Run Code Online (Sandbox Code Playgroud)
但这将读取该值两次。我们可以将它缓存到一个局部变量中:
v = get_value()
x = v if v is not None
Run Code Online (Sandbox Code Playgroud)
但现在我们为一件简单的事情做了两个陈述。
我们可以写一个函数:
def return_if_not_none(v, default):
if v is not None:
return v
else:
return default
Run Code Online (Sandbox Code Playgroud)
然后做x = return_if_not_none(get_value(), x)。但是肯定已经有一个 Python 习惯用法可以实现这一点,无需访问x或get_value()两次,也无需创建变量?
换句话说,假设=??是一个类似于C# null 合并运算符的 Python 运算符。与 C# 不同??=,我们虚构的运算符检查右侧是否为None:
x = 1
y = 2
z = None
x =?? y …Run Code Online (Sandbox Code Playgroud) PHP 8.0 引入了 nullsafe 运算符,可以像这样使用$foo?->bar?->baz;。Undefined property: stdClass::$first_name我有一个在 php 8.1 上运行的代码示例,即使它使用 nullsafe 运算符,也会引发错误:
$reference = (object) $reference; // Cast of array to object
return [
'FirstName' => $reference?->first_name,
];
Run Code Online (Sandbox Code Playgroud)
为了解决该错误,我必须使用空合并运算符:
$reference = (object) $reference; // Cast of array to object
return [
'FirstName' => $reference->first_name ?? null,
];
Run Code Online (Sandbox Code Playgroud)
为什么 nullsafe 运算符在这种情况下会抛出错误?
c# ×6
python ×2
.net ×1
dynamic ×1
implicit ×1
json ×1
json.net ×1
null ×1
nullsafe ×1
php ×1
powershell ×1
python-3.x ×1
resharper ×1
shorthand ×1
sqlalchemy ×1