Скажем, у меня есть класс вроде
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; }
}
Так что прямые ссылки на класс будут использовать геттеры и сеттеры, а не сам класс?
Вы можете сделать это в два этапа.
Перегрузка + operator
для вашего класса
public static SecretInt operator +(SecretInt s1, SecretInt s2)
{
var s = new SecretInt();
s.secret = s1.secret + s2.secret;
return s;
}
Затем переопределите метод ToString
:
public override string ToString()
{
return this.secret.ToString();
}
Ознакомьтесь с инструкцией по перегрузке оператора для получения более подробной информации.
Перегрузите оператор +, чтобы суммы извлекали реальное значение
http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx
К сожалению, С# не реализует концепцию свойств по умолчанию, которые мы видим в 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