【问题标题】:Constructing a class in c# and referring to self在c#中构造一个类并引用self
【发布时间】:2013-07-10 12:50:19
【问题描述】:

可能是倒数第二行吗? IE。引用声明本身中的其他属性?

在我的实际代码中,A 和 B 设置为复杂的 LINQ Enumerables(这很好),而 C 可能类似于 A.Count():

class Thing {
    public int A;
    public int B;
    public int C;
}

Thing myThing = new Thing() {
    A = 1,
    B = 2,
    C = A+B
}

只是试图找到构造myThing的最有效方法。

【问题讨论】:

  • @Alex 仔细阅读帖子,在他的实际代码 A 和 B - enumerables 中
  • 要特别清楚 - 我想回答的问题是这样的事情是否可能。或者,我是否别无选择,只能在 初始化对象之后定义属性 C?
  • C总是会是A+B吗?理想情况下,您可以使 C 成为可以封装该逻辑的只读属性。

标签: c#


【解决方案1】:

考虑这个例子:

int A = 0;
int B = 0;
int C = 0;
MyThing myThing = new MyThing() {
    A = 1,
    B = 2,
    C = A + B
}

// myThing.A == 1
// myThing.B == 2
// myThing.C == 0

所以,不;这不可能。请改用其他任何答案。

【讨论】:

    【解决方案2】:

    遗憾的是,无法在对象的初始化程序中检索属性的值。

    【讨论】:

      【解决方案3】:

      我认为 A 和 B 在您可以引用它们以在 C 中使用之前不会被更新。我认为的解决方案是在创建对象之前简单地将 A 和 B 分配给变量:

      var variable1 = 1
      var variable2 = 2
      
      Thing myThing = new Thing() {
          A = variable1,
          B = variable2,
          C = variable1+variable2
      }
      

      这样您就可以确保两个变量在用于 C 之前都已更改

      编辑:“我是否别无选择,只能在初始化对象后定义属性 C?” 问题是 A 和 B 还没有初始化,所以你不能用它们来创建 C。但是如果你用另一个名字(上面例子中的变量 1 和变量 2)初始化它们,你可以继续使用获得 C 的那些值

      【讨论】:

        【解决方案4】:

        您使用的对象初始化器语法只是分配值的快捷方式,因此您可以这样做:

        Thing myThing = new Thing() {
            A = 1,
            B = 2};
        myThing.C =myThing.A + myThing.B;
        

        【讨论】:

        • 你也可以很容易地做到new Thing() { A = 1, B = 2, C = 1 + 2 };
        • 我接受了这个答案,因为 C 并不总是 A+B,但可能是 A.Count() 或其他任何东西。也感谢@James,因为他回答了这个问题 - 答案似乎是不,我正在尝试的事情是不可能的!
        • @rwalter 不确定它怎么可能是A.Count(),因为在您的示例中Aint,而不是集合。无论如何,我认为您理解它不能作为初始化程序的一部分来完成,并且有多种设置属性的方法(这是一种)。
        【解决方案5】:

        救援的属性(基于您的示例)

        class Thing {
            public IEnumerable<someType> A { get; set; }
            public IEnumerable<someType> B { get; set; }
            public int C { get { return A.Count(); } }
        }
        

        您只需要设置ABC 将基于其他两个“自行”出来。根据需要添加空检查和错误处理。事实上,C 在这个示例中根本无法设置,而且它的值取决于另一个属性(这里是A),这是正确的。

        【讨论】:

        • Enumerable 是一个静态类。
        • 我错过了类型中的“我”,已修复
        • C 会非常昂贵,因为它会在每次调用时进行迭代。
        • 这有点矫枉过正。问题只是“我能做到吗” - 答案是“”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        相关资源
        最近更新 更多