C#中如何使用带有ref参数的?:运算符

4
我有以下类:
public class SubStredisko
{
    public string Name { get; set; }
    public string Code { get; set; }

    public VyplatnePasky VyplatnaPaska { get; set; }
    public MzdoveNaklady MzdoveNaklady { get; set; }
    public Poistne Poistne { get; set; }
}

那么我有两个SubStredisko项,其中一个明确为null。我的目的是有一个单独的方法,对SubStredisko进行一些处理,例如更改VyplatnaPaska的值等。以下是它的样子:

    private static void VyplatnePasky_Items(ref Stredisko stredisko, XElement myElement)
    {
        //some logic here
    }

我现在尝试做的事情(我遇到的问题)是使用以下方式使用?:运算符调用此方法:
VyplatnePasky_Items((sPracovisko == null) ? ref sPracovisko_Dohodari : ref sPracovisko,xElement);

然而,它用以下错误突出显示sPracovisko_DohodarisPracovisko语法错误,应为“:”。 我尝试将它们分别放在括号中,但没有成功。 我做错了什么? 附注:sPracoviskosPracovisko_DohodariSubStredisko类型。 附注2:只是一个快速的想法 - 也许我甚至不需要在这里使用ref参数?我不太确定在这种情况下是否会创建新对象,还是我将直接更改该特定对象的值(在我的void中)。

2
VyplatnePasky_Items 方法中,你是否给 stredisko 赋了一个新值?如果没有,即使你正在为该 stredisko 的属性分配新值,你也不需要使用 ref。 - Hans Kesting
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Corak
有两个问题。首先,如果sPracoviskosPracovisko_Dohodari都是Stredisko类型,您现在可以使用C# 7的三元运算符:VyplatnePasky_Items(ref (sPracovisko == null ? ref sPracovisko_Dohodari : ref sPracovisko), xElement)。然而,更一般的问题是,您说这些类型是SubStredisko而不是Stredisko,除非它们匹配确切的类型,否则无法通过引用传递类型。请参见此处以获取解释。 - Glenn Slayden
4个回答

4

您不能将表达式用作ref参数。您需要进行两个调用:

if (sPracovisko == null) {
  VyplatnePasky_Items(ref sPracovisko_Dohodari, xElement);
} else {
  VyplatnePasky_Items(ref sPracovisko, xElement);
}

感谢您的回答。另一个问题(附言2) - 我是否真的需要在这里使用 ref 参数?如果没有 ref,会创建一个新对象吗? - Robert J.
@RobertJ.:如果您不打算在方法内部为sPracovisko_Dohodari/sPracovisko变量分配任何值,则只需要ref参数。没有ref关键字,参数按值发送,这意味着引用类型作为对象引用的副本发送。您仍然可以更改对象中的内容。 - Guffa
请查看我上面的评论。使用C# 7,您现在可以在三元运算符中使用refref T a = ref (i == 0 ? ref b : ref c);。(在此示例中,r-value也可以传递到需要ref的函数中,而无需分配给ref-local)。 - Glenn Slayden
顺便提一下,它也可以作为l-value使用(https://dev59.com/rXA75IYBdhLWcg3waIMJ#50672315),即在赋值的左侧。 - Glenn Slayden

2

正如@GlennSlayden在评论中提到的那样,您可以使用C# 7 / VS2017中的ref,并使用以下语法来使用?:(三元条件运算符):

int a = 1;
int b = 2;
bool condition = true;

ref int i = ref (condition ? ref a : ref b);

1
< p > ref 参数必须是一个变量。它不能是你试图做的三元表达式。你可以这样做代替:

var inputParameter = sPracovisko == null ? sPracovisko_Dohodari : sPracovisko;
VyplatnePasky_Items(ref inputParameter, xElement);

请注意,使用上述代码,更改将反映在inputParamter上,不会影响其他两个变量。如果您想更改变量本身,则请使用@Guffa的答案。

我考虑过这种方法,但在这种情况下,我们不是要在内存中创建一个额外的对象吗?这将在循环中完成,因此我希望尽量减少内存消耗。 - Robert J.
2
@RobertJ. 不,你并没有创建额外的对象。SubStredisko是一个类;因此,它是一种_引用类型_,这意味着它只是引用同一个对象。 - Eren Ersönmez

0

试试这个

VyplatnePasky_Items(((sPracovisko == null) ? ref sPracovisko_Dohodari :   sPracovisko),xElement);

或者

VyplatnePasky_Items(((sPracovisko == null) ? ref sPracovisko_Dohodari :   sPracovisko) out,xElement);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接