繁体   English   中英

与条件有关的财产分配

[英]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 = "..."

仅需要此操作是因为条件运算符需要知道类型。 这两个条件表达式的类型必须一致。

因此,我认为这是不好的做法,因为不清楚您在做什么。


为什么需要BaseClassBaseClass :C#5.0规范的相关部分为7.14,条件运算符为:

?:运算符的第二和第三操作数x和y控制条件表达式的类型。

  • 如果x具有X类型,而y具有Y类型,则
    • 如果存在从X到Y的隐式转换(第6.1节),但从Y到X不存在,则Y是条件表达式的类型。
    • 如果存在从Y到X的隐式转换(第6.1节),但是从X到Y不存在,则X是条件表达式的类型。
  • 否则,将无法确定表达式类型,并且会发生编译时错误

因此,由于在ClassAClassB之间没有隐式转换(它们具有相同的基类),因此您必须手动转换它。

 (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因为这是第二个操作数的确切类型,第三个操作数可以转换为该类型。 您需要对其中一个操作数进行强制转换,因为表达式的整体类型必须第二个操作数的类型第三个操作数的类型……但是ClassAClassB都不适合。

另外,这被认为是一种好的做法吗?或者我是否看不到任何重大的缺点?

好吧,对我来说看起来很丑。 我将改用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.";

更好的方法是将ab声明为BaseClass类型,此时您不需要强制转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM