代码之家  ›  专栏  ›  技术社区  ›  nicodemus13

C#属性中“value”保留字的类型是什么

  •  1
  • nicodemus13  · 技术社区  · 17 年前

    我想知道属性中的“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”的类型由属性的返回类型决定,对吗?我找不到任何类似的东西,也许太明显了(我还没有读过语言规范,大概里面有什么)。

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

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

    4 回复  |  直到 17 年前
        1
  •  2
  •   Scott Dorman    17 年前

    是的,“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(或两者)中执行从一种类型到另一种类型的转换。

        2
  •  2
  •   ShuggyCoUk    17 年前

    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设置器可以抛出Numbersetter不能抛出的FormatException。

    我一般不建议这样做,除非你 真正地 需要避免定期将数字转换为字符串并将字符串转换为数字(此时,您可以使设置器在评估链接值时变得懒惰——尽管将异常的语义从字符串的on集更改为int的on get——这可能充其量是令人讨厌的,最坏的情况是一个令人讨厌的错误。

        3
  •  0
  •   steve_c    17 年前

    为什么不直接做呢

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

    我突然想到,你无缘无故地耍花招。

    我认为你试图在这里使用一个属性,而一种方法更合适。属性不应该有任何不可预见的副作用,这可以通过对其执行类型转换来实现(如果可能的话)。

        4
  •  0
  •   Chris Martin    17 年前

    在我看来,在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; }
       }
    }
    
    推荐文章