C #: возможно ли создать объект, который имеет значение своего «свойства по умолчанию» при ссылке? - PullRequest
1 голос
/ 03 мая 2011

Можно ли создать объект с параметром конструктора, который возвращает значение свойства при обращении, без использования точечной нотации?Вот несколько примеров:

public class myObject
{
    public string myObject {get; private set;}
    public myObject( string tempstring)
    {
        this.myObject = tempstring.ToUpper();
    }
}

var a = new myObject("somevalue");
Console.WriteLine( myObject ); // outputs the string "SOMEVALUE"

Вот еще одна попытка:

public class myInt
{
    public int myInt {get; private set;}
    public myInt(string tempInt)
    {    this.myInt = Convert.ToInt32(tempInt);
    }
}

var a = new myInt("3");
var b = a + a;   // ends up being an int datatype value of 6

Я знаю, что всегда могу сделать var b = a.myInt + a.myInt.Я думаю, я мог бы создать статический класс со статической функцией, которая каждый раз конвертирует параметр в результат, но он не поддерживал бы состояние.

Просто любопытно.Это сделало бы то, что я на самом деле пытаюсь сделать, намного менее трудным.

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

В первом случае да. Переопределить метод ToString.

public class myObject
{
    public string myValue {get; private set;}
    public myObject( string tempstring)
    {
        this.myValue = tempstring.ToUpper();
    }

    public override string ToString()
    {
        return myValue;
    }
}

Во втором случае вроде. Вы не должны пытаться перегрузить операторы, чтобы предложить неожиданное поведение Создайте метод для выполнения поведения, которое не имеет смысла при чтении кода. То, что вы предлагаете (возвращая int), определенно не должно ожидаться, что я верну int (в основном из-за var, а не строго определенного типа). Использование оператора + для возврата нового myInt объекта имело бы смысл. Используя оператор +, верните int , а не .

Вы можете перегрузить оператор + для возврата нового объекта myInt, а затем также добавить неявное приведение к int. Просто убедитесь, что это имеет смысл, и что оно читаемо.

В классе вы можете использовать:

public static implicit operator int(myInt m) 
{
    return myValue;
}

public static myInt operator +(myInt left, myInt right) 
{
    // requires constructor that takes int
    return new myInt(left.myValue + right.myValue);
}

Конечно, вы можете пойти прямым путем, но снова использовать его только тогда, когда он делает его более читабельным, а не менее (обратите внимание, точно так же, как операторы методов не могут быть перегружены просто типом возврата, поэтому вам придется выбирать между два).

public static int operator +(myInt left, myInt right) 
{
    return left.myValue + right.myValue;
}
2 голосов
/ 03 мая 2011

Как насчет неявных преобразований. Смотри http://msdn.microsoft.com/en-us/library/z5z9kes2(VS.71).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...