【问题标题】:Any Visual Basic 'With' analog in C#? [duplicate]C# 中的任何 Visual Basic 'With' 模拟? [复制]
【发布时间】:2011-05-12 06:46:27
【问题描述】:

可能重复:
C# equivalent for Visual Basic keyword: 'With' ... 'End With'?

VB.NET

With Alpha.Beta.Gama.Eta.Zeta
    a = .ZetaPropertyA
    b = .ZetaPropertyB
    c = .ZetaPropertyC
End With

C#?

a = Alpha.Beta.Gama.Eta.Zeta.ZetaPropertyA
b = Alpha.Beta.Gama.Eta.Zeta.ZetaPropertyB  
c = Alpha.Beta.Gama.Eta.Zeta.ZetaPropertyC

【问题讨论】:

  • 不,使用的是实现IDisposeable的类。
  • 我在一英里外就能闻到Alpa.Beta.Gama.Eta.Zeta.ZetaPropertyA。如果您必须跨越这么多关系来设置属性,那么您的架构可能有问题。
  • spender:或具有树状对象结构的映射器。
  • @spender - 这被称为得墨忒耳法则:en.wikipedia.org/wiki/Law_of_Demeter
  • @spender: GlobalProperties.Application.User.CurrentUser.TextOptions.WelcomeFontColor

标签: c# .net vb.net c#-4.0 vb.net-to-c#


【解决方案1】:

不,不存在。

虽然你可以缩短一点:

var z = Alpha.Beta.Gama.Eta.Zeta;

z.ZetaPropertyA = a;
z.ZetaPropertyB = b; 
z.ZetaPropertyC = c;

对于您的其他情况:

var z = Alpha.Beta.Gama.Eta.Zeta;

a = z.ZetaPropertyA;
b = z.ZetaPropertyB;
c = z.ZetaPropertyC;

这应该很明显;)

【讨论】:

  • 我认为这是一个很好的解决方法......并不完美,但每行只有一个额外的字符。而且我一直认为 WITH 语句对于维护程序员来说可读性较差。
  • +1 不错的解决方法。你打我一拳。我同意大卫的观点:“with”是丑陋的,似乎是混淆而不是帮助!
  • 在 php 中没有像 $$var 这样的混淆。
  • 正如大卫指出的那样,每行可能有 1 个额外字符(如果算上分号,则可能是 2 个),但您也不必有“结尾”。只是想我会指出这一点,以防有人计算字符。
【解决方案2】:

对于新实例,您可以使用对象初始化器:

Alpa.Beta.Gama.Eta = new Zeta
{
    ZetaPropertyA = a, 
    ZetaPropertyB = b,
    ZetaPropertyC = c
}

【讨论】:

    【解决方案3】:

    不,C# 中没有 with 构造。

    【讨论】:

      【解决方案4】:

      Nope。解决方法是一个(短)局部变量名,而不是with。每行添加几个字符,但您仍然会得到完全限定的引用。

      【讨论】:

      • 代码更新不会改变任何东西。您仍然可以向除ZetaXXX 之外的所有内容声明var 并按照上述说明进行操作。
      • 如果“With”表达式属于类类型,其效果类似于使用具有短名称的局部变量。但是,如果表达式是可变结构,则没有直接等价物。匹配“With MyPoints(I,J) : MyPoints = SomeOtherArray : I=someOtherValue : J=someOtherValue : .X=5 : .Y=9 : End With”的语义需要制作 MyPoints、I 和 J 的本地副本,或使用其他技巧来获取参考。
      【解决方案5】:

      抱歉,C# 没有。 @Jakub 建议的对象初始化器可能会提供替代方案,或者:

      如果你自己设计Zeta,你可以使用fluent interface设计模式。这将允许您这样做:

      Alpha.Beta.Gama.Eta.Zeta
          .SetPropertyA(A)
          .SetPropertyB(B)
          .SetPropertyC(C);
      

      这与您想要的很接近,但会牺牲其他地方的大量工作。请记住,流畅的界面并不总是最好的设计选择。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-28
        • 2015-11-19
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        相关资源
        最近更新 更多