C# 在新的非空测试中使用ref原则

C# 在新的非空测试中使用ref原则,c#,notnull,c#-8.0,C#,Notnull,C# 8.0,我不知道它的确切名称,但现在我将它称为“非空测试”。在C#8中,有一种新的行为允许测试对象是否为空,例如: Foo-Foo=new-Foo(); if(foo是{}) { //foo不是空的 } 还可以从此对象提取属性: 公共类Foo { 公共整型条{get;set;} } Foo-Foo=新的Foo(); if(foo是{Bar:var-Bar}) { //Foo不为null,并且bar包含Foo实例的属性值 } 到目前为止还不错,但我认为它类似于这样: public bool GetBa

我不知道它的确切名称,但现在我将它称为“非空测试”。在C#8中,有一种新的行为允许测试对象是否为空,例如:

Foo-Foo=new-Foo();
if(foo是{})
{
//foo不是空的
}
还可以从此对象提取属性:

公共类Foo
{
公共整型条{get;set;}
}
Foo-Foo=新的Foo();
if(foo是{Bar:var-Bar})
{
//Foo不为null,并且bar包含Foo实例的属性值
}
到目前为止还不错,但我认为它类似于这样:

public bool GetBar(Foo-Foo,out-int-bar)
{
if(foo为空)
{
返回false;
}
巴=foo.bar;
返回true;
}
它将被用作类似这样的东西:

Foo-Foo=new-Foo();
if(GetBar(foo,out var bar))
{
//Foo不为null,并且bar包含Foo实例的属性值
}
现在我的实际问题是:有没有任何方法可以使用ref的行为?看起来是这样的:

if(foo是{Bar:ref-var-Bar})
{
//Foo不为null,并且bar包含Foo实例的属性值
}

如果不存在,我会理解,因为
out ref
也不存在。那么,有什么方法可以做到这一点,或者有什么方法可以反对吗?

您使用的模式是来自C#8的属性模式

属性模式使您能够匹配所检查对象的属性

如果我没有弄错您的问题,您不仅希望获得属性值,而且希望能够在匹配的对象中更改该值

if (foo is { Bar: ref var bar })
{
    bar = 42; // now foo.Bar is 42 too
}
为了使
ref
语义工作,它必须得到语言和编译器的支持


但是,C#不允许将
ref
与属性一起使用,这对于任何C#版本都是如此。原因很明显:get set属性
Bar
(与任何其他C#属性一样)将被编译为两种方法:
get#Bar
set#Bar
。所以实际上你有一个方法,而不是一个值-因此,你不能
ref
一个方法返回的值(好的,有
ref-return
s,但这些不适用于属性getter)。

据我所知,{}的符号表示“某个对象”。对象没有引用变量的概念。ref关键字用于函数参数。所以答案应该是noWell,我只是用ref作为一个例子,为了澄清我的意思。谢谢你的解释,我想它至少可以处理字段,但我一般都会遇到这个问题。