标签: null-coalescing-operator

c# if not null then assignment value的简写

现在 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)

c# null-coalescing-operator null-coalescing shorthand

15
推荐指数
2
解决办法
2万
查看次数

否定null-coalescing运算符

我有一堆字符串我需要使用.Trim(),但它们可以为null.如果我可以做的事情会更简洁:

string endString = startString !?? startString.Trim();
Run Code Online (Sandbox Code Playgroud)

如果左侧的部分为非null,则基本上返回右侧的部分,否则只返回空值.我最后使用了三元运算符,但是为了这个目的,无论如何都要使用null-coalescing运算符?

c# null-coalescing-operator

14
推荐指数
2
解决办法
1916
查看次数

在可空类型上使用coalescing null运算符更改隐式类型

我希望接下来的三行代码是相同的:

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)

所以我想我的问题是为什么隐藏类型在我使用时会被更改??,而且在文档中我可以找到关于此的信息. …

c# resharper implicit null-coalescing-operator

14
推荐指数
2
解决办法
5875
查看次数

如何在SQLAlchemy中实现空合并运算符?

或者我该如何使这个东西工作?

我有一个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> …

python sqlalchemy null-coalescing-operator

14
推荐指数
2
解决办法
1万
查看次数

有什么理由不使用null-coalescing运算符进行延迟初始化?

问候我今天正在做一些懒惰的初始化代码,并且想到为什么不使用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)

c# null-coalescing-operator lazy-initialization

13
推荐指数
2
解决办法
2119
查看次数

C#中的空合并运算符(??)是否是线程安全的?

以下代码中是否存在可能导致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

12
推荐指数
2
解决办法
1626
查看次数

Null-coalescing运算符为动态对象的属性返回null

我最近在使用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上对这些问题进行了广泛的测试.

c# json dynamic json.net null-coalescing-operator

12
推荐指数
1
解决办法
1755
查看次数

Powershell'x或y'赋值

有几种语言可以提供默认或逻辑或分配机制:

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

11
推荐指数
1
解决办法
558
查看次数

一个班轮“如果不是无则分配”

有没有办法只在分配的值不是 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 习惯用法可以实现这一点,无需访问xget_value()两次,也无需创建变量?

换句话说,假设=??是一个类似于C# null 合并运算符的 Python 运算。与 C# 不同??=,我们虚构的运算符检查右侧是否为None

x = 1
y = 2
z = None

x =?? y …
Run Code Online (Sandbox Code Playgroud)

python null-coalescing-operator python-3.x

11
推荐指数
1
解决办法
7124
查看次数

为什么我会得到 Undefined property: stdClass:: with php 8 nullsafe 运算符

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 运算符在这种情况下会抛出错误?

php null null-coalescing-operator nullsafe

11
推荐指数
1
解决办法
3979
查看次数