c#?:带ref参数的运算符
我有以下课程:c#?:带ref参数的运算符,c#,logical-operators,C#,Logical Operators,我有以下课程: 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;
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_Dohodari
和sPracovisko
,并出现以下错误:语法错误,':'预期的
我试着把它们分别放在括号里,但是运气不好。
我做错了什么
p.S.sPracovisko
和sPracovisko_Dohodari
属于SubStredisko
类型
p.S.2:快速思考一下-也许我甚至不需要这里的
ref
参数?我不确定在这种情况下是否会创建一个新对象,或者我将(在我的空白中)直接更改该特定对象的值。您不能对ref
参数使用表达式。您需要两个电话:
if (sPracovisko == null) {
VyplatnePasky_Items(ref sPracovisko_Dohodari, xElement);
} else {
VyplatnePasky_Items(ref sPracovisko, xElement);
}
ref
参数必须是变量。它不可能像您尝试的那样是三元表达式。您可以这样做:
var inputParameter = sPracovisko == null ? sPracovisko_Dohodari : sPracovisko;
VyplatnePasky_Items(ref inputParameter, xElement);
注意,使用上面的代码,更改将反映在inputparameter
上,并且不会影响其他两个变量。如果你想改变变量本身,那么就用@Guffa的答案。试试这个
VyplatnePasky_Items(((sPracovisko == null) ? ref sPracovisko_Dohodari : sPracovisko),xElement);
或
在该
VyplatnePasky_Items
方法中,是否为stredisko
指定了一个新值?如果不是,则不需要thar ref,即使您正在为该stredisko的属性分配新值。SubStredisko
是一个类(而不是结构),因此它是一个引用类型。那么,如果您只是像(sPracovisko==null)那样传递它?sPracovisko_Dohodari:sPracovisko
(没有ref
),您将能够直接操作引用对象的内容。因此不会创建“新对象”。唯一需要使用ref
关键字的是,如果您希望能够更改变量(sPracovisko
或sPracovisko\u Dohodari
)引用的对象。首先,如果sPracovisko
和sPracovisko_Dohodari
都属于Stredisko
类型,那么现在可以使用C#7使用三元运算符:VyplatnePasky_项(ref(sPracovisko==null?ref sPracovisko_Dohodari:ref sPracovisko),xElement)
。但是,更普遍的问题是,您说这些类型是SubStredisko
而不是Stredisko
,并且您不能通过引用传递类型,除非它们与确切的类型匹配。请参阅以获取解释。感谢您的回答。还有一个问题(如第2页)-我真的需要一个ref参数吗?是否会创建一个没有ref的新对象?@RobertJ:如果要将某个内容分配给方法中的sPracovisko\u Dohodari
/sPracovisko
变量,则只需要ref
参数。如果没有ref
关键字,参数将按值发送,这意味着引用类型将作为引用的副本发送到对象。您仍然可以更改对象中的内容。请参阅我上面的评论。使用C#7,现在可以在三元运算符中使用ref:ref T a=ref(i==0?ref b:ref C)代码>。(本例中的r值也可以传递到ref
-使用函数而无需分配给ref local)…顺便说一句,可以,即分配的左侧。我想到了这种方法,但是在这种情况下,我们在内存中创建了一个额外的对象,不是吗?这将在一个循环中完成,因此我希望最小化内存消耗。@RobertJ。不,您没有创建其他对象SubStredisko
是一个类;因此,它是引用类型,这意味着它只是引用同一个对象。
VyplatnePasky_Items(((sPracovisko == null) ? ref sPracovisko_Dohodari : sPracovisko) out,xElement);