1

我想知道属性中的“值”关键字采用什么类型。

所以:

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;

现在,正如我所料,这不会编译。“值”的类型由属性的返回类型决定,对吗?我找不到任何效果,也许它太明显了(我没有阅读语言规范,大概那里有一些东西)。

我问,因为我想使用一种类型设置属性,然后将其转换为 getter 的类型。我想这真的没有意义。

看来我必须通过创建几个方法来实现这一点。

4

4 回答 4

2

是的,“值”的类型由属性的返回类型决定。你到底想完成什么?您是否希望能够将 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(或两者)中执行从一种类型到另一种类型的转换。

于 2009-01-29T18:36:41.497 回答
2

setter 中值的类型是属性的类型 - 您不能将字符串传递给 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。

我一般不建议这样做,除非您确实需要避免定期将数字转换为字符串并将字符串转换为数字(此时您可以让设置者在评估链接值时变得懒惰 - 尽管会改变从字符串的集合到 int 的异常的语义 - 可能充其量是烦人的,或者最坏的情况是一个讨厌的错误。

于 2009-01-29T18:37:44.523 回答
0

对我来说,允许 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; }
   }
}
于 2009-01-29T19:00:57.503 回答
0

为什么不只是做

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

令我震惊的是,您无缘无故地试图狡猾。

我认为您正在尝试在更合适的方法时在这里使用属性。属性不应该有任何不可预见的副作用,这将通过对其执行类型转换(如果可能的话)。

于 2009-01-29T19:11:45.953 回答