Как заставить класс использовать метод получения / установки по умолчанию, когда на него ссылаются непосредственно в C #?

1

Скажем, у меня есть класс вроде

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; }
}

Так что прямые ссылки на класс будут использовать геттеры и сеттеры, а не сам класс?

Теги:
set
get
overloading

3 ответа

4
Лучший ответ

Вы можете сделать это в два этапа.

  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();
    }
    

Ознакомьтесь с инструкцией по перегрузке оператора для получения более подробной информации.

1

Перегрузите оператор +, чтобы суммы извлекали реальное значение

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

0

К сожалению, С# не реализует концепцию свойств по умолчанию, которые мы видим в 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 находит свойство по умолчанию и использует его как цель назначения.

Теперь рассмотрим тот же код в С#, который работает в одном классе:

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

Поскольку С# не знает о свойстве по умолчанию, это не скомпилируется. Используя стандартную технологию преобразования, мы можем определить оператор преобразования, который выглядит следующим образом:

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

Теперь мы можем сделать i = "Hello"; и значение myProperty, конечно, будет установлено... но myInteger поле myInteger будет myInteger инициализировано по умолчанию.

Печально то, что мы можем украсить класс С# с помощью DefaultPropertyAttribute чтобы сообщить VB.NET, какое свойство он должен использовать по умолчанию при работе с нашим классом, но мы не можем использовать эту информацию на С# без каких-либо методов отражения.

Другие ответы здесь дают обходные пути для решения конкретного случая, который вы указали, но нет решения для предоставления той же функции свойств по умолчанию, что и язык VB.NET. Если вы не хотите начать взлом в Roslyn и создать свою собственную версию С#: P

Ещё вопросы

Сообщество Overcoder
Наверх
Меню