【问题标题】:getter and setter for class in class c#c#中类的getter和setter
【发布时间】:2010-10-25 06:38:43
【问题描述】:

假设我们有一个带有属性和 getter/setter 的类 InnerClass。我们还有一个包含 InnerClass 的类 OuterClass。

例如

class InnerClass
{
    private int m_a;
    private int m_b;

    public int M_A
    {
        get
        {
             return m_a;
        }
        set
        {
             m_a = value;
        }
     }
}

class OuterClass
{
    private InnerClass innerClass
}

如何为 OuterClass 的 innerClass 成员实现正确的 getter 和 setter?

提前致谢!

【问题讨论】:

  • "set" 应该是 {m_a = value;}
  • 你已经得到了你知道的代表来修复;)

标签: c# class member setter getter


【解决方案1】:

语法不会有任何不同。就……

public InnerClass InnerClass
{
    get { return innerClass; }
    set { innerClass = value; }
}

顺便说一句,如果您在 .NET 3.5 中使用 C#,如果您只有一个简单的属性,它只是读取和写入后备存储(就像您在上面所说的那样),那么您可以使用自动属性生成功能。语法类似于抽象属性:

public InnerClass InnerClass { get; set; }

这会自动生成一个私有成员用于存储,然后在get 中读取它并在set 中写入它。

【讨论】:

    【解决方案2】:
    public InnerClass InnerClass
        {
            get
            {
                 return innerClass;
            }
            set
            {
                 innerClass = value;
            }
         }
    

    【讨论】:

      【解决方案3】:

      这取决于内部类应该如何工作。外部类可能需要“拥有”内部类,在这种情况下:

      public InnerClass InnerClass{
        get{ return innerClass; }
        set{ innerClass.CopyFrom(value); /* Pseudo method call */ }
      }
      

      通过这种方式,您可以防止外部代码操作实例,除非通过 OuterClass 显式..

      【讨论】:

      • 并非如此,因为您在 getter 中返回实例。唯一真正做到这一点的方法(这种方法有点臭......)是使用相同的 CopyFrom 方法在 getter 中返回一个新实例。
      • 我想你误会了。关键是你可以修改实例,但你必须通过OuterClass的实例显式地进行。示例 OuterClass.InnerClass foo = new OuterClass.InnerClass(); foo.M_A = 1; externalInstance.InnerClass = foo; //outerInstance.InnerClass.M_A 等于 1 foo.SomeProperty = 2; // outerInstance.InnerClass.M_A 仍然等于 1 outerInstance.InnerClass = foo; //outerInstance.InnerClass.M_A 等于 2
      【解决方案4】:

      如果您的意思是访问内部类成员而不暴露内部类本身,您可以使用以下代码。如果你只是想暴露this.innerClass,那么暴露InnerClass的字段的方式是没有区别的。

      class OuterClass
      {
          private InnerClass innerClass
      
          public int M_A
          {
              get
              {
                  if (this.innerClass != null)
                  {
                       return this.innerClass.M_A;
                  }
                  else
                  {
                      throw new InvalidOperationException();
                  }
              }
              set
              {
                  if (this.innerClass != null)
                  {
                       this.innerClass.M_A = value;
                  }
                  else
                  {
                      throw new InvalidOperationException();
                  }
              }
          }
      }
      

      【讨论】:

      • 我不确定这如何适用,除非我错过了部分问题……这就是他的要求吗?
      • 只是好奇 - 为什么你会在 getter 上抛出一个无效的操作异常?我理解您为什么要在 setter 中执行此操作,但您通常不会假设 getter 是被动的吗?
      • 我读到了问题“[...] 用于 OuterClass 的 innerClass 成员的 getter 和 setter?”附加一个“s”作为“[...] OuterClass 的内部类成员?”,但只有在完成我的回答后才重新考虑。
      • 如果 innerClass 为空,你会返回什么?在现实世界的场景中,可能会有一个很好的默认值,但我从他的问题中不知道。从 getter 获得异常的情况并不少见。
      【解决方案5】:

      最优雅的做法是使用隐式 getter 和 setter:

      class InnerClass
      {
        public int a{ get; set; }
        public int b{ get; set; }
      }
      
      class OuterClass
      {
        public InnerClass innerClass{ get; set; }
      }
      

      这隐含地等同于:

      class InnerClass
      {
          private int _a;
          public int a
          {
              get
              {
                  return _a;
              }
              set
              {
                  _a = value;
              }
          }
      
          private int _b;
          public int b
          {
              get
              {
                  return _b;
              }
              set
              {
                  _b = value;
              }
          }
      }
      
      class OuterClass
      {
          private InnerClass _innerClass;
          public InnerClass innerClass
          {
              get
              {
                  return _innerClass;
              }
              set
              {
                  _innerClass = value;
              }
          }
      }
      

      这两个定义实际上是相同的——减去了相当多的击键。在第一个示例中,编译器将在幕后实现必要的私有字段,因此您不必这样做。但是,第二个可以让您更好地控制正在发生的事情。

      【讨论】:

      • ...这与我的回答有何不同?
      • 此外,他没有说明他正在使用的 C#/.NET 版本。隐式属性仅是 .NET 3.5/C# 3.0 的一部分。
      • @Adam,对不起,当我发布我的答案时,我没有看到你的答案。我猜你是在我写答案的时候发布的。
      • 嗨@BenAlabaster,为什么不声明class InnerClass { public int a; public int b; } 没有getter 和setter?公约? (我是 csharp 新手)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 2012-03-12
      相关资源
      最近更新 更多