【问题标题】:How to have a class use a default getter/setter when referenced directly in C#?在 C# 中直接引用时,如何让类使用默认的 getter/setter?
【发布时间】:2014-07-25 00:13:02
【问题描述】:

假设我有一个类似的课程

class SecretInt
{
    private int secret = 1;
}

我怎样才能做到这一点。

SecretInt a = new SecretInt();
SecretInt b = new SecretInt();
Console.Write(a + b);

会输出 2 吗?

有没有类似的

Class SecretInt()
{
    int secret = 1;
    get { return secret; }
    set { secret = value; }
}

所以对类的直接引用将使用 getter 和 setter 而不是类本身?

【问题讨论】:

    标签: c# get set overloading


    【解决方案1】:

    您可以分两步完成。

    1. 为你的班级重载+ operator

      public static SecretInt operator +(SecretInt s1, SecretInt s2) 
      {
         var s = new SecretInt();
         s.secret = s1.secret + s2.secret;
         return s;
      }
      
    2. 然后覆盖ToString方法:

      public override string ToString() 
      {
         return this.secret.ToString();
      }
      

    查看Operator Overloading Tutorial了解更多详情。

    【讨论】:

      【解决方案2】:

      重载 + 运算符,以便求和提取实际值

      http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx

      【讨论】:

        【解决方案3】:

        不幸的是,C# 没有实现我们在 VB.NET 或类似中看到的默认属性的概念。通常为此给出的解决方案是使用转换运算符来创建类的新实例......但是您会丢失其余的属性和状态。

        例如,这个 VB.NET 类:

        public class MyClass
            Public myNumber As Integer
            Private myString As String
            Default Property myProperty As String
                Get
                    return myString
                End Get
                Set(ByVal Value As String)
                    myString = Value
                End Set
            End Property
        End Class
        

        在 VB 中你可以这样做:

        Dim i As New MyClass
        i.myInteger = 10
        i = "Hello"
        

        VB.NET 编译器定位默认属性并将其用作赋值的目标。

        现在考虑 C# 中的相同代码,在同一个类上运行:

        var i = new MyClass();
        i.myInteger = 10;
        i = "Hello";
        

        由于 C# 不知道默认属性,因此无法编译。使用标准转换技术,我们可以定义一个如下所示的转换运算符:

        public static implicit operator MyClass(string value)
        {
            return new MyClass { myProperty = value };
        }
        

        现在我们可以执行i = "Hello"; 并且myProperty 值当然会被设置...但myInteger 字段现在将被重新初始化为默认值。

        可悲的是,我们可以用DefaultPropertyAttribute 装饰一个 C# 类来告诉 VB.NET 在使用我们的类时它应该使用哪个属性作为默认值,但是我们不能在 C# 中使用该信息而不进行一些反射技术。

        此处的其他答案提供了解决您列出的特定情况的解决方案,但没有解决方案可以提供与 VB.NET 语言相同的默认属性功能。除非您想开始在 Roslyn 上进行 hack 并创建自己的 C# 版本:P

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-31
          • 1970-01-01
          • 2014-02-19
          • 2011-06-13
          • 2010-09-26
          • 1970-01-01
          • 2011-11-03
          • 1970-01-01
          相关资源
          最近更新 更多