[英]Condition-depending property assignment
最近,我正在重写一些旧代码,尤其是缩小太长的功能(减少开销,扩展可读性等)。 因此,我为实际起作用的东西而苦恼:
public abstract class BaseClass {
public string BaseProperty { get; set; }
}
public sealed class ClassA : BaseClass {
public string PropertyA { get; set; }
}
public sealed class ClassB : BaseClass {
public string PropertyB { get; set; }
}
ClassA a = null;
ClassB b = new ClassB();
(a == null ? (BaseClass)b : a).BaseProperty = "What would Jon Skeet think about this?";
Console.WriteLine(b.BaseProperty);
What would Jon Skeet think about this?
有人可以向我解释这是如何工作的吗? 这是什么法术? 当然,我可以用它们共享一个公共基类的方式来处理这两个实例,但是我只将其中一个强制转换为基类,并且根据条件进行属性分配。 另外,这被认为是一种好的做法吗?或者我是否看不到任何重大的缺点?
您正在使用条件运算符(?)类同这更redable if
:
if (a == null)
b.BaseProperty = "...";
else
a.BaseProperty = "...";
Console.WriteLine(b.BaseProperty);
此代码中的演员表
(a == null ? (BaseClass)b : a).BaseProperty = "..."
仅需要此操作是因为条件运算符需要知道类型。 这两个条件表达式的类型必须一致。
因此,我认为这是不好的做法,因为不清楚您在做什么。
为什么需要BaseClass
为BaseClass
:C#5.0规范的相关部分为7.14,条件运算符为:
?:运算符的第二和第三操作数x和y控制条件表达式的类型。
因此,由于在ClassA
和ClassB
之间没有隐式转换(它们具有相同的基类),因此您必须手动转换它。
(a == null ? (BaseClass)b : a)
是
BaseClass x = null;
if(a == null)
x = (BaseClass)b;
else
x = (BaseClass)a; // Here is implicit cast to the type of the second argument of ? operator
return x;
有人可以向我解释这是如何工作的吗?
当然-这只是一个使用条件运算符的表达式,用于选择在表达式的其余部分中使用哪个值。 表达式的整体类型为BaseClass
因为这是第二个操作数的确切类型,第三个操作数可以转换为该类型。 您需要对其中一个操作数进行强制转换,因为表达式的整体类型必须是第二个操作数的类型或第三个操作数的类型……但是ClassA
和ClassB
都不适合。
另外,这被认为是一种好的做法吗?或者我是否看不到任何重大的缺点?
好吧,对我来说看起来很丑。 我将改用null-coalescing运算符,并将其提取到一个单独的局部变量中以清楚显示:
BaseClass target = a ?? (BaseClass) b;
target.BaseProperty = "Jon Skeet prefers this approach";
你仍然可以做到这一点在一个声明中,但我发现,不易阅读:
(a ?? (BaseClass) b).BaseProperty = "Jon Skeet doesn't like 'clever' code.";
更好的方法是将a
或b
声明为BaseClass
类型,此时您不需要强制转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.