Каков тип зарезервированного слова 'value' в свойствах C # - PullRequest
1 голос
/ 29 января 2009

Мне интересно, какой тип ключевого слова value в свойстве принимает.

так:

public class Test
{
    string _numberAsString;
    int _number = -1;

    public Test() {}

    public string NumberAsString
    {
        get { return _numberAsString; }
        set { _numberAsString= value; }
    }

    public int Number
    {
        get { return int.Parse(_numberAsString); }
        set { _number = value; }
    }
}

//elsewhere
Test t = new Test();
t.Number = 5;

Теперь, это не компилируется, как я ожидал. Тип 'value' определяется типом возвращаемого свойства, это правильно? Я не мог найти что-либо на этот счет, возможно, это слишком очевидно (я не читал спецификации языка, возможно, там что-то есть).

Я спрашиваю, потому что я хотел бы установить свойство с типом, который затем преобразуется в тип получателя. Я полагаю, это не имеет смысла.

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

Ответы [ 4 ]

2 голосов
/ 29 января 2009

Тип значения в установщике - это тип свойства - вы не можете передать строку свойству, которое является int, это должно быть сначала проанализировано в int.

Строки в .net нельзя привести к какому-либо другому типу (так, как допускают perl, awk и многие другие динамические языки), их можно рассматривать только как строку или как объект родительского класса.

Вы можете сделать следующее:

private int _number;
private string  _numberAsString;

public string NumberAsString
{
    get { return _numberAsString; }
    set { LinkedSet(value); }
}

public int Number
{
    get { return _number; }
    set { LinkedSet(value); }
}


private void LinkedSet(string s)
{
    this._number = int.Parse(s);
    this._numberAsString = s;
}  

private void LinkedSet(int i)
{
    this._numberAsString = i.ToString();
    this._number = i;
}  

очевидно, что установщик NumberAsString может выдать исключение FormatException, которое установщик Number не может.

Я не рекомендую это вообще, хотя, если вам действительно не нужно регулярно преобразовывать число в строку, а строку в число (в этот момент вы можете заставить сеттеры лениться в их оценка связанного значения - хотя и изменяющая семантику исключения от набора строк до получения int - может быть в лучшем случае раздражающей или в худшем случае неприятной ошибкой.

2 голосов
/ 29 января 2009

Да, тип 'value' определяется типом возвращаемого свойства. Что именно вы пытаетесь достичь? Хотите ли вы установить для Number или NumberAsString действительное значение и получить результат обратно из любого свойства?

Если это так, вам нужно сделать что-то вроде этого:

public class Test
{
   string _numberAsString;
   int _number = -1;

   public Test() {}
   public string NumberAsString
   {
       get { return _numberAsString; }
       set { _numberAsString= value; }
   }
   public int Number
   {
       get { return int.Parse(_numberAsString); }
       set { _numberAsString = value.ToString(); }
   }
}

Это позволит вам сделать это:

Test t = new Test();
t.Number = 5;
Console.WriteLine(t.NumberAsString); // should print out "5"
t.NumberAsString = "5";
Console.WriteLine(t.Number); // should print out "5"

У вас не может быть get и set для свойства, которое принимает разные типы. Единственный вариант, который у вас есть, - это сохранить его как один тип, а затем в get или set (или в обоих) выполнить преобразование из одного типа в другой.

0 голосов
/ 29 января 2009

Почему бы просто не сделать

Test t = new Test();
t.Number = 5;
Console.WriteLine(t.Number.ToString());

Меня поражает, что вы пытаетесь быть хитрым без реальной причины.

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

0 голосов
/ 29 января 2009

Мне не имеет смысла разрешать установщик для NumberAsString.

Почему не это?:

public class Test
{
   int _number = -1;

   public Test() {}
   public string NumberAsString
   {
       get { return _number.ToString(); }
   }
   public int Number
   {
       get { return _number; }
       set { _number= value; }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...